diff options
author | 2022-10-12 23:48:27 -0700 | |
---|---|---|
committer | 2022-10-12 23:48:27 -0700 | |
commit | 8200f43a0431cd0270865fb0c576e0f8e4fe1c8a (patch) | |
tree | eb6437c69384e1085cd26dca670e386934ed9b48 /src/bun.js/builtins/js/ReadableStreamDefaultReader.js | |
parent | 3fceae807037d97cd6c93d20d87d1ef5a98fdd75 (diff) | |
download | bun-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.js | 45 |
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); } } |