aboutsummaryrefslogtreecommitdiff
path: root/src/js/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/builtins')
-rw-r--r--src/js/builtins/BunBuiltinNames.h7
-rw-r--r--src/js/builtins/ConsoleObject.ts78
-rw-r--r--src/js/builtins/ReadableStreamInternals.ts10
3 files changed, 64 insertions, 31 deletions
diff --git a/src/js/builtins/BunBuiltinNames.h b/src/js/builtins/BunBuiltinNames.h
index 1c34f2726..caaba1738 100644
--- a/src/js/builtins/BunBuiltinNames.h
+++ b/src/js/builtins/BunBuiltinNames.h
@@ -130,7 +130,6 @@ using namespace JSC;
macro(join) \
macro(kind) \
macro(lazy) \
- macro(lazyLoad) \
macro(lazyStreamPrototypeMap) \
macro(loadCJS2ESM) \
macro(localStreams) \
@@ -211,12 +210,6 @@ using namespace JSC;
macro(strategyHWM) \
macro(strategySizeAlgorithm) \
macro(stream) \
- macro(streamClosed) \
- macro(streamClosing) \
- macro(streamErrored) \
- macro(streamReadable) \
- macro(streamWaiting) \
- macro(streamWritable) \
macro(structuredCloneForStream) \
macro(syscall) \
macro(textDecoderStreamDecoder) \
diff --git a/src/js/builtins/ConsoleObject.ts b/src/js/builtins/ConsoleObject.ts
index 45746459a..2d657a78b 100644
--- a/src/js/builtins/ConsoleObject.ts
+++ b/src/js/builtins/ConsoleObject.ts
@@ -1,18 +1,55 @@
$overriddenName = "[Symbol.asyncIterator]";
export function asyncIterator(this: Console) {
- const Iterator = async function* ConsoleAsyncIterator() {
- const stream = Bun.stdin.stream();
- var reader = stream.getReader();
+ var stream = Bun.stdin.stream();
- // TODO: use builtin
- var decoder = new (globalThis as any).TextDecoder("utf-8", { fatal: false }) as TextDecoder;
- var deferredError;
- var indexOf = Bun.indexOfLine;
+ var decoder = new TextDecoder("utf-8", { fatal: false });
+ var indexOf = Bun.indexOfLine;
+ var actualChunk: Uint8Array;
+ var i: number = -1;
+ var idx: number;
+ var last: number;
+ var done: boolean;
+ var value: Uint8Array[];
+ var value_len: number;
+ var pendingChunk: Uint8Array | undefined;
+ async function* ConsoleAsyncIterator() {
+ var reader = stream.getReader();
+ var deferredError;
try {
+ if (i !== -1) {
+ last = i + 1;
+ i = indexOf(actualChunk, last);
+
+ while (i !== -1) {
+ yield decoder.decode(actualChunk.subarray(last, i));
+ last = i + 1;
+ i = indexOf(actualChunk, last);
+ }
+
+ for (idx++; idx < value_len; idx++) {
+ actualChunk = value[idx];
+ if (pendingChunk) {
+ actualChunk = Buffer.concat([pendingChunk, actualChunk]);
+ pendingChunk = undefined;
+ }
+
+ last = 0;
+ // TODO: "\r", 0x4048, 0x4049, 0x404A, 0x404B, 0x404C, 0x404D, 0x404E, 0x404F
+ i = indexOf(actualChunk, last);
+ while (i !== -1) {
+ yield decoder.decode(actualChunk.subarray(last, i));
+ last = i + 1;
+ i = indexOf(actualChunk, last);
+ }
+ i = -1;
+
+ pendingChunk = actualChunk.subarray(last);
+ }
+ actualChunk = undefined!;
+ }
+
while (true) {
- var done, value;
- var pendingChunk;
const firstResult = reader.readMany();
if ($isPromise(firstResult)) {
({ done, value } = await firstResult);
@@ -27,26 +64,29 @@ export function asyncIterator(this: Console) {
return;
}
- var actualChunk;
// we assume it was given line-by-line
- for (const chunk of value) {
- actualChunk = chunk;
+ for (idx = 0, value_len = value.length; idx < value_len; idx++) {
+ actualChunk = value[idx];
if (pendingChunk) {
- actualChunk = Buffer.concat([pendingChunk, chunk]);
- pendingChunk = null;
+ actualChunk = Buffer.concat([pendingChunk, actualChunk]);
+ pendingChunk = undefined;
}
- var last = 0;
+ last = 0;
// TODO: "\r", 0x4048, 0x4049, 0x404A, 0x404B, 0x404C, 0x404D, 0x404E, 0x404F
- var i = indexOf(actualChunk, last);
+ i = indexOf(actualChunk, last);
while (i !== -1) {
+ // This yield may end the function, in that case we need to be able to recover state
+ // if the iterator was fired up again.
yield decoder.decode(actualChunk.subarray(last, i));
last = i + 1;
i = indexOf(actualChunk, last);
}
+ i = -1;
pendingChunk = actualChunk.subarray(last);
}
+ actualChunk = undefined!;
}
} catch (e) {
deferredError = e;
@@ -57,11 +97,11 @@ export function asyncIterator(this: Console) {
throw deferredError;
}
}
- };
+ }
const symbol = globalThis.Symbol.asyncIterator;
- this[symbol] = Iterator;
- return Iterator();
+ this[symbol] = ConsoleAsyncIterator;
+ return ConsoleAsyncIterator();
}
export function write(this: Console, input) {
diff --git a/src/js/builtins/ReadableStreamInternals.ts b/src/js/builtins/ReadableStreamInternals.ts
index e249aea0a..ca263363c 100644
--- a/src/js/builtins/ReadableStreamInternals.ts
+++ b/src/js/builtins/ReadableStreamInternals.ts
@@ -1073,12 +1073,12 @@ export function createTextStream(highWaterMark) {
}
if (hasBuffer && !hasString) {
- return new globalThis.TextDecoder().decode($Bun.concatArrayBuffers(array));
+ return new globalThis.TextDecoder().decode(Bun.concatArrayBuffers(array));
}
// worst case: mixed content
- var arrayBufferSink = new $Bun.ArrayBufferSink();
+ var arrayBufferSink = new Bun.ArrayBufferSink();
arrayBufferSink.start({
highWaterMark: estimatedLength,
asUint8Array: true,
@@ -1205,7 +1205,7 @@ export function initializeArrayBufferStream(underlyingSource, highWaterMark) {
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 = {
@@ -1492,7 +1492,7 @@ export function lazyLoadStream(stream, autoAllocateChunkSize) {
var nativePtr = $getByIdDirectPrivate(stream, "bunNativePtr");
var Prototype = $lazyStreamPrototypeMap.$get(nativeType);
if (Prototype === undefined) {
- var [pull, start, cancel, setClose, deinit, setRefOrUnref, drain] = $lazyLoad(nativeType);
+ var [pull, start, cancel, setClose, deinit, setRefOrUnref, drain] = $lazy(nativeType);
var closer = [false];
var handleResult;
function handleNativeReadableStreamPromiseResult(val) {
@@ -1679,7 +1679,7 @@ export function readableStreamIntoText(stream) {
}
export function readableStreamToArrayBufferDirect(stream, underlyingSource) {
- var sink = new $Bun.ArrayBufferSink();
+ var sink = new Bun.ArrayBufferSink();
$putByIdDirectPrivate(stream, "underlyingSource", undefined);
var highWaterMark = $getByIdDirectPrivate(stream, "highWaterMark");
sink.start(highWaterMark ? { highWaterMark } : {});