mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 10:15:07 +08:00
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:
1 parent
50b355ec04
commit
3fc994e8b1
2 files changed
+32
-1
No files matched your search
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user