diff options
author | 2023-10-04 21:29:35 -0700 | |
---|---|---|
committer | 2023-10-04 21:29:35 -0700 | |
commit | b0ffe686757d5b51744e1b1af41afbc16581ca1b (patch) | |
tree | 88ec0fbc0bbc751d62f7f67b40359c340c6c2c28 | |
parent | 5da79a8366e74e921dbf752ba2a33b4308170b48 (diff) | |
download | bun-b0ffe686757d5b51744e1b1af41afbc16581ca1b.tar.gz bun-b0ffe686757d5b51744e1b1af41afbc16581ca1b.tar.zst bun-b0ffe686757d5b51744e1b1af41afbc16581ca1b.zip |
Create `AbortSignal` without JS (#6278)
* Create `AbortSignal` without JS
* Don't leak
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
-rw-r--r-- | src/bun.js/api/server.zig | 18 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 8 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.zig | 6 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/AbortSignal.h | 7 |
4 files changed, 24 insertions, 15 deletions
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig index 3fe411f39..d90c22577 100644 --- a/src/bun.js/api/server.zig +++ b/src/bun.js/api/server.zig @@ -5641,17 +5641,14 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp var body = JSC.WebCore.InitRequestBodyValue(.{ .Null = {} }) catch unreachable; ctx.request_body = body; - const js_signal = JSC.WebCore.AbortSignal.create(this.globalThis); - js_signal.ensureStillAlive(); - if (JSC.WebCore.AbortSignal.fromJS(js_signal)) |signal| { - ctx.signal = signal.ref().ref(); // +2 refs 1 for the request and 1 for the request context - } + var signal = JSC.WebCore.AbortSignal.new(this.globalThis); + ctx.signal = signal; request_object.* = .{ .method = ctx.method, .request_context = AnyRequestContext.init(ctx), .https = ssl_enabled, - .signal = ctx.signal, + .signal = signal.ref(), .body = body.ref(), }; @@ -5762,18 +5759,15 @@ pub fn NewServer(comptime NamespaceType: type, comptime ssl_enabled_: bool, comp var body = JSC.WebCore.InitRequestBodyValue(.{ .Null = {} }) catch unreachable; ctx.request_body = body; - const js_signal = JSC.WebCore.AbortSignal.create(this.globalThis); - js_signal.ensureStillAlive(); - if (JSC.WebCore.AbortSignal.fromJS(js_signal)) |signal| { - ctx.signal = signal.ref().ref(); // +2 refs 1 for the request and 1 for the request context - } + var signal = JSC.WebCore.AbortSignal.new(this.globalThis); + ctx.signal = signal; request_object.* = .{ .method = ctx.method, .request_context = AnyRequestContext.init(ctx), .upgrader = ctx, .https = ssl_enabled, - .signal = ctx.signal, + .signal = signal.ref(), .body = body.ref(), }; ctx.upgrade_context = upgrade_ctx; diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index 1e0d1c97e..9ba053a23 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -4534,6 +4534,14 @@ extern "C" void JSC__JSGlobalObject__queueMicrotaskJob(JSC__JSGlobalObject* arg0 JSC::JSValue::decode(JSValue4)); } +extern "C" WebCore::AbortSignal* WebCore__AbortSignal__new(JSC__JSGlobalObject* globalObject) +{ + Zig::GlobalObject* thisObject = JSC::jsCast<Zig::GlobalObject*>(globalObject); + auto* context = thisObject->scriptExecutionContext(); + RefPtr<WebCore::AbortSignal> abortSignal = WebCore::AbortSignal::create(context); + return abortSignal.leakRef(); +} + extern "C" JSC__JSValue WebCore__AbortSignal__create(JSC__JSGlobalObject* globalObject) { Zig::GlobalObject* thisObject = JSC::jsCast<Zig::GlobalObject*>(globalObject); diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index f274f72d7..d11017438 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -1969,6 +1969,12 @@ pub const AbortSignal = extern opaque { return cppFn("create", .{global}); } + extern fn WebCore__AbortSignal__new(*JSGlobalObject) *AbortSignal; + pub fn new(global: *JSGlobalObject) *AbortSignal { + JSC.markBinding(@src()); + return WebCore__AbortSignal__new(global); + } + pub fn createAbortError(message: *const ZigString, code: *const ZigString, global: *JSGlobalObject) JSValue { return cppFn("createAbortError", .{ message, code, global }); } diff --git a/src/bun.js/bindings/webcore/AbortSignal.h b/src/bun.js/bindings/webcore/AbortSignal.h index 6f4abf5ba..b60d2a6bf 100644 --- a/src/bun.js/bindings/webcore/AbortSignal.h +++ b/src/bun.js/bindings/webcore/AbortSignal.h @@ -45,6 +45,7 @@ class AbortSignal final : public RefCounted<AbortSignal>, public EventTargetWith public: static Ref<AbortSignal> create(ScriptExecutionContext*); WEBCORE_EXPORT ~AbortSignal(); + using NativeCallbackTuple = std::tuple<void*, void (*)(void*, JSC::EncodedJSValue)>; static Ref<AbortSignal> abort(JSDOMGlobalObject&, ScriptExecutionContext&, JSC::JSValue reason); static Ref<AbortSignal> timeout(ScriptExecutionContext&, uint64_t milliseconds); @@ -66,7 +67,7 @@ public: using Algorithm = Function<void(JSValue)>; void addAlgorithm(Algorithm&& algorithm) { m_algorithms.append(WTFMove(algorithm)); } void cleanNativeBindings(void* ref); - void addNativeCallback(std::tuple<void*, void (*)(void*, JSC::EncodedJSValue)> callback) { m_native_callbacks.append(callback); } + void addNativeCallback(NativeCallbackTuple callback) { m_native_callbacks.append(callback); } bool isFollowingSignal() const { return !!m_followingSignal; } @@ -87,8 +88,8 @@ private: void eventListenersDidChange() final; bool m_aborted { false }; - Vector<Algorithm> m_algorithms; - Vector<std::tuple<void*, void (*)(void*, JSC::EncodedJSValue)>> m_native_callbacks; + Vector<Algorithm, 2> m_algorithms; + Vector<NativeCallbackTuple, 2> m_native_callbacks; WeakPtr<AbortSignal> m_followingSignal; JSC::Strong<JSC::Unknown> m_reason; bool m_hasActiveTimeoutTimer { false }; |