diff options
author | Matteo Collina <hello@matteocollina.com> | 2019-02-15 17:19:38 +0100 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2019-02-28 16:12:26 +0100 |
commit | cd302d70ddd0d1c249a7242ef7eb1b90bf8eb0de (patch) | |
tree | 602bd5550ee82467ed98a55e291df66c27a44991 | |
parent | 0d64a560121e7420df9df7c2b5a7e162c4ef307b (diff) | |
download | android-node-v8-cd302d70ddd0d1c249a7242ef7eb1b90bf8eb0de.tar.gz android-node-v8-cd302d70ddd0d1c249a7242ef7eb1b90bf8eb0de.tar.bz2 android-node-v8-cd302d70ddd0d1c249a7242ef7eb1b90bf8eb0de.zip |
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>
-rw-r--r-- | lib/_stream_readable.js | 3 | ||||
-rw-r--r-- | test/parallel/test-stream-readable-infinite-read.js | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 8db8848ba1..1fe5e0573d 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -495,6 +495,7 @@ Readable.prototype.read = function(n) { }; function onEofChunk(stream, state) { + debug('onEofChunk'); if (state.ended) return; if (state.decoder) { var chunk = state.decoder.end(); @@ -525,6 +526,7 @@ function onEofChunk(stream, state) { // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); state.needReadable = false; if (!state.emittedReadable) { debug('emitReadable', state.flowing); @@ -538,6 +540,7 @@ function emitReadable_(stream) { debug('emitReadable_', state.destroyed, state.length, state.ended); if (!state.destroyed && (state.length || state.ended)) { stream.emit('readable'); + state.emittedReadable = false; } // The stream needs another readable event if diff --git a/test/parallel/test-stream-readable-infinite-read.js b/test/parallel/test-stream-readable-infinite-read.js new file mode 100644 index 0000000000..3df3e39a73 --- /dev/null +++ b/test/parallel/test-stream-readable-infinite-read.js @@ -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)); |