aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/webcore/response.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/webcore/response.zig')
-rw-r--r--src/bun.js/webcore/response.zig53
1 files changed, 45 insertions, 8 deletions
diff --git a/src/bun.js/webcore/response.zig b/src/bun.js/webcore/response.zig
index 70a44fd60..6e0f92f9c 100644
--- a/src/bun.js/webcore/response.zig
+++ b/src/bun.js/webcore/response.zig
@@ -985,6 +985,7 @@ pub const Fetch = struct {
}
const promise = promise_value.asAnyPromise().?;
+ _ = promise;
const tracker = this.tracker;
tracker.willDispatch(globalThis);
defer {
@@ -1007,15 +1008,51 @@ pub const Fetch = struct {
result.ensureStillAlive();
promise_value.ensureStillAlive();
+ const Holder = struct {
+ held: JSC.Strong,
+ promise: JSC.Strong,
+ globalObject: *JSC.JSGlobalObject,
+ task: JSC.AnyTask,
+
+ pub fn resolve(held: *@This()) void {
+ var prom = held.promise.swap().asAnyPromise().?;
+ var globalObject = held.globalObject;
+ const res = held.held.swap();
+ held.held.deinit();
+ held.promise.deinit();
+ res.ensureStillAlive();
+
+ bun.default_allocator.destroy(held);
+ prom.resolve(globalObject, res);
+ }
- switch (success) {
- true => {
- promise.resolve(globalThis, result);
- },
- false => {
- promise.reject(globalThis, result);
- },
- }
+ pub fn reject(held: *@This()) void {
+ var prom = held.promise.swap().asAnyPromise().?;
+ var globalObject = held.globalObject;
+ const res = held.held.swap();
+ held.held.deinit();
+ held.promise.deinit();
+ res.ensureStillAlive();
+
+ bun.default_allocator.destroy(held);
+ prom.reject(globalObject, res);
+ }
+ };
+
+ var holder = bun.default_allocator.create(Holder) catch unreachable;
+ holder.* = .{
+ .held = JSC.Strong.create(result, globalThis),
+ .promise = ref.strong,
+ .globalObject = globalThis,
+ .task = undefined,
+ };
+ ref.strong = .{};
+ holder.task = switch (success) {
+ true => JSC.AnyTask.New(Holder, Holder.resolve).init(holder),
+ false => JSC.AnyTask.New(Holder, Holder.reject).init(holder),
+ };
+
+ globalThis.bunVM().enqueueTask(JSC.Task.init(&holder.task));
}
pub fn checkServerIdentity(this: *FetchTasklet, certificate_info: HTTPClient.CertificateInfo) bool {