diff options
Diffstat (limited to 'src/bun.js/webcore')
-rw-r--r-- | src/bun.js/webcore/blob.zig | 29 | ||||
-rw-r--r-- | src/bun.js/webcore/body.zig | 11 | ||||
-rw-r--r-- | src/bun.js/webcore/response.zig | 30 | ||||
-rw-r--r-- | src/bun.js/webcore/streams.zig | 15 |
4 files changed, 60 insertions, 25 deletions
diff --git a/src/bun.js/webcore/blob.zig b/src/bun.js/webcore/blob.zig index 1e0720ea6..f9699cffc 100644 --- a/src/bun.js/webcore/blob.zig +++ b/src/bun.js/webcore/blob.zig @@ -1040,7 +1040,10 @@ pub const Blob = struct { break :brk result; }, .err => |err| { - return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + return JSC.JSPromise.rejectedPromiseValue( + globalThis, + err.withPath(pathlike.path.slice()).toJSC(globalThis), + ); }, } unreachable; @@ -1080,8 +1083,13 @@ pub const Blob = struct { needs_async.* = true; return .zero; } - - return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + if (comptime !needs_open) { + return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + } + return JSC.JSPromise.rejectedPromiseValue( + globalThis, + err.withPath(pathlike.path.slice()).toJSC(globalThis), + ); }, } } @@ -1110,7 +1118,10 @@ pub const Blob = struct { break :brk result; }, .err => |err| { - return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + return JSC.JSPromise.rejectedPromiseValue( + globalThis, + err.withPath(pathlike.path.slice()).toJSC(globalThis), + ); }, } unreachable; @@ -1145,7 +1156,13 @@ pub const Blob = struct { needs_async.* = true; return .zero; } - return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + if (comptime !needs_open) { + return JSC.JSPromise.rejectedPromiseValue(globalThis, err.toJSC(globalThis)); + } + return JSC.JSPromise.rejectedPromiseValue( + globalThis, + err.withPath(pathlike.path.slice()).toJSC(globalThis), + ); }, } } @@ -2289,7 +2306,7 @@ pub const Blob = struct { this.source_fd = 0; } - this.system_error = errno.toSystemError(); + this.system_error = errno.withPath(this.destination_file_store.pathlike.path.slice()).toSystemError(); return AsyncIO.asError(errno.errno); }, }; diff --git a/src/bun.js/webcore/body.zig b/src/bun.js/webcore/body.zig index bbdf21d5d..76cda1bad 100644 --- a/src/bun.js/webcore/body.zig +++ b/src/bun.js/webcore/body.zig @@ -466,7 +466,10 @@ pub const Body = struct { JSC.markBinding(@src()); switch (this.*) { - .Used, .Empty => { + .Used => { + return JSC.WebCore.ReadableStream.used(globalThis); + }, + .Empty => { return JSC.WebCore.ReadableStream.empty(globalThis); }, .Null => { @@ -493,6 +496,9 @@ pub const Body = struct { if (locked.readable) |readable| { return readable.value; } + if (locked.promise != null) { + return JSC.WebCore.ReadableStream.used(globalThis); + } var drain_result: JSC.WebCore.DrainResult = .{ .estimated_size = 0, }; @@ -1104,8 +1110,7 @@ pub fn BodyMixin(comptime Type: type) type { var body: *Body.Value = this.getBodyValue(); if (body.* == .Used) { - // TODO: make this closed - return JSC.WebCore.ReadableStream.empty(globalThis); + return JSC.WebCore.ReadableStream.used(globalThis); } return body.toReadableStream(globalThis); diff --git a/src/bun.js/webcore/response.zig b/src/bun.js/webcore/response.zig index 0e80adfc4..9a2ec48ba 100644 --- a/src/bun.js/webcore/response.zig +++ b/src/bun.js/webcore/response.zig @@ -778,27 +778,27 @@ pub const Fetch = struct { if (!success) { const err = this.onReject(); err.ensureStillAlive(); + // if we are streaming update with error + if (this.readable_stream_ref.get()) |readable| { + readable.ptr.Bytes.onData( + .{ + .err = .{ .JSValue = err }, + }, + bun.default_allocator, + ); + } + // if we are buffering resolve the promise if (this.response.get()) |response_js| { if (response_js.as(Response)) |response| { const body = response.body; - if (body.value == .Locked) { - if (body.value.Locked.readable) |readable| { - readable.ptr.Bytes.onData( - .{ - .err = .{ .JSValue = err }, - }, - bun.default_allocator, - ); - return; - } + if (body.value.Locked.promise) |promise_| { + const promise = promise_.asAnyPromise().?; + promise.reject(globalThis, err); } response.body.value.toErrorInstance(err, globalThis); - return; } } - - globalThis.throwValue(err); return; } @@ -1708,7 +1708,7 @@ pub const Fetch = struct { if (decompress.isBoolean()) { disable_decompression = !decompress.asBoolean(); } else if (decompress.isNumber()) { - disable_keepalive = decompress.to(i32) == 0; + disable_decompression = decompress.to(i32) == 0; } } @@ -1901,7 +1901,7 @@ pub const Fetch = struct { if (decompress.isBoolean()) { disable_decompression = !decompress.asBoolean(); } else if (decompress.isNumber()) { - disable_keepalive = decompress.to(i32) == 0; + disable_decompression = decompress.to(i32) == 0; } } diff --git a/src/bun.js/webcore/streams.zig b/src/bun.js/webcore/streams.zig index 2e6bbdce2..6c51daf94 100644 --- a/src/bun.js/webcore/streams.zig +++ b/src/bun.js/webcore/streams.zig @@ -225,6 +225,7 @@ pub const ReadableStream = struct { extern fn ReadableStream__isDisturbed(possibleReadableStream: JSValue, globalObject: *JSGlobalObject) bool; extern fn ReadableStream__isLocked(possibleReadableStream: JSValue, globalObject: *JSGlobalObject) bool; extern fn ReadableStream__empty(*JSGlobalObject) JSC.JSValue; + extern fn ReadableStream__used(*JSGlobalObject) JSC.JSValue; extern fn ReadableStream__cancel(stream: JSValue, *JSGlobalObject) void; extern fn ReadableStream__abort(stream: JSValue, *JSGlobalObject) void; extern fn ReadableStream__detach(stream: JSValue, *JSGlobalObject) void; @@ -367,6 +368,12 @@ pub const ReadableStream = struct { return ReadableStream__empty(globalThis); } + pub fn used(globalThis: *JSGlobalObject) JSC.JSValue { + JSC.markBinding(@src()); + + return ReadableStream__used(globalThis); + } + const Base = @import("../../ast/base.zig"); pub const StreamTag = enum(usize) { invalid = 0, @@ -3596,6 +3603,9 @@ pub const ByteStream = struct { this.buffer = try std.ArrayList(u8).initCapacity(bun.default_allocator, chunk.len); this.buffer.appendSliceAssumeCapacity(chunk); }, + .err => { + this.pending.result = .{ .err = stream.err }; + }, else => unreachable, } return; @@ -3605,6 +3615,9 @@ pub const ByteStream = struct { .temporary_and_done, .temporary => { try this.buffer.appendSlice(chunk); }, + .err => { + this.pending.result = .{ .err = stream.err }; + }, // We don't support the rest of these yet else => unreachable, } @@ -3835,7 +3848,7 @@ pub const FIFO = struct { pub fn getAvailableToReadOnLinux(this: *FIFO) u32 { var len: c_int = 0; - const rc: c_int = std.c.ioctl(this.fd, std.os.linux.T.FIONREAD, &len); + const rc: c_int = std.c.ioctl(this.fd, std.os.linux.T.FIONREAD, @as(*c_int, &len)); if (rc != 0) { len = 0; } |