Closed
Description
In the documentation for stream.Readable, 'API for Stream Implementors', the documentation states that push should continue to be called until it returns false. However when calling push from an async callback each push call will call _read, leading to unexpected behaviour.
Example:
var stream = require('stream');
var util = require('util');
util.inherits(TestStream, stream.Readable);
function TestStream(options) {
stream.Readable.call(this, options);
}
TestStream.prototype._read = function(n) {
var mthis = this;
setTimeout(function() {
for (var i = 0; i < 5; ++i)
if (!mthis.push('x'))
break;
}, 2000);
};
var s = new TestStream();
s.pipe(process.stdout);
I expect this to output up to 5 'x' characters every 2 seconds. However, because each push call also does a _read call, after 2 seconds 5 callbacks will be registered and after 2 more seconds 25 'x' characters will be output.
I think push should not call _read like this, or at least return false after it has done so.