From 20463a662b3f1fa2d847ff05800962ec5f7ab992 Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Mon, 8 Sep 2025 07:07:07 -0700 Subject: [PATCH] use destructor callback for FetchContext --- src/browser/fetch/fetch.zig | 23 +++++++++++++++-------- src/runtime/js.zig | 4 ++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/browser/fetch/fetch.zig b/src/browser/fetch/fetch.zig index 680f91a5..72fdb8b2 100644 --- a/src/browser/fetch/fetch.zig +++ b/src/browser/fetch/fetch.zig @@ -43,7 +43,7 @@ pub const Interfaces = .{ @import("Response.zig"), }; -const FetchContext = struct { +pub const FetchContext = struct { arena: std.mem.Allocator, js_ctx: *Env.JsContext, promise_resolver: v8.Persistent(v8.PromiseResolver), @@ -79,6 +79,17 @@ const FetchContext = struct { .url = self.url, }; } + + pub fn destructor(self: *FetchContext) void { + if (self.transfer) |_| { + const resolver = Env.PromiseResolver{ + .js_context = self.js_ctx, + .resolver = self.promise_resolver.castToPromiseResolver(), + }; + + resolver.reject("TypeError") catch unreachable; + } + } }; // https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch @@ -107,6 +118,9 @@ pub fn fetch(input: RequestInput, options: ?RequestInit, page: *Page) !Env.Promi .url = req.url, }; + // Add destructor callback for FetchContext. + try page.main_context.destructor_callbacks.append(arena, Env.DestructorCallback.init(fetch_ctx)); + try page.http_client.request(.{ .ctx = @ptrCast(fetch_ctx), .url = req.url, @@ -189,13 +203,6 @@ pub fn fetch(input: RequestInput, options: ?RequestInit, page: *Page) !Env.Promi .err = err, .source = "fetch error", }); - - const promise_resolver: Env.PromiseResolver = .{ - .js_context = self.js_ctx, - .resolver = self.promise_resolver.castToPromiseResolver(), - }; - - promise_resolver.reject(@errorName(err)) catch unreachable; } }.errorCallback, }); diff --git a/src/runtime/js.zig b/src/runtime/js.zig index d9f7c470..6eec9e61 100644 --- a/src/runtime/js.zig +++ b/src/runtime/js.zig @@ -2901,11 +2901,11 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { // An interface for types that want to have their jsDeinit function to be // called when the call context ends - const DestructorCallback = struct { + pub const DestructorCallback = struct { ptr: *anyopaque, destructorFn: *const fn (ptr: *anyopaque) void, - fn init(ptr: anytype) DestructorCallback { + pub fn init(ptr: anytype) DestructorCallback { const T = @TypeOf(ptr); const ptr_info = @typeInfo(T);