diff options
author | 2022-06-02 03:00:45 -0700 | |
---|---|---|
committer | 2022-06-02 03:00:45 -0700 | |
commit | e5eabc0658d2133603596ec17a6e7c956c5fe28c (patch) | |
tree | 8e50a0bfa0ca9eba4145191720bb7d412bf8d26f /src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js | |
parent | 121c2960de87c53cc6bdd5f92fab627a74d21a2b (diff) | |
download | bun-e5eabc0658d2133603596ec17a6e7c956c5fe28c.tar.gz bun-e5eabc0658d2133603596ec17a6e7c956c5fe28c.tar.zst bun-e5eabc0658d2133603596ec17a6e7c956c5fe28c.zip |
Faster ReadableStream
Diffstat (limited to 'src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js')
-rw-r--r-- | src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js | 59 |
1 files changed, 11 insertions, 48 deletions
diff --git a/src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js b/src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js index 3e7438a62..9766d150e 100644 --- a/src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js +++ b/src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js @@ -33,7 +33,7 @@ function initializeReadableStreamDefaultReader(stream) @throwTypeError("ReadableStream is locked"); @readableStreamReaderGenericInitialize(this, stream); - @putByIdDirectPrivate(this, "readRequests", []); + @putByIdDirectPrivate(this, "readRequests", @createFIFO()); return this; } @@ -70,30 +70,14 @@ function readMany() throw @getByIdDirectPrivate(stream, "storedError"); } - const controller = @getByIdDirectPrivate(stream, "readableStreamController"); + var controller = @getByIdDirectPrivate(stream, "readableStreamController"); const content = @getByIdDirectPrivate(controller, "queue").content; var size = @getByIdDirectPrivate(controller, "queue").size; + var values = content.toArray(false); + var length = values.length; - var values = new @Array(content.length); - - if (content.length > 0) { - if ("buffer" in content[0]) { - values[0] = new @Uint8Array(content[0].buffer, content[0].byteOffset, content[0].byteLength); - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, new @Uint8Array(content[i].buffer, content[i].byteOffset, content[i].byteLength)); - } - } else if (typeof content[0] === 'object' && content[0] && "byteLength" in content[0]) { - size = 0; - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, content[i].value); - size += content[i].value.byteLength; - } - } else { - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, content[i].value); - } - } + if (length > 0) { @resetQueue(@getByIdDirectPrivate(controller, "queue")); if (@getByIdDirectPrivate(controller, "closeRequested")) @@ -105,44 +89,23 @@ function readMany() if (done) { return {value: [], size: 0, done: true}; } - - const content = queue.content; - var values = new @Array(content.length + 1); - + var queue = @getByIdDirectPrivate(controller, "queue"); + const content = [value].concat(queue.content.toArray(false)); var size = queue.size; - - if ("buffer" in content[0]) { - values[0] = new @Uint8Array(value.buffer, value.byteOffset, value.byteLength); - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, new @Uint8Array(content[i].buffer, content[i].byteOffset, content[i].byteLength)); - } - size += value.byteLength; - } else if (typeof value === 'object' && value && "byteLength" in value) { - size += value.byteLength; - values[0] = value; - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, content[i].value); - size += content[i].value.byteLength; - } - - } else { - values[0] = value; - for (var i = 0; i < content.length; ++i) { - @putByValDirect(values, i+1, content[i].value); - } - } - @resetQueue(queue); if (@getByIdDirectPrivate(controller, "closeRequested")) @readableStreamClose(@getByIdDirectPrivate(controller, "controlledReadableStream")); else @readableStreamDefaultControllerCallPullIfNeeded(controller); + controller = @undefined; return {value: values, size: size, done: false}; }); } + controller = @undefined; + return {value: values, size, done: false}; } @@ -168,7 +131,7 @@ function releaseLock() if (!@getByIdDirectPrivate(this, "ownerReadableStream")) return; - if (@getByIdDirectPrivate(this, "readRequests").length) + if (@getByIdDirectPrivate(this, "readRequests")?.isNotEmpty()) @throwTypeError("There are still pending read requests, cannot release the lock"); @readableStreamReaderGenericRelease(this); |