| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent b12b930 commit 823ee2b
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -28,6 +28,7 @@ const { | |||
| 28 | 28 | ObjectDefineProperty, | |
| 29 | 29 | ObjectSetPrototypeOf, | |
| 30 | 30 | SymbolAsyncIterator, | |
| 31 | + Symbol | ||
| 31 | 32 | } = primordials; | |
| 32 | 33 | ||
| 33 | 34 | module.exports = Readable; | |
@@ -51,6 +52,8 @@ const { | |||
| 51 | 52 | ERR_STREAM_UNSHIFT_AFTER_END_EVENT | |
| 52 | 53 | } = require('internal/errors').codes; | |
| 53 | 54 | ||
| 55 | + const kPaused = Symbol('kPaused'); | ||
| 56 | + | ||
| 54 | 57 | // Lazy loaded to improve the startup performance. | |
| 55 | 58 | let StringDecoder; | |
| 56 | 59 | let createReadableStreamAsyncIterator; | |
@@ -127,7 +130,7 @@ function ReadableState(options, stream, isDuplex) { | |||
| 127 | 130 | this.emittedReadable = false; | |
| 128 | 131 | this.readableListening = false; | |
| 129 | 132 | this.resumeScheduled = false; | |
| 130 | - this.paused = true; | ||
| 133 | + this[kPaused] = null; | ||
| 131 | 134 | ||
| 132 | 135 | // Should close be emitted on destroy. Defaults to true. | |
| 133 | 136 | this.emitClose = !options || options.emitClose !== false; | |
@@ -159,6 +162,16 @@ function ReadableState(options, stream, isDuplex) { | |||
| 159 | 162 | } | |
| 160 | 163 | } | |
| 161 | 164 | ||
| 165 | + // Legacy property for `paused` | ||
| 166 | + ObjectDefineProperty(ReadableState.prototype, 'paused', { | ||
| 167 | + get() { | ||
| 168 | + return this[kPaused] !== false; | ||
| 169 | + }, | ||
| 170 | + set(value) { | ||
| 171 | + this[kPaused] = !!value; | ||
| 172 | + } | ||
| 173 | + }); | ||
| 174 | + | ||
| 162 | 175 | function Readable(options) { | |
| 163 | 176 | if (!(this instanceof Readable)) | |
| 164 | 177 | return new Readable(options); | |
@@ -348,7 +361,8 @@ function chunkInvalid(state, chunk) { | |||
| 348 | 361 | ||
| 349 | 362 | ||
| 350 | 363 | Readable.prototype.isPaused = function() { | |
| 351 | - return this._readableState.flowing === false; | ||
| 364 | + const state = this._readableState; | ||
| 365 | + return state[kPaused] === true || state.flowing === false; | ||
| 352 | 366 | }; | |
| 353 | 367 | ||
| 354 | 368 | // Backwards compatibility. | |
@@ -947,14 +961,16 @@ function updateReadableListening(self) { | |||
| 947 | 961 | const state = self._readableState; | |
| 948 | 962 | state.readableListening = self.listenerCount('readable') > 0; | |
| 949 | 963 | ||
| 950 | - if (state.resumeScheduled && !state.paused) { | ||
| 964 | + if (state.resumeScheduled && state[kPaused] === false) { | ||
| 951 | 965 | // Flowing needs to be set to true now, otherwise | |
| 952 | 966 | // the upcoming resume will not flow. | |
| 953 | 967 | state.flowing = true; | |
| 954 | 968 | ||
| 955 | 969 | // Crude way to check if we should resume | |
| 956 | 970 | } else if (self.listenerCount('data') > 0) { | |
| 957 | 971 | self.resume(); | |
| 972 | + } else if (!state.readableListening) { | ||
| 973 | + state.flowing = null; | ||
| 958 | 974 | } | |
| 959 | 975 | } | |
| 960 | 976 | ||
@@ -975,7 +991,7 @@ Readable.prototype.resume = function() { | |||
| 975 | 991 | state.flowing = !state.readableListening; | |
| 976 | 992 | resume(this, state); | |
| 977 | 993 | } | |
| 978 | - state.paused = false; | ||
| 994 | + state[kPaused] = false; | ||
| 979 | 995 | return this; | |
| 980 | 996 | }; | |
| 981 | 997 | ||
@@ -1006,7 +1022,7 @@ Readable.prototype.pause = function() { | |||
| 1006 | 1022 | this._readableState.flowing = false; | |
| 1007 | 1023 | this.emit('pause'); | |
| 1008 | 1024 | } | |
| 1009 | - this._readableState.paused = true; | ||
| 1025 | + this._readableState[kPaused] = true; | ||
| 1010 | 1026 | return this; | |
| 1011 | 1027 | }; | |
| 1012 | 1028 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,19 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + const common = require('../common'); | ||
| 3 | + | ||
| 4 | + const { Readable } = require('stream'); | ||
| 5 | + | ||
| 6 | + const readable = new Readable({ | ||
| 7 | + read() {} | ||
| 8 | + }); | ||
| 9 | + | ||
| 10 | + function read() {} | ||
| 11 | + | ||
| 12 | + readable.setEncoding('utf8'); | ||
| 13 | + readable.on('readable', read); | ||
| 14 | + readable.removeListener('readable', read); | ||
| 15 | + | ||
| 16 | + process.nextTick(function() { | ||
| 17 | + readable.on('data', common.mustCall()); | ||
| 18 | + readable.push('hello'); | ||
| 19 | + }); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,7 @@ | |||
| 1 | 1 | 'use strict'; | |
| 2 | 2 | ||
| 3 | 3 | const common = require('../common'); | |
| 4 | + const assert = require('assert'); | ||
| 4 | 5 | const { Readable } = require('stream'); | |
| 5 | 6 | ||
| 6 | 7 | let ticks = 18; | |
@@ -38,3 +39,20 @@ function readAndPause() { | |||
| 38 | 39 | ||
| 39 | 40 | rs.on('data', ondata); | |
| 40 | 41 | } | |
| 42 | + | ||
| 43 | + { | ||
| 44 | + const readable = new Readable({ | ||
| 45 | + read() {} | ||
| 46 | + }); | ||
| 47 | + | ||
| 48 | + function read() {} | ||
| 49 | + | ||
| 50 | + readable.setEncoding('utf8'); | ||
| 51 | + readable.on('readable', read); | ||
| 52 | + readable.removeListener('readable', read); | ||
| 53 | + readable.pause(); | ||
| 54 | + | ||
| 55 | + process.nextTick(function() { | ||
| 56 | + assert(readable.isPaused()); | ||
| 57 | + }); | ||
| 58 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments