lib: fix for FileHandle.readableWebStream

Fixes FileHandle.readableWebStream in mode "byob" when reading into
a view that has a byteOffset>0 into the underlying ArrayBuffer.

Fixes: https://github.com/nodejs/node/issues/58817
Signed-off-by: Patrick Dähne <pdaehne@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/58842
Reviewed-By: Ethan Arrowood <ethan@arrowood.dev>
Reviewed-By: Zeyu "Alex" Yang <himself65@outlook.com>
Reviewed-By: LiviaMedeiros <livia@cirno.name>
Reviewed-By: Filip Skokan <panva.ip@gmail.com>
This commit is contained in:
Patrick Dähne authored and Filip Skokan committed 2026-09-12 13:04:57 +02:00
1 parent 50b355ec04
commit 3fc994e8b1
2 files changed
+32 -1

No files matched your search

+1 -1
View File
@@ -369,7 +369,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();
@@ -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);