diff options
author | Matteo Collina <hello@matteocollina.com> | 2018-11-14 17:23:28 +0100 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2018-11-21 12:16:47 +0100 |
commit | 69cc58d0ab8af1bb8328e685e967860cfb25474d (patch) | |
tree | 2880d0e168ae2d72f0abd473f7f99438a08af97c /lib/_stream_readable.js | |
parent | 8dd8b8fad9689f31673866f1b77c50098dd2c855 (diff) | |
download | android-node-v8-69cc58d0ab8af1bb8328e685e967860cfb25474d.tar.gz android-node-v8-69cc58d0ab8af1bb8328e685e967860cfb25474d.tar.bz2 android-node-v8-69cc58d0ab8af1bb8328e685e967860cfb25474d.zip |
stream: correctly pause and resume after once('readable')
Fixes: https://github.com/nodejs/node/issues/24281
PR-URL: https://github.com/nodejs/node/pull/24366
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Diffstat (limited to 'lib/_stream_readable.js')
-rw-r--r-- | lib/_stream_readable.js | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 2a2122e0e5..47dbae31b5 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -114,6 +114,7 @@ function ReadableState(options, stream, isDuplex) { this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. this.emitClose = options.emitClose !== false; @@ -862,10 +863,16 @@ Readable.prototype.removeAllListeners = function(ev) { }; function updateReadableListening(self) { - self._readableState.readableListening = self.listenerCount('readable') > 0; + const state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; - // crude way to check if we should resume - if (self.listenerCount('data') > 0) { + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; + + // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { self.resume(); } } @@ -887,6 +894,7 @@ Readable.prototype.resume = function() { state.flowing = !state.readableListening; resume(this, state); } + state.paused = false; return this; }; @@ -917,6 +925,7 @@ Readable.prototype.pause = function() { this._readableState.flowing = false; this.emit('pause'); } + this._readableState.paused = true; return this; }; |