Skip to content

Commit 0eea7fd

Browse files
KhafraDevUlisesGascon
authored andcommitted
stream: use Buffer.from when constructor is a Buffer
When using BYOB streams, it's possible for the constructor in readableByteStreamControllerConvertPullIntoDescriptor to be a node Buffer. If it is, use `Buffer.from` over `new ctor`. Fixes #49245 PR-URL: #49250 Reviewed-By: Debadree Chatterjee <debadree333@gmail.com> Reviewed-By: LiviaMedeiros <livia@cirno.name> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
1 parent 91b2d43 commit 0eea7fd

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

lib/internal/webstreams/readablestream.js

+7
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ const {
132132
writableStreamDefaultWriterWrite,
133133
} = require('internal/webstreams/writablestream');
134134

135+
const { Buffer } = require('buffer');
136+
135137
const assert = require('internal/assert');
136138

137139
const kCancel = Symbol('kCancel');
@@ -1905,6 +1907,11 @@ function readableByteStreamControllerConvertPullIntoDescriptor(desc) {
19051907
throw new ERR_INVALID_STATE.RangeError('The buffer size is invalid');
19061908
assert(!(bytesFilled % elementSize));
19071909
const transferredBuffer = transferArrayBuffer(buffer);
1910+
1911+
if (ctor === Buffer) {
1912+
return Buffer.from(transferredBuffer, byteOffset, bytesFilled / elementSize);
1913+
}
1914+
19081915
return new ctor(transferredBuffer, byteOffset, bytesFilled / elementSize);
19091916
}
19101917

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
5+
const {
6+
open,
7+
} = require('fs/promises');
8+
9+
const {
10+
Buffer,
11+
} = require('buffer');
12+
13+
class Source {
14+
async start(controller) {
15+
this.file = await open(__filename);
16+
this.controller = controller;
17+
}
18+
19+
async pull(controller) {
20+
const byobRequest = controller.byobRequest;
21+
const view = byobRequest.view;
22+
23+
const {
24+
bytesRead,
25+
} = await this.file.read({
26+
buffer: view,
27+
offset: view.byteOffset,
28+
length: view.byteLength
29+
});
30+
31+
if (bytesRead === 0) {
32+
await this.file.close();
33+
this.controller.close();
34+
}
35+
36+
byobRequest.respond(bytesRead);
37+
}
38+
39+
get type() { return 'bytes'; }
40+
41+
get autoAllocateChunkSize() { return 1024; }
42+
}
43+
44+
(async () => {
45+
const source = new Source();
46+
const stream = new ReadableStream(source);
47+
48+
const { emitWarning } = process;
49+
50+
process.emitWarning = common.mustNotCall();
51+
52+
try {
53+
const reader = stream.getReader({ mode: 'byob' });
54+
55+
let result;
56+
do {
57+
result = await reader.read(Buffer.alloc(100));
58+
} while (!result.done);
59+
} finally {
60+
process.emitWarning = emitWarning;
61+
}
62+
})().then(common.mustCall());

0 commit comments

Comments
 (0)