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

2 files changed

Lines changed: 69 additions & 0 deletions

File tree

‎lib/internal/webstreams/readablestream.js‎

Lines changed: 7 additions & 0 deletions
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
constassert=require('internal/assert');
136138

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict';
2+
3+
constcommon=require('../common');
4+
5+
const{
6+
open,
7+
}=require('fs/promises');
8+
9+
const{
10+
Buffer,
11+
}=require('buffer');
12+
13+
classSource{
14+
asyncstart(controller){
15+
this.file=awaitopen(__filename);
16+
this.controller=controller;
17+
}
18+
19+
asyncpull(controller){
20+
constbyobRequest=controller.byobRequest;
21+
constview=byobRequest.view;
22+
23+
const{
24+
bytesRead,
25+
}=awaitthis.file.read({
26+
buffer: view,
27+
offset: view.byteOffset,
28+
length: view.byteLength
29+
});
30+
31+
if(bytesRead===0){
32+
awaitthis.file.close();
33+
this.controller.close();
34+
}
35+
36+
byobRequest.respond(bytesRead);
37+
}
38+
39+
gettype(){return'bytes';}
40+
41+
getautoAllocateChunkSize(){return1024;}
42+
}
43+
44+
(async()=>{
45+
constsource=newSource();
46+
conststream=newReadableStream(source);
47+
48+
const{ emitWarning }=process;
49+
50+
process.emitWarning=common.mustNotCall();
51+
52+
try{
53+
constreader=stream.getReader({mode: 'byob'});
54+
55+
letresult;
56+
do{
57+
result=awaitreader.read(Buffer.alloc(100));
58+
}while(!result.done);
59+
}finally{
60+
process.emitWarning=emitWarning;
61+
}
62+
})().then(common.mustCall());

0 commit comments

Comments
 (0)