From 7589b86f7d48983374dbf6071902469555fa2a33 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Tue, 28 Jan 2025 18:40:47 -0800 Subject: [PATCH] Make passing an signal: AbortSignal.timeout to fetch implicitly set timeout: false --- src/bun.js/bindings/bindings.cpp | 6 ++++++ src/bun.js/bindings/bindings.zig | 5 +++++ src/bun.js/webcore/response.zig | 11 +++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index 4a8338f6acc0..fc2329132fe2 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -5839,6 +5839,12 @@ extern "C" void JSC__JSGlobalObject__queueMicrotaskJob(JSC__JSGlobalObject* arg0 WTFMove(microtaskArgs[3])); } +extern "C" bool WebCore__AbortSignal__isTimeout(const WebCore__AbortSignal* arg0) +{ + const WebCore::AbortSignal* abortSignal = reinterpret_cast(arg0); + return abortSignal->hasActiveTimeoutTimer(); +} + extern "C" WebCore::AbortSignal* WebCore__AbortSignal__new(JSC__JSGlobalObject* globalObject) { Zig::GlobalObject* thisObject = JSC::jsCast(globalObject); diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index e04eb113b3ff..6bc8140a0aa7 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -2224,6 +2224,11 @@ pub const AbortSignal = extern opaque { pub const name = "WebCore::AbortSignal"; pub const namespace = "WebCore"; + extern fn WebCore__AbortSignal__isTimeout(*const AbortSignal) bool; + pub fn isTimeout(this: *const AbortSignal) bool { + return WebCore__AbortSignal__isTimeout(this); + } + pub fn listen( this: *AbortSignal, comptime Context: type, diff --git a/src/bun.js/webcore/response.zig b/src/bun.js/webcore/response.zig index 8ad9bb4d8ea2..04bdbddbe286 100644 --- a/src/bun.js/webcore/response.zig +++ b/src/bun.js/webcore/response.zig @@ -3006,6 +3006,17 @@ pub const Fetch = struct { return JSPromise.rejectedPromiseValue(globalThis, err); } + // If you do AbortSignal.timeout + // and you don't set `timeout: false` + // you probably meant to use the AbortSignal's timeout instead. + if (!disable_timeout) { + if (signal) |signal_| { + if (signal_.isTimeout()) { + disable_timeout = true; + } + } + } + if (globalThis.hasException()) { is_error = true; return .zero;