@@ -42,6 +42,8 @@ const EE = require('events');
4242const { Stream, prependListener } = require ( 'internal/streams/legacy' ) ;
4343const { Buffer } = require ( 'buffer' ) ;
4444
45+ const { TextEncoder } = require ( 'internal/encoding' ) ;
46+
4547const {
4648 addAbortSignal,
4749} = require ( 'internal/streams/add-abort-signal' ) ;
@@ -73,6 +75,9 @@ const kPaused = Symbol('kPaused');
7375
7476const { StringDecoder } = require ( 'string_decoder' ) ;
7577const from = require ( 'internal/streams/from' ) ;
78+ const { normalizeEncoding } = require ( 'internal/util' ) ;
79+ const { FastBuffer } = require ( 'internal/buffer' ) ;
80+ const encoder = new TextEncoder ( ) ;
7681
7782ObjectSetPrototypeOf ( Readable . prototype , Stream . prototype ) ;
7883ObjectSetPrototypeOf ( Readable , Stream ) ;
@@ -251,9 +256,17 @@ function readableAddChunk(stream, chunk, encoding, addToFront) {
251256 if ( addToFront && state . encoding ) {
252257 // When unshifting, if state.encoding is set, we have to save
253258 // the string in the BufferList with the state encoding.
259+
254260 chunk = Buffer . from ( chunk , encoding ) . toString ( state . encoding ) ;
255261 } else {
256- chunk = Buffer . from ( chunk , encoding ) ;
262+ const enc = normalizeEncoding ( encoding ) ;
263+
264+ if ( enc === 'utf8' ) {
265+ const buf = encoder . encode ( chunk ) ;
266+ chunk = new FastBuffer ( buf . buffer , buf . byteOffset , buf . byteLength ) ;
267+ } else {
268+ chunk = Buffer . from ( chunk , enc ) ;
269+ }
257270 encoding = '' ;
258271 }
259272 }
0 commit comments