unshift
Passing chunk
as null
signals the end of the stream (EOF) and behaves the same as readable.push(null)
, after which no more data can be written. The EOF signal is put at the end of the buffer and any buffered data will still be flushed.
The readable.unshift()
method pushes a chunk of data back into the internal buffer. This is useful in certain situations where a stream is being consumed by code that needs to "un-consume" some amount of data that it has optimistically pulled out of the source, so that the data can be passed on to some other party.
The stream.unshift(chunk)
method cannot be called after the 'end'
event has been emitted or a runtime error will be thrown.
Developers using stream.unshift()
often should consider switching to use of a Transform
stream instead. See the API for stream implementers
section for more information.
// Pull off a header delimited by \n\n.
// Use unshift() if we get too much.
// Call the callback with (error, header, stream).
const { StringDecoder } = require('node:string_decoder');
function parseHeader(stream, callback) {
stream.on('error', callback);
stream.on('readable', onReadable);
const decoder = new StringDecoder('utf8');
let header = '';
function onReadable() {
let chunk;
while (null !== (chunk = stream.read())) {
const str = decoder.write(chunk);
if (str.includes('\n\n')) {
// Found the header boundary.
const split = str.split(/\n\n/);
header += split.shift();
const remaining = split.join('\n\n');
const buf = Buffer.from(remaining, 'utf8');
stream.removeListener('error', callback);
// Remove the 'readable' listener before unshifting.
stream.removeListener('readable', onReadable);
if (buf.length)
stream.unshift(buf);
// Now the body of the message can be read from the stream.
callback(null, header, stream);
return;
}
// Still reading the header.
header += str;
}
}
}
Unlike {@link push}, stream.unshift(chunk)
will not end the reading process by resetting the internal reading state of the stream. This can cause unexpected results if readable.unshift()
is called during a read (i.e. from within a {@link _read} implementation on a custom stream). Following the call to readable.unshift()
with an immediate {@link push} will reset the reading state appropriately, however it is best to simply avoid calling readable.unshift()
while in the process of performing a read.
Since
v0.9.11
Parameters
Chunk of data to unshift onto the read queue. For streams not operating in object mode, chunk
must be a {string}, {Buffer}, {TypedArray}, {DataView} or null
. For object mode streams, chunk
may be any JavaScript value.
Encoding of string chunks. Must be a valid Buffer
encoding, such as 'utf8'
or 'ascii'
.