diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index bfc0ec2e102ab9..6403b3a6be9933 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -318,7 +318,7 @@ class FileHandle extends EventEmitter { async pull(controller) { const view = controller.byobRequest.view; - const { bytesRead } = await readFn(view, view.byteOffset, view.byteLength); + const { bytesRead } = await readFn(view, 0, view.byteLength); if (bytesRead === 0) { controller.close(); diff --git a/test/parallel/test-filehandle-readablestream.js b/test/parallel/test-filehandle-readablestream.js index 46ad53a20018a3..1e2eb1c6b0e2d0 100644 --- a/test/parallel/test-filehandle-readablestream.js +++ b/test/parallel/test-filehandle-readablestream.js @@ -114,6 +114,37 @@ const check = readFileSync(__filename, { encoding: 'utf8' }); await file.close(); })().then(common.mustCall()); +// Make sure 'byob' reader works with views into +// different parts of a single ArrayBuffer +(async () => { + const file = await open(__filename); + const dec = new TextDecoder(); + const readable = file.readableWebStream(); + const reader = readable.getReader({ mode: 'byob' }); + const size = (await file.stat()).size; + + let buff = new ArrayBuffer(size); + let offset = 0; + let result; + do { + result = await reader.read(new DataView(buff, offset, Math.min(100, buff.byteLength - offset))); + if (result.value !== undefined) { + buff = result.value.buffer; + offset += result.value.byteLength; + assert.ok(result.value.byteLength <= 100); + } + } while (!result.done && (offset < buff.byteLength)); + const data = dec.decode(new Uint8Array(buff)); + + assert.strictEqual(check, data); + + assert.throws(() => file.readableWebStream(), { + code: 'ERR_INVALID_STATE', + }); + + await file.close(); +})().then(common.mustCall()); + // Make sure a warning is logged if a non-'bytes' type is passed. (async () => { const file = await open(__filename);