-
-
Notifications
You must be signed in to change notification settings - Fork 33.5k
Description
If null
is written to an instance of stream.Transform
, the stream does not complete additional writes, emit additional data, nor emit an 'error'
or 'end'
event. As an example, consider the following:
var stream = require('stream');
var s = new stream.Transform({
objectMode: true,
transform: function(chunk, encoding, callback) {
console.log('transform', chunk);
callback(null, chunk);
}
});
s.on('data', console.log.bind(console, 'data'));
s.on('error', console.log.bind(console, 'error'));
s.on('end', console.log.bind(console, 'end'));
s.write('input1', console.log.bind(console, 'finished write1'));
s.write(null, console.log.bind(console, 'finished write2'));
s.write('input2', console.log.bind(console, 'finished write3'));
s.end();
This prints
transform input1
data input1
finished write1
Instead of write2 either causing an error or being ignored and write3 completing normally followed by 'end'
.
This occurs because null
writechunk
skips ._transform
without calling ts.writecb
causing Writable
to buffer subsequent writes waiting for ._write(null, ...)
to complete. This behavior has been present since 26ca7d7.
If there is agreement on the appropriate behavior, I can work up a PR. I would suggest removing the ts.writechunk !== null
check so that the value will be passed to ._transform
to match the current handling of undefined
. If _.transform
returns it unchanged, it would be ignored, like undefined
. Discarding the write, with or without error, could be reasonable as well.
Thanks for considering,
Kevin