aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-02 03:00:45 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-02 03:00:45 -0700
commite5eabc0658d2133603596ec17a6e7c956c5fe28c (patch)
tree8e50a0bfa0ca9eba4145191720bb7d412bf8d26f /src/javascript/jsc/bindings/builtins/js/ReadableStreamDefaultReader.js
parent121c2960de87c53cc6bdd5f92fab627a74d21a2b (diff)
downloadbun-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.js59
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);