Simplify XHR lifetime

Keep this a weak reference (the default now).And rely on transfer abort to
ensure reference isn't needed after finalizer.
This commit is contained in:
Karl Seguin
2026-01-20 07:54:34 +08:00
parent 9f0c902030
commit 81378d4353
2 changed files with 1 additions and 8 deletions

View File

@@ -207,8 +207,7 @@ pub fn mapZigInstanceToJs(self: *const Local, js_obj_handle: ?*const v8.Object,
} }
try ctx.finalizer_callbacks.put(ctx.arena, @intFromPtr(resolved.ptr), .init(value)); try ctx.finalizer_callbacks.put(ctx.arena, @intFromPtr(resolved.ptr), .init(value));
if (@hasDecl(JsApi.Meta, "weak")) { if (@hasDecl(JsApi.Meta, "finalizer")) {
std.debug.assert(JsApi.Meta.weak == true);
v8.v8__Global__SetWeakFinalizer(gop.value_ptr, resolved.ptr, JsApi.Meta.finalizer.from_v8, v8.kParameter); v8.v8__Global__SetWeakFinalizer(gop.value_ptr, resolved.ptr, JsApi.Meta.finalizer.from_v8, v8.kParameter);
} }
} }

View File

@@ -154,7 +154,6 @@ pub fn send(self: *XMLHttpRequest, body_: ?[]const u8) !void {
if (self._ready_state != .opened) { if (self._ready_state != .opened) {
return error.InvalidStateError; return error.InvalidStateError;
} }
self._page.js.strongRef(self);
if (body_) |b| { if (body_) |b| {
if (self._method != .GET and self._method != .HEAD) { if (self._method != .GET and self._method != .HEAD) {
@@ -392,8 +391,6 @@ fn httpDoneCallback(ctx: *anyopaque) !void {
.total = loaded, .total = loaded,
.loaded = loaded, .loaded = loaded,
}, local, page); }, local, page);
page.js.weakRef(self);
} }
fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void { fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
@@ -401,7 +398,6 @@ fn httpErrorCallback(ctx: *anyopaque, err: anyerror) void {
// http client will close it after an error, it isn't safe to keep around // http client will close it after an error, it isn't safe to keep around
self._transfer = null; self._transfer = null;
self.handleError(err); self.handleError(err);
self._page.js.weakRef(self);
} }
pub fn abort(self: *XMLHttpRequest) void { pub fn abort(self: *XMLHttpRequest) void {
@@ -410,7 +406,6 @@ pub fn abort(self: *XMLHttpRequest) void {
transfer.abort(error.Abort); transfer.abort(error.Abort);
self._transfer = null; self._transfer = null;
} }
self._page.js.weakRef(self);
} }
fn handleError(self: *XMLHttpRequest, err: anyerror) void { fn handleError(self: *XMLHttpRequest, err: anyerror) void {
@@ -488,7 +483,6 @@ pub const JsApi = struct {
pub const name = "XMLHttpRequest"; pub const name = "XMLHttpRequest";
pub const prototype_chain = bridge.prototypeChain(); pub const prototype_chain = bridge.prototypeChain();
pub var class_id: bridge.ClassId = undefined; pub var class_id: bridge.ClassId = undefined;
pub const weak = true;
pub const finalizer = bridge.finalizer(XMLHttpRequest.deinit); pub const finalizer = bridge.finalizer(XMLHttpRequest.deinit);
}; };