aboutsummaryrefslogtreecommitdiff
path: root/src/js/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/builtins')
-rw-r--r--src/js/builtins/EventStream.ts8
-rw-r--r--src/js/builtins/ReadableByteStreamInternals.ts4
-rw-r--r--src/js/builtins/ReadableStream.ts14
-rw-r--r--src/js/builtins/ReadableStreamBYOBReader.ts10
-rw-r--r--src/js/builtins/ReadableStreamInternals.ts47
-rw-r--r--src/js/builtins/TransformStreamInternals.ts2
-rw-r--r--src/js/builtins/WritableStreamDefaultWriter.ts8
-rw-r--r--src/js/builtins/WritableStreamInternals.ts16
-rw-r--r--src/js/builtins/builtins.d.ts11
9 files changed, 66 insertions, 54 deletions
diff --git a/src/js/builtins/EventStream.ts b/src/js/builtins/EventStream.ts
index c82195eb2..c2ce30f17 100644
--- a/src/js/builtins/EventStream.ts
+++ b/src/js/builtins/EventStream.ts
@@ -12,17 +12,17 @@ export function getEventStream() {
opts?.start?.(this);
},
cancel: () => {
- console.log("Cancel!");
opts?.cancel?.(this);
+ this.#ctrl = undefined;
},
});
}
send(event?: unknown, data?: unknown): void {
var ctrl = this.#ctrl!;
- // if (!ctrl) {
- // throw new Error("EventStream has ended");
- // }
+ if (!ctrl) {
+ throw new Error("EventStream has ended");
+ }
if (!data) {
data = event;
event = undefined;
diff --git a/src/js/builtins/ReadableByteStreamInternals.ts b/src/js/builtins/ReadableByteStreamInternals.ts
index f44c385b4..84186c628 100644
--- a/src/js/builtins/ReadableByteStreamInternals.ts
+++ b/src/js/builtins/ReadableByteStreamInternals.ts
@@ -133,7 +133,7 @@ export function readableByteStreamControllerClose(controller) {
var first = $getByIdDirectPrivate(controller, "pendingPullIntos")?.peek();
if (first) {
if (first.bytesFilled > 0) {
- const e = $makeTypeError("Close requested while there remain pending bytes");
+ const e = new TypeError("Close requested while there remain pending bytes");
$readableByteStreamControllerError(controller, e);
throw e;
}
@@ -629,7 +629,7 @@ export function readableByteStreamControllerPullInto(controller, view) {
return $createFulfilledPromise({ value: filledView, done: false });
}
if ($getByIdDirectPrivate(controller, "closeRequested")) {
- const e = $makeTypeError("Closing stream has been requested");
+ const e = new TypeError("Closing stream has been requested");
$readableByteStreamControllerError(controller, e);
return Promise.$reject(e);
}
diff --git a/src/js/builtins/ReadableStream.ts b/src/js/builtins/ReadableStream.ts
index a265ff7d8..34806d53d 100644
--- a/src/js/builtins/ReadableStream.ts
+++ b/src/js/builtins/ReadableStream.ts
@@ -288,7 +288,7 @@ export function createNativeReadableStream(nativePtr, nativeType, autoAllocateCh
export function cancel(this, reason) {
if (!$isReadableStream(this)) return Promise.$reject($makeThisTypeError("ReadableStream", "cancel"));
- if ($isReadableStreamLocked(this)) return Promise.$reject($makeTypeError("ReadableStream is locked"));
+ if ($isReadableStreamLocked(this)) return Promise.$reject(new TypeError("ReadableStream is locked"));
return $readableStreamCancel(this, reason);
}
@@ -329,21 +329,21 @@ export function pipeThrough(this, streams, options) {
let preventCancel = false;
let signal;
if (!$isUndefinedOrNull(options)) {
- if (!$isObject(options)) throw $makeTypeError("options must be an object");
+ if (!$isObject(options)) throw new TypeError("options must be an object");
preventAbort = !!options["preventAbort"];
preventCancel = !!options["preventCancel"];
preventClose = !!options["preventClose"];
signal = options["signal"];
- if (signal !== undefined && !$isAbortSignal(signal)) throw $makeTypeError("options.signal must be AbortSignal");
+ if (signal !== undefined && !$isAbortSignal(signal)) throw new TypeError("options.signal must be AbortSignal");
}
if (!$isReadableStream(this)) throw $makeThisTypeError("ReadableStream", "pipeThrough");
- if ($isReadableStreamLocked(this)) throw $makeTypeError("ReadableStream is locked");
+ if ($isReadableStreamLocked(this)) throw new TypeError("ReadableStream is locked");
- if ($isWritableStreamLocked(internalWritable)) throw $makeTypeError("WritableStream is locked");
+ if ($isWritableStreamLocked(internalWritable)) throw new TypeError("WritableStream is locked");
$readableStreamPipeToWritableStream(this, internalWritable, preventClose, preventAbort, preventCancel, signal);
@@ -353,7 +353,7 @@ export function pipeThrough(this, streams, options) {
export function pipeTo(this, destination) {
if (!$isReadableStream(this)) return Promise.$reject($makeThisTypeError("ReadableStream", "pipeTo"));
- if ($isReadableStreamLocked(this)) return Promise.$reject($makeTypeError("ReadableStream is locked"));
+ if ($isReadableStreamLocked(this)) return Promise.$reject(new TypeError("ReadableStream is locked"));
// FIXME: https://bugs.webkit.org/show_bug.cgi?id=159869.
// Built-in generator should be able to parse function signature to compute the function length correctly.
@@ -364,7 +364,7 @@ export function pipeTo(this, destination) {
let preventCancel = false;
let signal;
if (!$isUndefinedOrNull(options)) {
- if (!$isObject(options)) return Promise.$reject($makeTypeError("options must be an object"));
+ if (!$isObject(options)) return Promise.$reject(new TypeError("options must be an object"));
try {
preventAbort = !!options["preventAbort"];
diff --git a/src/js/builtins/ReadableStreamBYOBReader.ts b/src/js/builtins/ReadableStreamBYOBReader.ts
index 5ebfddb19..7a4dbf060 100644
--- a/src/js/builtins/ReadableStreamBYOBReader.ts
+++ b/src/js/builtins/ReadableStreamBYOBReader.ts
@@ -39,7 +39,7 @@ export function cancel(this, reason) {
return Promise.$reject($makeThisTypeError("ReadableStreamBYOBReader", "cancel"));
if (!$getByIdDirectPrivate(this, "ownerReadableStream"))
- return Promise.$reject($makeTypeError("cancel() called on a reader owned by no readable stream"));
+ return Promise.$reject(new TypeError("cancel() called on a reader owned by no readable stream"));
return $readableStreamReaderGenericCancel(this, reason);
}
@@ -49,13 +49,13 @@ export function read(this, view: DataView) {
return Promise.$reject($makeThisTypeError("ReadableStreamBYOBReader", "read"));
if (!$getByIdDirectPrivate(this, "ownerReadableStream"))
- return Promise.$reject($makeTypeError("read() called on a reader owned by no readable stream"));
+ return Promise.$reject(new TypeError("read() called on a reader owned by no readable stream"));
- if (!$isObject(view)) return Promise.$reject($makeTypeError("Provided view is not an object"));
+ if (!$isObject(view)) return Promise.$reject(new TypeError("Provided view is not an object"));
- if (!ArrayBuffer.$isView(view)) return Promise.$reject($makeTypeError("Provided view is not an ArrayBufferView"));
+ if (!ArrayBuffer.$isView(view)) return Promise.$reject(new TypeError("Provided view is not an ArrayBufferView"));
- if (view.byteLength === 0) return Promise.$reject($makeTypeError("Provided view cannot have a 0 byteLength"));
+ if (view.byteLength === 0) return Promise.$reject(new TypeError("Provided view cannot have a 0 byteLength"));
return $readableStreamBYOBReaderRead(this, view);
}
diff --git a/src/js/builtins/ReadableStreamInternals.ts b/src/js/builtins/ReadableStreamInternals.ts
index 0c4e816f4..9e2caba4f 100644
--- a/src/js/builtins/ReadableStreamInternals.ts
+++ b/src/js/builtins/ReadableStreamInternals.ts
@@ -151,10 +151,11 @@ export function createReadableStreamController(stream, underlyingSource, strateg
if (typeString === "bytes") {
// if (!$readableByteStreamAPIEnabled())
- // $throwTypeError("ReadableByteStreamController is not implemented");
+ // throw new TypeError("ReadableByteStreamController is not implemented");
if (strategy.highWaterMark === undefined) strategy.highWaterMark = 0;
- if (strategy.size !== undefined) $throwRangeError("Strategy for a ReadableByteStreamController cannot have a size");
+ if (strategy.size !== undefined)
+ throw new RangeError("Strategy for a ReadableByteStreamController cannot have a size");
$putByIdDirectPrivate(
stream,
@@ -603,16 +604,17 @@ export function readDirectStream(stream, sink, underlyingSource) {
$putByIdDirectPrivate(stream, "underlyingSource", undefined);
$putByIdDirectPrivate(stream, "start", undefined);
- function close(stream, reason) {
- if (reason && underlyingSource?.cancel) {
+ function close(stream: ReadableStream, reason?: any) {
+ var cancel = underlyingSource?.cancel;
+ if (cancel) {
try {
- var prom = underlyingSource.cancel(reason);
- $markPromiseAsHandled(prom);
+ var prom = cancel.$apply(underlyingSource, reason);
+ if ($isPromise(prom)) {
+ $markPromiseAsHandled(prom);
+ }
} catch (e) {}
-
underlyingSource = undefined;
}
-
if (stream) {
$putByIdDirectPrivate(stream, "readableStreamController", undefined);
$putByIdDirectPrivate(stream, "reader", undefined);
@@ -622,19 +624,17 @@ export function readDirectStream(stream, sink, underlyingSource) {
} else {
$putByIdDirectPrivate(stream, "state", $streamClosed);
}
- stream = undefined;
}
}
if (!underlyingSource.pull) {
- close();
+ close(stream);
return;
}
if (!$isCallable(underlyingSource.pull)) {
- close();
- $throwTypeError("pull is not a function");
- return;
+ close(stream);
+ throw new TypeError("pull is not a function");
}
$putByIdDirectPrivate(stream, "readableStreamController", sink);
@@ -766,7 +766,7 @@ export async function readStreamIntoSink(stream, sink, isNative) {
}
}
-export function handleDirectStreamError(e) {
+export function handleDirectStreamError(this, e) {
var controller = this;
var sink = controller.$sink;
if (sink) {
@@ -870,10 +870,10 @@ export function noopDoneFunction() {
}
export function onReadableStreamDirectControllerClosed(reason) {
- $throwTypeError("ReadableStreamDirectController is now closed");
+ throw new TypeError("ReadableStreamDirectController is now closed");
}
-export function onCloseDirectStream(reason) {
+export function onCloseDirectStream(this, reason) {
var stream = this.$controlledReadableStream;
if (!stream || $getByIdDirectPrivate(stream, "state") !== $streamReadable) return;
@@ -1169,16 +1169,19 @@ export function initializeArrayStream(underlyingSource, highWaterMark) {
return closingPromise;
}
-export function initializeArrayBufferStream(underlyingSource, highWaterMark) {
+export function initializeArrayBufferStream(
+ this: ReadableStream,
+ underlyingSource: UnderlyingSource,
+ highWaterMark: number,
+) {
// This is the fallback implementation for direct streams
// When we don't know what the destination type is
// We assume it is a Uint8Array.
-
var opts =
highWaterMark && typeof highWaterMark === "number"
? { highWaterMark, stream: true, asUint8Array: true }
: { stream: true, asUint8Array: true };
- var sink = new $Bun.ArrayBufferSink();
+ var sink = new Bun.ArrayBufferSink();
sink.start(opts);
var controller = {
@@ -1323,7 +1326,7 @@ export function readableStreamCancel(stream, reason) {
return Promise.$resolve(controller.close(reason));
}
- $throwTypeError("ReadableStreamController has no cancel or close method");
+ return Promise.$reject(new TypeError("ReadableStreamController has no cancel or close method"));
}
export function readableStreamDefaultControllerCancel(controller, reason) {
@@ -1440,11 +1443,11 @@ export function readableStreamReaderGenericRelease(reader) {
if ($getByIdDirectPrivate($getByIdDirectPrivate(reader, "ownerReadableStream"), "state") === $streamReadable)
$getByIdDirectPrivate(reader, "closedPromiseCapability").$reject.$call(
undefined,
- $makeTypeError("releasing lock of reader whose stream is still in readable state"),
+ new TypeError("releasing lock of reader whose stream is still in readable state"),
);
else
$putByIdDirectPrivate(reader, "closedPromiseCapability", {
- $promise: $newHandledRejectedPromise($makeTypeError("reader released lock")),
+ $promise: $newHandledRejectedPromise(new TypeError("reader released lock")),
});
const promise = $getByIdDirectPrivate(reader, "closedPromiseCapability").$promise;
diff --git a/src/js/builtins/TransformStreamInternals.ts b/src/js/builtins/TransformStreamInternals.ts
index 9994d1282..a1228e87e 100644
--- a/src/js/builtins/TransformStreamInternals.ts
+++ b/src/js/builtins/TransformStreamInternals.ts
@@ -258,7 +258,7 @@ export function transformStreamDefaultControllerTerminate(controller) {
// FIXME: Update readableStreamDefaultControllerClose to make this check.
if ($readableStreamDefaultControllerCanCloseOrEnqueue(readableController))
$readableStreamDefaultControllerClose(readableController);
- const error = $makeTypeError("the stream has been terminated");
+ const error = new TypeError("the stream has been terminated");
$transformStreamErrorWritableAndUnblockWrite(stream, error);
}
diff --git a/src/js/builtins/WritableStreamDefaultWriter.ts b/src/js/builtins/WritableStreamDefaultWriter.ts
index 795b43892..16f0293e6 100644
--- a/src/js/builtins/WritableStreamDefaultWriter.ts
+++ b/src/js/builtins/WritableStreamDefaultWriter.ts
@@ -65,7 +65,7 @@ export function abort(reason) {
return Promise.$reject($makeThisTypeError("WritableStreamDefaultWriter", "abort"));
if ($getByIdDirectPrivate(this, "stream") === undefined)
- return Promise.$reject($makeTypeError("WritableStreamDefaultWriter has no stream"));
+ return Promise.$reject(new TypeError("WritableStreamDefaultWriter has no stream"));
return $writableStreamDefaultWriterAbort(this, reason);
}
@@ -75,10 +75,10 @@ export function close() {
return Promise.$reject($makeThisTypeError("WritableStreamDefaultWriter", "close"));
const stream = $getByIdDirectPrivate(this, "stream");
- if (stream === undefined) return Promise.$reject($makeTypeError("WritableStreamDefaultWriter has no stream"));
+ if (stream === undefined) return Promise.$reject(new TypeError("WritableStreamDefaultWriter has no stream"));
if ($writableStreamCloseQueuedOrInFlight(stream))
- return Promise.$reject($makeTypeError("WritableStreamDefaultWriter is being closed"));
+ return Promise.$reject(new TypeError("WritableStreamDefaultWriter is being closed"));
return $writableStreamDefaultWriterClose(this);
}
@@ -98,7 +98,7 @@ export function write(chunk) {
return Promise.$reject($makeThisTypeError("WritableStreamDefaultWriter", "write"));
if ($getByIdDirectPrivate(this, "stream") === undefined)
- return Promise.$reject($makeTypeError("WritableStreamDefaultWriter has no stream"));
+ return Promise.$reject(new TypeError("WritableStreamDefaultWriter has no stream"));
return $writableStreamDefaultWriterWrite(this, chunk);
}
diff --git a/src/js/builtins/WritableStreamInternals.ts b/src/js/builtins/WritableStreamInternals.ts
index f436a285e..27d60e7f4 100644
--- a/src/js/builtins/WritableStreamInternals.ts
+++ b/src/js/builtins/WritableStreamInternals.ts
@@ -127,11 +127,11 @@ export function initializeWritableStreamSlots(stream, underlyingSink) {
export function writableStreamCloseForBindings(stream) {
if ($isWritableStreamLocked(stream))
- return Promise.$reject($makeTypeError("WritableStream.close method can only be used on non locked WritableStream"));
+ return Promise.$reject(new TypeError("WritableStream.close method can only be used on non locked WritableStream"));
if ($writableStreamCloseQueuedOrInFlight(stream))
return Promise.$reject(
- $makeTypeError("WritableStream.close method can only be used on a being close WritableStream"),
+ new TypeError("WritableStream.close method can only be used on a being close WritableStream"),
);
return $writableStreamClose(stream);
@@ -139,7 +139,7 @@ export function writableStreamCloseForBindings(stream) {
export function writableStreamAbortForBindings(stream, reason) {
if ($isWritableStreamLocked(stream))
- return Promise.$reject($makeTypeError("WritableStream.abort method can only be used on non locked WritableStream"));
+ return Promise.$reject(new TypeError("WritableStream.abort method can only be used on non locked WritableStream"));
return $writableStreamAbort(stream, reason);
}
@@ -207,7 +207,7 @@ export function writableStreamAbort(stream, reason) {
export function writableStreamClose(stream) {
const state = $getByIdDirectPrivate(stream, "state");
if (state === "closed" || state === "errored")
- return Promise.$reject($makeTypeError("Cannot close a writable stream that is closed or errored"));
+ return Promise.$reject(new TypeError("Cannot close a writable stream that is closed or errored"));
$assert(state === "writable" || state === "erroring");
$assert(!$writableStreamCloseQueuedOrInFlight(stream));
@@ -509,7 +509,7 @@ export function writableStreamDefaultWriterRelease(writer) {
$assert(stream !== undefined);
$assert($getByIdDirectPrivate(stream, "writer") === writer);
- const releasedError = $makeTypeError("writableStreamDefaultWriterRelease");
+ const releasedError = new TypeError("writableStreamDefaultWriterRelease");
$writableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
$writableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
@@ -527,16 +527,16 @@ export function writableStreamDefaultWriterWrite(writer, chunk) {
const chunkSize = $writableStreamDefaultControllerGetChunkSize(controller, chunk);
if (stream !== $getByIdDirectPrivate(writer, "stream"))
- return Promise.$reject($makeTypeError("writer is not stream's writer"));
+ return Promise.$reject(new TypeError("writer is not stream's writer"));
const state = $getByIdDirectPrivate(stream, "state");
if (state === "errored") return Promise.$reject($getByIdDirectPrivate(stream, "storedError"));
if ($writableStreamCloseQueuedOrInFlight(stream) || state === "closed")
- return Promise.$reject($makeTypeError("stream is closing or closed"));
+ return Promise.$reject(new TypeError("stream is closing or closed"));
if ($writableStreamCloseQueuedOrInFlight(stream) || state === "closed")
- return Promise.$reject($makeTypeError("stream is closing or closed"));
+ return Promise.$reject(new TypeError("stream is closing or closed"));
if (state === "erroring") return Promise.$reject($getByIdDirectPrivate(stream, "storedError"));
diff --git a/src/js/builtins/builtins.d.ts b/src/js/builtins/builtins.d.ts
index 2de8d8206..0ef033e7d 100644
--- a/src/js/builtins/builtins.d.ts
+++ b/src/js/builtins/builtins.d.ts
@@ -357,7 +357,15 @@ declare function $size(): TODO;
declare function $start(): TODO;
declare function $startAlgorithm(): TODO;
declare function $startConsumingStream(): TODO;
-declare function $startDirectStream(): TODO;
+/** C++ functionStartDirectStream
+ * @param this - the sink
+ */
+declare function $startDirectStream(
+ this: any,
+ stream: ReadableStream,
+ pull: DirectUnderlyingSource["pull"] | undefined,
+ close: ((stream: ReadableStream, reason: any) => void) | undefined,
+): TODO;
declare function $started(): TODO;
declare function $startedPromise(): TODO;
declare function $state(): TODO;
@@ -401,6 +409,7 @@ declare function $writeRequests(): TODO;
declare function $writer(): TODO;
declare function $writing(): TODO;
declare function $written(): TODO;
+declare function $rejectPromise(promise: Promise, error: any): void;
declare function $createCommonJSModule(id: string, exports: any, hasEvaluated: boolean): NodeModule;