aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/builtins/js/ReadableStreamDefaultReader.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-12 23:48:27 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-12 23:48:27 -0700
commit8200f43a0431cd0270865fb0c576e0f8e4fe1c8a (patch)
treeeb6437c69384e1085cd26dca670e386934ed9b48 /src/bun.js/builtins/js/ReadableStreamDefaultReader.js
parent3fceae807037d97cd6c93d20d87d1ef5a98fdd75 (diff)
downloadbun-8200f43a0431cd0270865fb0c576e0f8e4fe1c8a.tar.gz
bun-8200f43a0431cd0270865fb0c576e0f8e4fe1c8a.tar.zst
bun-8200f43a0431cd0270865fb0c576e0f8e4fe1c8a.zip
Fix a bug with ReadableStreamDefaultReader and `"direct"` controller
Diffstat (limited to 'src/bun.js/builtins/js/ReadableStreamDefaultReader.js')
-rw-r--r--src/bun.js/builtins/js/ReadableStreamDefaultReader.js45
1 files changed, 31 insertions, 14 deletions
diff --git a/src/bun.js/builtins/js/ReadableStreamDefaultReader.js b/src/bun.js/builtins/js/ReadableStreamDefaultReader.js
index e3e39b2da..9430a1037 100644
--- a/src/bun.js/builtins/js/ReadableStreamDefaultReader.js
+++ b/src/bun.js/builtins/js/ReadableStreamDefaultReader.js
@@ -72,25 +72,40 @@ function readMany()
var controller = @getByIdDirectPrivate(stream, "readableStreamController");
+ var queue = @getByIdDirectPrivate(controller, "queue");
+
+ if (!queue) {
+ // This is a ReadableStream direct controller implemented in JS
+ // It hasn't been started yet.
+ return controller.@pull(
+ controller
+ ).@then(
+ ({done, value}) => (
+ done ?
+ { done: true, value: [], size: 0 } :
+ { value: [value], size: 1, done: false }
+ ));
+ }
- const content = @getByIdDirectPrivate(controller, "queue").content;
- var size = @getByIdDirectPrivate(controller, "queue").size;
+ const content = queue.content;
+ var size = queue.size;
var values = content.toArray(false);
+
var length = values.length;
if (length > 0) {
-
+ var outValues = @newArrayWithSize(length);
if (@isReadableByteStreamController(controller)) {
- for (var i = 0; i < value.length; i++) {
- const buf = value[i];
+ for (var i = 0; i < length; i++) {
+ const buf = values[i];
if (!(@ArrayBuffer.@isView(buf) || buf instanceof @ArrayBuffer)) {
- value[i] = new @Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
+ @putByValDirect(outValues, i, @Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength));
}
}
} else {
- values[0] = values[0].value;
- for (var i = 1; i < values.length; i++) {
- values[i] = values[i].value;
+ @putByValDirect(outValues, 0, values[0].value);
+ for (var i = 1; i < length; i++) {
+ @putByValDirect(outValues, i, values[i].value);
}
}
@@ -103,7 +118,7 @@ function readMany()
else if (@isReadableByteStreamController(controller))
@readableByteStreamControllerCallPullIfNeeded(controller);
- return {value: values, size, done: false};
+ return {value: outValues, size, done: false};
}
var onPullMany = (result) => {
@@ -114,17 +129,19 @@ function readMany()
var queue = @getByIdDirectPrivate(controller, "queue");
var value = [result.value].concat(queue.content.toArray(false));
+ var length = value.length;
if (@isReadableByteStreamController(controller)) {
- for (var i = 0; i < value.length; i++) {
+ for (var i = 0; i < length; i++) {
const buf = value[i];
if (!(@ArrayBuffer.@isView(buf) || buf instanceof @ArrayBuffer)) {
- value[i] = new @Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
+ const {buffer, byteOffset, byteLength} = buf;
+ @putByValDirect(value, i, new @Uint8Array(buffer, byteOffset, byteLength));
}
}
} else {
- for (var i = 1; i < value.length; i++) {
- value[i] = value[i].value;
+ for (var i = 1; i < length; i++) {
+ @putByValDirect(value, i, value[i].value);
}
}