stream: make _read() be called indefinitely if the user wants so
Fixes: https://github.com/nodejs/node/issues/26097 PR-URL: https://github.com/nodejs/node/pull/26135 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
0d64a56012
commit
cd302d70dd
@ -495,6 +495,7 @@ Readable.prototype.read = function(n) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function onEofChunk(stream, state) {
|
function onEofChunk(stream, state) {
|
||||||
|
debug('onEofChunk');
|
||||||
if (state.ended) return;
|
if (state.ended) return;
|
||||||
if (state.decoder) {
|
if (state.decoder) {
|
||||||
var chunk = state.decoder.end();
|
var chunk = state.decoder.end();
|
||||||
@ -525,6 +526,7 @@ function onEofChunk(stream, state) {
|
|||||||
// a nextTick recursion warning, but that's not so bad.
|
// a nextTick recursion warning, but that's not so bad.
|
||||||
function emitReadable(stream) {
|
function emitReadable(stream) {
|
||||||
var state = stream._readableState;
|
var state = stream._readableState;
|
||||||
|
debug('emitReadable', state.needReadable, state.emittedReadable);
|
||||||
state.needReadable = false;
|
state.needReadable = false;
|
||||||
if (!state.emittedReadable) {
|
if (!state.emittedReadable) {
|
||||||
debug('emitReadable', state.flowing);
|
debug('emitReadable', state.flowing);
|
||||||
@ -538,6 +540,7 @@ function emitReadable_(stream) {
|
|||||||
debug('emitReadable_', state.destroyed, state.length, state.ended);
|
debug('emitReadable_', state.destroyed, state.length, state.ended);
|
||||||
if (!state.destroyed && (state.length || state.ended)) {
|
if (!state.destroyed && (state.length || state.ended)) {
|
||||||
stream.emit('readable');
|
stream.emit('readable');
|
||||||
|
state.emittedReadable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The stream needs another readable event if
|
// The stream needs another readable event if
|
||||||
|
32
test/parallel/test-stream-readable-infinite-read.js
Normal file
32
test/parallel/test-stream-readable-infinite-read.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const { Readable } = require('stream');
|
||||||
|
|
||||||
|
const buf = Buffer.alloc(8192);
|
||||||
|
|
||||||
|
const readable = new Readable({
|
||||||
|
read: common.mustCall(function() {
|
||||||
|
this.push(buf);
|
||||||
|
}, 31)
|
||||||
|
});
|
||||||
|
|
||||||
|
let i = 0;
|
||||||
|
|
||||||
|
readable.on('readable', common.mustCall(function() {
|
||||||
|
if (i++ === 10) {
|
||||||
|
// We will just terminate now.
|
||||||
|
process.removeAllListeners('readable');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = readable.read();
|
||||||
|
// TODO(mcollina): there is something odd in the highWaterMark logic
|
||||||
|
// investigate.
|
||||||
|
if (i === 1) {
|
||||||
|
assert.strictEqual(data.length, 8192 * 2);
|
||||||
|
} else {
|
||||||
|
assert.strictEqual(data.length, 8192 * 3);
|
||||||
|
}
|
||||||
|
}, 11));
|
Loading…
x
Reference in New Issue
Block a user