pnpm 6.22.2 → 6.23.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node_modules/ansi-regex/index.js +8 -2
- package/dist/node_modules/ansi-regex/license +4 -16
- package/dist/node_modules/ansi-regex/package.json +53 -62
- package/dist/node_modules/aproba/index.js +33 -33
- package/dist/node_modules/aproba/package.json +5 -4
- package/dist/node_modules/are-we-there-yet/{index.js → lib/index.js} +0 -0
- package/dist/node_modules/are-we-there-yet/{tracker-base.js → lib/tracker-base.js} +0 -0
- package/dist/node_modules/are-we-there-yet/{tracker-group.js → lib/tracker-group.js} +14 -5
- package/dist/node_modules/are-we-there-yet/{tracker-stream.js → lib/tracker-stream.js} +0 -0
- package/dist/node_modules/are-we-there-yet/{tracker.js → lib/tracker.js} +3 -1
- package/dist/node_modules/are-we-there-yet/package.json +35 -17
- package/dist/node_modules/{npmlog → color-support}/LICENSE +0 -0
- package/dist/node_modules/color-support/bin.js +3 -0
- package/dist/node_modules/color-support/browser.js +14 -0
- package/dist/node_modules/color-support/index.js +134 -0
- package/dist/node_modules/color-support/package.json +36 -0
- package/dist/node_modules/debug/LICENSE +10 -9
- package/dist/node_modules/debug/package.json +6 -6
- package/dist/node_modules/debug/src/common.js +1 -1
- package/dist/node_modules/gauge/{base-theme.js → lib/base-theme.js} +7 -3
- package/dist/node_modules/gauge/lib/demo.js +45 -0
- package/dist/node_modules/gauge/{error.js → lib/error.js} +0 -0
- package/dist/node_modules/gauge/lib/has-color.js +4 -0
- package/dist/node_modules/gauge/{index.js → lib/index.js} +90 -33
- package/dist/node_modules/gauge/{plumbing.js → lib/plumbing.js} +3 -1
- package/dist/node_modules/gauge/{process.js → lib/process.js} +0 -0
- package/dist/node_modules/gauge/{progress-bar.js → lib/progress-bar.js} +12 -6
- package/dist/node_modules/gauge/{render-template.js → lib/render-template.js} +69 -28
- package/dist/node_modules/gauge/{set-immediate.js → lib/set-immediate.js} +0 -0
- package/dist/node_modules/gauge/{set-interval.js → lib/set-interval.js} +0 -0
- package/dist/node_modules/gauge/{spin.js → lib/spin.js} +0 -0
- package/dist/node_modules/gauge/{template-item.js → lib/template-item.js} +21 -7
- package/dist/node_modules/gauge/{theme-set.js → lib/theme-set.js} +31 -24
- package/dist/node_modules/gauge/lib/themes.js +56 -0
- package/dist/node_modules/gauge/{wide-truncate.js → lib/wide-truncate.js} +9 -3
- package/dist/node_modules/gauge/package.json +39 -40
- package/dist/node_modules/is-fullwidth-code-point/index.js +40 -36
- package/dist/node_modules/is-fullwidth-code-point/license +4 -16
- package/dist/node_modules/is-fullwidth-code-point/package.json +40 -43
- package/dist/node_modules/node-gyp/package.json +2 -2
- package/dist/node_modules/npmlog/{log.js → lib/log.js} +148 -54
- package/dist/node_modules/npmlog/package.json +30 -12
- package/dist/node_modules/readable-stream/errors-browser.js +127 -0
- package/dist/node_modules/readable-stream/errors.js +116 -0
- package/dist/node_modules/readable-stream/experimentalWarning.js +17 -0
- package/dist/node_modules/readable-stream/lib/_stream_duplex.js +52 -44
- package/dist/node_modules/readable-stream/lib/_stream_passthrough.js +1 -9
- package/dist/node_modules/readable-stream/lib/_stream_readable.js +446 -341
- package/dist/node_modules/readable-stream/lib/_stream_transform.js +29 -42
- package/dist/node_modules/readable-stream/lib/_stream_writable.js +200 -190
- package/dist/node_modules/readable-stream/lib/internal/streams/async_iterator.js +207 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/buffer_list.js +210 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/destroy.js +48 -17
- package/dist/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +104 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/from.js +64 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/pipeline.js +97 -0
- package/dist/node_modules/readable-stream/lib/internal/streams/state.js +27 -0
- package/dist/node_modules/readable-stream/package.json +35 -19
- package/dist/node_modules/readable-stream/readable-browser.js +2 -0
- package/dist/node_modules/readable-stream/readable.js +5 -8
- package/dist/node_modules/safe-buffer/index.js +3 -0
- package/dist/node_modules/safe-buffer/package.json +18 -4
- package/dist/node_modules/signal-exit/index.js +30 -8
- package/dist/node_modules/signal-exit/package.json +7 -5
- package/dist/node_modules/socks-proxy-agent/package.json +2 -2
- package/dist/node_modules/string-width/index.js +29 -19
- package/dist/node_modules/string-width/license +4 -16
- package/dist/node_modules/string-width/package.json +54 -54
- package/dist/node_modules/string_decoder/package.json +5 -2
- package/dist/node_modules/strip-ansi/index.js +2 -4
- package/dist/node_modules/strip-ansi/license +4 -16
- package/dist/node_modules/strip-ansi/package.json +52 -55
- package/dist/pnpm.cjs +52779 -4337
- package/package.json +18 -18
- package/dist/node_modules/are-we-there-yet/LICENSE +0 -5
- package/dist/node_modules/code-point-at/index.js +0 -32
- package/dist/node_modules/code-point-at/license +0 -21
- package/dist/node_modules/code-point-at/package.json +0 -38
- package/dist/node_modules/core-util-is/LICENSE +0 -19
- package/dist/node_modules/core-util-is/lib/util.js +0 -107
- package/dist/node_modules/core-util-is/package.json +0 -38
- package/dist/node_modules/gauge/LICENSE +0 -13
- package/dist/node_modules/gauge/has-color.js +0 -12
- package/dist/node_modules/gauge/themes.js +0 -54
- package/dist/node_modules/isarray/component.json +0 -19
- package/dist/node_modules/isarray/index.js +0 -5
- package/dist/node_modules/isarray/package.json +0 -45
- package/dist/node_modules/isarray/test.js +0 -20
- package/dist/node_modules/number-is-nan/index.js +0 -4
- package/dist/node_modules/number-is-nan/license +0 -21
- package/dist/node_modules/number-is-nan/package.json +0 -35
- package/dist/node_modules/object-assign/index.js +0 -90
- package/dist/node_modules/object-assign/license +0 -21
- package/dist/node_modules/object-assign/package.json +0 -42
- package/dist/node_modules/process-nextick-args/index.js +0 -45
- package/dist/node_modules/process-nextick-args/package.json +0 -25
- package/dist/node_modules/readable-stream/duplex-browser.js +0 -1
- package/dist/node_modules/readable-stream/duplex.js +0 -1
- package/dist/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -79
- package/dist/node_modules/readable-stream/passthrough.js +0 -1
- package/dist/node_modules/readable-stream/transform.js +0 -1
- package/dist/node_modules/readable-stream/writable-browser.js +0 -1
- package/dist/node_modules/readable-stream/writable.js +0 -8
- package/dist/node_modules/wide-align/node_modules/ansi-regex/index.js +0 -10
- package/dist/node_modules/wide-align/node_modules/ansi-regex/license +0 -9
- package/dist/node_modules/wide-align/node_modules/ansi-regex/package.json +0 -55
- package/dist/node_modules/wide-align/node_modules/is-fullwidth-code-point/index.js +0 -50
- package/dist/node_modules/wide-align/node_modules/is-fullwidth-code-point/license +0 -9
- package/dist/node_modules/wide-align/node_modules/is-fullwidth-code-point/package.json +0 -42
- package/dist/node_modules/wide-align/node_modules/string-width/index.js +0 -47
- package/dist/node_modules/wide-align/node_modules/string-width/license +0 -9
- package/dist/node_modules/wide-align/node_modules/string-width/package.json +0 -56
- package/dist/node_modules/wide-align/node_modules/strip-ansi/index.js +0 -4
- package/dist/node_modules/wide-align/node_modules/strip-ansi/license +0 -9
- package/dist/node_modules/wide-align/node_modules/strip-ansi/package.json +0 -54
|
@@ -18,118 +18,110 @@
|
|
|
18
18
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
19
19
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
20
20
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
-
|
|
22
21
|
'use strict';
|
|
23
22
|
|
|
24
|
-
/*<replacement>*/
|
|
25
|
-
|
|
26
|
-
var pna = require('process-nextick-args');
|
|
27
|
-
/*</replacement>*/
|
|
28
|
-
|
|
29
23
|
module.exports = Readable;
|
|
30
|
-
|
|
31
24
|
/*<replacement>*/
|
|
32
|
-
var isArray = require('isarray');
|
|
33
|
-
/*</replacement>*/
|
|
34
25
|
|
|
35
|
-
/*<replacement>*/
|
|
36
26
|
var Duplex;
|
|
37
27
|
/*</replacement>*/
|
|
38
28
|
|
|
39
29
|
Readable.ReadableState = ReadableState;
|
|
40
|
-
|
|
41
30
|
/*<replacement>*/
|
|
31
|
+
|
|
42
32
|
var EE = require('events').EventEmitter;
|
|
43
33
|
|
|
44
|
-
var EElistenerCount = function (emitter, type) {
|
|
34
|
+
var EElistenerCount = function EElistenerCount(emitter, type) {
|
|
45
35
|
return emitter.listeners(type).length;
|
|
46
36
|
};
|
|
47
37
|
/*</replacement>*/
|
|
48
38
|
|
|
49
39
|
/*<replacement>*/
|
|
40
|
+
|
|
41
|
+
|
|
50
42
|
var Stream = require('./internal/streams/stream');
|
|
51
43
|
/*</replacement>*/
|
|
52
44
|
|
|
53
|
-
/*<replacement>*/
|
|
54
45
|
|
|
55
|
-
var Buffer = require('
|
|
46
|
+
var Buffer = require('buffer').Buffer;
|
|
47
|
+
|
|
56
48
|
var OurUint8Array = global.Uint8Array || function () {};
|
|
49
|
+
|
|
57
50
|
function _uint8ArrayToBuffer(chunk) {
|
|
58
51
|
return Buffer.from(chunk);
|
|
59
52
|
}
|
|
53
|
+
|
|
60
54
|
function _isUint8Array(obj) {
|
|
61
55
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
62
56
|
}
|
|
63
|
-
|
|
64
|
-
/*</replacement>*/
|
|
65
|
-
|
|
66
57
|
/*<replacement>*/
|
|
67
|
-
var util = Object.create(require('core-util-is'));
|
|
68
|
-
util.inherits = require('inherits');
|
|
69
|
-
/*</replacement>*/
|
|
70
58
|
|
|
71
|
-
|
|
59
|
+
|
|
72
60
|
var debugUtil = require('util');
|
|
73
|
-
|
|
61
|
+
|
|
62
|
+
var debug;
|
|
63
|
+
|
|
74
64
|
if (debugUtil && debugUtil.debuglog) {
|
|
75
65
|
debug = debugUtil.debuglog('stream');
|
|
76
66
|
} else {
|
|
77
|
-
debug = function () {};
|
|
67
|
+
debug = function debug() {};
|
|
78
68
|
}
|
|
79
69
|
/*</replacement>*/
|
|
80
70
|
|
|
81
|
-
|
|
71
|
+
|
|
72
|
+
var BufferList = require('./internal/streams/buffer_list');
|
|
73
|
+
|
|
82
74
|
var destroyImpl = require('./internal/streams/destroy');
|
|
75
|
+
|
|
76
|
+
var _require = require('./internal/streams/state'),
|
|
77
|
+
getHighWaterMark = _require.getHighWaterMark;
|
|
78
|
+
|
|
79
|
+
var _require$codes = require('../errors').codes,
|
|
80
|
+
ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
|
|
81
|
+
ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
|
|
82
|
+
ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
|
|
83
|
+
ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.
|
|
84
|
+
|
|
85
|
+
|
|
83
86
|
var StringDecoder;
|
|
87
|
+
var createReadableStreamAsyncIterator;
|
|
88
|
+
var from;
|
|
84
89
|
|
|
85
|
-
|
|
90
|
+
require('inherits')(Readable, Stream);
|
|
86
91
|
|
|
92
|
+
var errorOrDestroy = destroyImpl.errorOrDestroy;
|
|
87
93
|
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
|
|
88
94
|
|
|
89
95
|
function prependListener(emitter, event, fn) {
|
|
90
96
|
// Sadly this is not cacheable as some libraries bundle their own
|
|
91
97
|
// event emitter implementation with them.
|
|
92
|
-
if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
|
|
93
|
-
|
|
94
|
-
// This is a hack to make sure that our error handler is attached before any
|
|
98
|
+
if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
|
|
95
99
|
// userland ones. NEVER DO THIS. This is here only because this code needs
|
|
96
100
|
// to continue to work with older versions of Node.js that do not include
|
|
97
101
|
// the prependListener() method. The goal is to eventually remove this hack.
|
|
98
|
-
|
|
102
|
+
|
|
103
|
+
if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
|
|
99
104
|
}
|
|
100
105
|
|
|
101
|
-
function ReadableState(options, stream) {
|
|
106
|
+
function ReadableState(options, stream, isDuplex) {
|
|
102
107
|
Duplex = Duplex || require('./_stream_duplex');
|
|
103
|
-
|
|
104
|
-
options = options || {};
|
|
105
|
-
|
|
106
|
-
// Duplex streams are both readable and writable, but share
|
|
108
|
+
options = options || {}; // Duplex streams are both readable and writable, but share
|
|
107
109
|
// the same options object.
|
|
108
110
|
// However, some cases require setting options to different
|
|
109
111
|
// values for the readable and the writable sides of the duplex stream.
|
|
110
112
|
// These options can be provided separately as readableXXX and writableXXX.
|
|
111
|
-
var isDuplex = stream instanceof Duplex;
|
|
112
113
|
|
|
113
|
-
// object stream flag. Used to make read(n) ignore n and to
|
|
114
|
+
if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
|
|
114
115
|
// make all the buffer merging and length checks go away
|
|
115
|
-
this.objectMode = !!options.objectMode;
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
// the point at which it stops calling _read() to fill the buffer
|
|
117
|
+
this.objectMode = !!options.objectMode;
|
|
118
|
+
if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
|
|
120
119
|
// Note: 0 is a valid value, means "don't call _read preemptively ever"
|
|
121
|
-
var hwm = options.highWaterMark;
|
|
122
|
-
var readableHwm = options.readableHighWaterMark;
|
|
123
|
-
var defaultHwm = this.objectMode ? 16 : 16 * 1024;
|
|
124
|
-
|
|
125
|
-
if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
|
|
126
|
-
|
|
127
|
-
// cast to ints.
|
|
128
|
-
this.highWaterMark = Math.floor(this.highWaterMark);
|
|
129
120
|
|
|
130
|
-
// A linked list is used to store data chunks instead of an array because the
|
|
121
|
+
this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the
|
|
131
122
|
// linked list can remove elements from the beginning faster than
|
|
132
123
|
// array.shift()
|
|
124
|
+
|
|
133
125
|
this.buffer = new BufferList();
|
|
134
126
|
this.length = 0;
|
|
135
127
|
this.pipes = null;
|
|
@@ -137,37 +129,36 @@ function ReadableState(options, stream) {
|
|
|
137
129
|
this.flowing = null;
|
|
138
130
|
this.ended = false;
|
|
139
131
|
this.endEmitted = false;
|
|
140
|
-
this.reading = false;
|
|
141
|
-
|
|
142
|
-
// a flag to be able to tell if the event 'readable'/'data' is emitted
|
|
132
|
+
this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
|
|
143
133
|
// immediately, or on a later tick. We set this to true at first, because
|
|
144
134
|
// any actions that shouldn't happen until "later" should generally also
|
|
145
135
|
// not happen before the first read call.
|
|
146
|
-
this.sync = true;
|
|
147
136
|
|
|
148
|
-
// whenever we return null, then we set a flag to say
|
|
137
|
+
this.sync = true; // whenever we return null, then we set a flag to say
|
|
149
138
|
// that we're awaiting a 'readable' event emission.
|
|
139
|
+
|
|
150
140
|
this.needReadable = false;
|
|
151
141
|
this.emittedReadable = false;
|
|
152
142
|
this.readableListening = false;
|
|
153
143
|
this.resumeScheduled = false;
|
|
144
|
+
this.paused = true; // Should close be emitted on destroy. Defaults to true.
|
|
154
145
|
|
|
155
|
-
//
|
|
156
|
-
this.destroyed = false;
|
|
146
|
+
this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')
|
|
157
147
|
|
|
158
|
-
|
|
148
|
+
this.autoDestroy = !!options.autoDestroy; // has it been destroyed
|
|
149
|
+
|
|
150
|
+
this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string
|
|
159
151
|
// encoding is 'binary' so we have to make this configurable.
|
|
160
152
|
// Everything else in the universe uses 'utf8', though.
|
|
161
|
-
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
|
162
153
|
|
|
163
|
-
// the number of writers that are awaiting a drain event in .pipe()s
|
|
164
|
-
this.awaitDrain = 0;
|
|
154
|
+
this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s
|
|
165
155
|
|
|
166
|
-
// if true, a maybeReadMore has been scheduled
|
|
167
|
-
this.readingMore = false;
|
|
156
|
+
this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
|
|
168
157
|
|
|
158
|
+
this.readingMore = false;
|
|
169
159
|
this.decoder = null;
|
|
170
160
|
this.encoding = null;
|
|
161
|
+
|
|
171
162
|
if (options.encoding) {
|
|
172
163
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
173
164
|
this.decoder = new StringDecoder(options.encoding);
|
|
@@ -177,17 +168,16 @@ function ReadableState(options, stream) {
|
|
|
177
168
|
|
|
178
169
|
function Readable(options) {
|
|
179
170
|
Duplex = Duplex || require('./_stream_duplex');
|
|
171
|
+
if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside
|
|
172
|
+
// the ReadableState constructor, at least with V8 6.5
|
|
180
173
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
this._readableState = new ReadableState(options, this);
|
|
174
|
+
var isDuplex = this instanceof Duplex;
|
|
175
|
+
this._readableState = new ReadableState(options, this, isDuplex); // legacy
|
|
184
176
|
|
|
185
|
-
// legacy
|
|
186
177
|
this.readable = true;
|
|
187
178
|
|
|
188
179
|
if (options) {
|
|
189
180
|
if (typeof options.read === 'function') this._read = options.read;
|
|
190
|
-
|
|
191
181
|
if (typeof options.destroy === 'function') this._destroy = options.destroy;
|
|
192
182
|
}
|
|
193
183
|
|
|
@@ -195,36 +185,40 @@ function Readable(options) {
|
|
|
195
185
|
}
|
|
196
186
|
|
|
197
187
|
Object.defineProperty(Readable.prototype, 'destroyed', {
|
|
198
|
-
|
|
188
|
+
// making it explicit this property is not enumerable
|
|
189
|
+
// because otherwise some prototype manipulation in
|
|
190
|
+
// userland will fail
|
|
191
|
+
enumerable: false,
|
|
192
|
+
get: function get() {
|
|
199
193
|
if (this._readableState === undefined) {
|
|
200
194
|
return false;
|
|
201
195
|
}
|
|
196
|
+
|
|
202
197
|
return this._readableState.destroyed;
|
|
203
198
|
},
|
|
204
|
-
set: function (value) {
|
|
199
|
+
set: function set(value) {
|
|
205
200
|
// we ignore the value if the stream
|
|
206
201
|
// has not been initialized yet
|
|
207
202
|
if (!this._readableState) {
|
|
208
203
|
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// backward compatibility, the user is explicitly
|
|
204
|
+
} // backward compatibility, the user is explicitly
|
|
212
205
|
// managing destroyed
|
|
206
|
+
|
|
207
|
+
|
|
213
208
|
this._readableState.destroyed = value;
|
|
214
209
|
}
|
|
215
210
|
});
|
|
216
|
-
|
|
217
211
|
Readable.prototype.destroy = destroyImpl.destroy;
|
|
218
212
|
Readable.prototype._undestroy = destroyImpl.undestroy;
|
|
213
|
+
|
|
219
214
|
Readable.prototype._destroy = function (err, cb) {
|
|
220
|
-
this.push(null);
|
|
221
215
|
cb(err);
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
// Manually shove something into the read() buffer.
|
|
216
|
+
}; // Manually shove something into the read() buffer.
|
|
225
217
|
// This returns true if the highWaterMark has not been hit yet,
|
|
226
218
|
// similar to how Writable.write() returns true if you should
|
|
227
219
|
// write() some more.
|
|
220
|
+
|
|
221
|
+
|
|
228
222
|
Readable.prototype.push = function (chunk, encoding) {
|
|
229
223
|
var state = this._readableState;
|
|
230
224
|
var skipChunkCheck;
|
|
@@ -232,10 +226,12 @@ Readable.prototype.push = function (chunk, encoding) {
|
|
|
232
226
|
if (!state.objectMode) {
|
|
233
227
|
if (typeof chunk === 'string') {
|
|
234
228
|
encoding = encoding || state.defaultEncoding;
|
|
229
|
+
|
|
235
230
|
if (encoding !== state.encoding) {
|
|
236
231
|
chunk = Buffer.from(chunk, encoding);
|
|
237
232
|
encoding = '';
|
|
238
233
|
}
|
|
234
|
+
|
|
239
235
|
skipChunkCheck = true;
|
|
240
236
|
}
|
|
241
237
|
} else {
|
|
@@ -243,34 +239,40 @@ Readable.prototype.push = function (chunk, encoding) {
|
|
|
243
239
|
}
|
|
244
240
|
|
|
245
241
|
return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
|
|
246
|
-
};
|
|
242
|
+
}; // Unshift should *always* be something directly out of read()
|
|
243
|
+
|
|
247
244
|
|
|
248
|
-
// Unshift should *always* be something directly out of read()
|
|
249
245
|
Readable.prototype.unshift = function (chunk) {
|
|
250
246
|
return readableAddChunk(this, chunk, null, true, false);
|
|
251
247
|
};
|
|
252
248
|
|
|
253
249
|
function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
|
|
250
|
+
debug('readableAddChunk', chunk);
|
|
254
251
|
var state = stream._readableState;
|
|
252
|
+
|
|
255
253
|
if (chunk === null) {
|
|
256
254
|
state.reading = false;
|
|
257
255
|
onEofChunk(stream, state);
|
|
258
256
|
} else {
|
|
259
257
|
var er;
|
|
260
258
|
if (!skipChunkCheck) er = chunkInvalid(state, chunk);
|
|
259
|
+
|
|
261
260
|
if (er) {
|
|
262
|
-
stream
|
|
261
|
+
errorOrDestroy(stream, er);
|
|
263
262
|
} else if (state.objectMode || chunk && chunk.length > 0) {
|
|
264
263
|
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
|
|
265
264
|
chunk = _uint8ArrayToBuffer(chunk);
|
|
266
265
|
}
|
|
267
266
|
|
|
268
267
|
if (addToFront) {
|
|
269
|
-
if (state.endEmitted) stream
|
|
268
|
+
if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
|
|
270
269
|
} else if (state.ended) {
|
|
271
|
-
stream
|
|
270
|
+
errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
|
|
271
|
+
} else if (state.destroyed) {
|
|
272
|
+
return false;
|
|
272
273
|
} else {
|
|
273
274
|
state.reading = false;
|
|
275
|
+
|
|
274
276
|
if (state.decoder && !encoding) {
|
|
275
277
|
chunk = state.decoder.write(chunk);
|
|
276
278
|
if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
|
|
@@ -280,61 +282,73 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
|
|
|
280
282
|
}
|
|
281
283
|
} else if (!addToFront) {
|
|
282
284
|
state.reading = false;
|
|
285
|
+
maybeReadMore(stream, state);
|
|
283
286
|
}
|
|
284
|
-
}
|
|
287
|
+
} // We can push more data if we are below the highWaterMark.
|
|
288
|
+
// Also, if we have no data yet, we can stand some more bytes.
|
|
289
|
+
// This is to work around cases where hwm=0, such as the repl.
|
|
285
290
|
|
|
286
|
-
|
|
291
|
+
|
|
292
|
+
return !state.ended && (state.length < state.highWaterMark || state.length === 0);
|
|
287
293
|
}
|
|
288
294
|
|
|
289
295
|
function addChunk(stream, state, chunk, addToFront) {
|
|
290
296
|
if (state.flowing && state.length === 0 && !state.sync) {
|
|
297
|
+
state.awaitDrain = 0;
|
|
291
298
|
stream.emit('data', chunk);
|
|
292
|
-
stream.read(0);
|
|
293
299
|
} else {
|
|
294
300
|
// update the buffer info.
|
|
295
301
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
296
302
|
if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
|
|
297
|
-
|
|
298
303
|
if (state.needReadable) emitReadable(stream);
|
|
299
304
|
}
|
|
305
|
+
|
|
300
306
|
maybeReadMore(stream, state);
|
|
301
307
|
}
|
|
302
308
|
|
|
303
309
|
function chunkInvalid(state, chunk) {
|
|
304
310
|
var er;
|
|
311
|
+
|
|
305
312
|
if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
|
|
306
|
-
er = new
|
|
313
|
+
er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
|
|
307
314
|
}
|
|
308
|
-
return er;
|
|
309
|
-
}
|
|
310
315
|
|
|
311
|
-
|
|
312
|
-
// Also, if we have no data yet, we can stand some
|
|
313
|
-
// more bytes. This is to work around cases where hwm=0,
|
|
314
|
-
// such as the repl. Also, if the push() triggered a
|
|
315
|
-
// readable event, and the user called read(largeNumber) such that
|
|
316
|
-
// needReadable was set, then we ought to push more, so that another
|
|
317
|
-
// 'readable' event will be triggered.
|
|
318
|
-
function needMoreData(state) {
|
|
319
|
-
return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
|
|
316
|
+
return er;
|
|
320
317
|
}
|
|
321
318
|
|
|
322
319
|
Readable.prototype.isPaused = function () {
|
|
323
320
|
return this._readableState.flowing === false;
|
|
324
|
-
};
|
|
321
|
+
}; // backwards compatibility.
|
|
322
|
+
|
|
325
323
|
|
|
326
|
-
// backwards compatibility.
|
|
327
324
|
Readable.prototype.setEncoding = function (enc) {
|
|
328
325
|
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
|
|
329
|
-
|
|
330
|
-
this._readableState.
|
|
326
|
+
var decoder = new StringDecoder(enc);
|
|
327
|
+
this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8
|
|
328
|
+
|
|
329
|
+
this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:
|
|
330
|
+
|
|
331
|
+
var p = this._readableState.buffer.head;
|
|
332
|
+
var content = '';
|
|
333
|
+
|
|
334
|
+
while (p !== null) {
|
|
335
|
+
content += decoder.write(p.data);
|
|
336
|
+
p = p.next;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
this._readableState.buffer.clear();
|
|
340
|
+
|
|
341
|
+
if (content !== '') this._readableState.buffer.push(content);
|
|
342
|
+
this._readableState.length = content.length;
|
|
331
343
|
return this;
|
|
332
|
-
};
|
|
344
|
+
}; // Don't raise the hwm > 1GB
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
var MAX_HWM = 0x40000000;
|
|
333
348
|
|
|
334
|
-
// Don't raise the hwm > 8MB
|
|
335
|
-
var MAX_HWM = 0x800000;
|
|
336
349
|
function computeNewHighWaterMark(n) {
|
|
337
350
|
if (n >= MAX_HWM) {
|
|
351
|
+
// TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
|
|
338
352
|
n = MAX_HWM;
|
|
339
353
|
} else {
|
|
340
354
|
// Get the next highest power of 2 to prevent increasing hwm excessively in
|
|
@@ -347,56 +361,55 @@ function computeNewHighWaterMark(n) {
|
|
|
347
361
|
n |= n >>> 16;
|
|
348
362
|
n++;
|
|
349
363
|
}
|
|
350
|
-
return n;
|
|
351
|
-
}
|
|
352
364
|
|
|
353
|
-
|
|
365
|
+
return n;
|
|
366
|
+
} // This function is designed to be inlinable, so please take care when making
|
|
354
367
|
// changes to the function body.
|
|
368
|
+
|
|
369
|
+
|
|
355
370
|
function howMuchToRead(n, state) {
|
|
356
371
|
if (n <= 0 || state.length === 0 && state.ended) return 0;
|
|
357
372
|
if (state.objectMode) return 1;
|
|
373
|
+
|
|
358
374
|
if (n !== n) {
|
|
359
375
|
// Only flow one buffer at a time
|
|
360
376
|
if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
|
|
361
|
-
}
|
|
362
|
-
|
|
377
|
+
} // If we're asking for more than the current hwm, then raise the hwm.
|
|
378
|
+
|
|
379
|
+
|
|
363
380
|
if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
|
|
364
|
-
if (n <= state.length) return n;
|
|
365
|
-
|
|
381
|
+
if (n <= state.length) return n; // Don't have enough
|
|
382
|
+
|
|
366
383
|
if (!state.ended) {
|
|
367
384
|
state.needReadable = true;
|
|
368
385
|
return 0;
|
|
369
386
|
}
|
|
387
|
+
|
|
370
388
|
return state.length;
|
|
371
|
-
}
|
|
389
|
+
} // you can override either this method, or the async _read(n) below.
|
|
390
|
+
|
|
372
391
|
|
|
373
|
-
// you can override either this method, or the async _read(n) below.
|
|
374
392
|
Readable.prototype.read = function (n) {
|
|
375
393
|
debug('read', n);
|
|
376
394
|
n = parseInt(n, 10);
|
|
377
395
|
var state = this._readableState;
|
|
378
396
|
var nOrig = n;
|
|
379
|
-
|
|
380
|
-
if (n !== 0) state.emittedReadable = false;
|
|
381
|
-
|
|
382
|
-
// if we're doing read(0) to trigger a readable event, but we
|
|
397
|
+
if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
|
|
383
398
|
// already have a bunch of data in the buffer, then just trigger
|
|
384
399
|
// the 'readable' event and move on.
|
|
385
|
-
|
|
400
|
+
|
|
401
|
+
if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
|
|
386
402
|
debug('read: emitReadable', state.length, state.ended);
|
|
387
403
|
if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
|
|
388
404
|
return null;
|
|
389
405
|
}
|
|
390
406
|
|
|
391
|
-
n = howMuchToRead(n, state);
|
|
407
|
+
n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
|
|
392
408
|
|
|
393
|
-
// if we've ended, and we're now clear, then finish it up.
|
|
394
409
|
if (n === 0 && state.ended) {
|
|
395
410
|
if (state.length === 0) endReadable(this);
|
|
396
411
|
return null;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// All the actual chunk generation logic needs to be
|
|
412
|
+
} // All the actual chunk generation logic needs to be
|
|
400
413
|
// *below* the call to _read. The reason is that in certain
|
|
401
414
|
// synthetic stream cases, such as passthrough streams, _read
|
|
402
415
|
// may be a completely synchronous operation which may change
|
|
@@ -417,33 +430,34 @@ Readable.prototype.read = function (n) {
|
|
|
417
430
|
// 'readable' etc.
|
|
418
431
|
//
|
|
419
432
|
// 3. Actually pull the requested chunks out of the buffer and return.
|
|
420
|
-
|
|
421
433
|
// if we need a readable event, then we need to do some reading.
|
|
434
|
+
|
|
435
|
+
|
|
422
436
|
var doRead = state.needReadable;
|
|
423
|
-
debug('need readable', doRead);
|
|
437
|
+
debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
|
|
424
438
|
|
|
425
|
-
// if we currently have less than the highWaterMark, then also read some
|
|
426
439
|
if (state.length === 0 || state.length - n < state.highWaterMark) {
|
|
427
440
|
doRead = true;
|
|
428
441
|
debug('length less than watermark', doRead);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// however, if we've ended, then there's no point, and if we're already
|
|
442
|
+
} // however, if we've ended, then there's no point, and if we're already
|
|
432
443
|
// reading, then it's unnecessary.
|
|
444
|
+
|
|
445
|
+
|
|
433
446
|
if (state.ended || state.reading) {
|
|
434
447
|
doRead = false;
|
|
435
448
|
debug('reading or ended', doRead);
|
|
436
449
|
} else if (doRead) {
|
|
437
450
|
debug('do read');
|
|
438
451
|
state.reading = true;
|
|
439
|
-
state.sync = true;
|
|
440
|
-
|
|
441
|
-
if (state.length === 0) state.needReadable = true;
|
|
442
|
-
|
|
452
|
+
state.sync = true; // if the length is currently zero, then we *need* a readable event.
|
|
453
|
+
|
|
454
|
+
if (state.length === 0) state.needReadable = true; // call internal read method
|
|
455
|
+
|
|
443
456
|
this._read(state.highWaterMark);
|
|
444
|
-
|
|
445
|
-
// If _read pushed data synchronously, then `reading` will be false,
|
|
457
|
+
|
|
458
|
+
state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
|
|
446
459
|
// and we need to re-evaluate how much data we can return to the user.
|
|
460
|
+
|
|
447
461
|
if (!state.reading) n = howMuchToRead(nOrig, state);
|
|
448
462
|
}
|
|
449
463
|
|
|
@@ -451,91 +465,144 @@ Readable.prototype.read = function (n) {
|
|
|
451
465
|
if (n > 0) ret = fromList(n, state);else ret = null;
|
|
452
466
|
|
|
453
467
|
if (ret === null) {
|
|
454
|
-
state.needReadable =
|
|
468
|
+
state.needReadable = state.length <= state.highWaterMark;
|
|
455
469
|
n = 0;
|
|
456
470
|
} else {
|
|
457
471
|
state.length -= n;
|
|
472
|
+
state.awaitDrain = 0;
|
|
458
473
|
}
|
|
459
474
|
|
|
460
475
|
if (state.length === 0) {
|
|
461
476
|
// If we have nothing in the buffer, then we want to know
|
|
462
477
|
// as soon as we *do* get something into the buffer.
|
|
463
|
-
if (!state.ended) state.needReadable = true;
|
|
478
|
+
if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
|
|
464
479
|
|
|
465
|
-
// If we tried to read() past the EOF, then emit end on the next tick.
|
|
466
480
|
if (nOrig !== n && state.ended) endReadable(this);
|
|
467
481
|
}
|
|
468
482
|
|
|
469
483
|
if (ret !== null) this.emit('data', ret);
|
|
470
|
-
|
|
471
484
|
return ret;
|
|
472
485
|
};
|
|
473
486
|
|
|
474
487
|
function onEofChunk(stream, state) {
|
|
488
|
+
debug('onEofChunk');
|
|
475
489
|
if (state.ended) return;
|
|
490
|
+
|
|
476
491
|
if (state.decoder) {
|
|
477
492
|
var chunk = state.decoder.end();
|
|
493
|
+
|
|
478
494
|
if (chunk && chunk.length) {
|
|
479
495
|
state.buffer.push(chunk);
|
|
480
496
|
state.length += state.objectMode ? 1 : chunk.length;
|
|
481
497
|
}
|
|
482
498
|
}
|
|
499
|
+
|
|
483
500
|
state.ended = true;
|
|
484
501
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
502
|
+
if (state.sync) {
|
|
503
|
+
// if we are sync, wait until next tick to emit the data.
|
|
504
|
+
// Otherwise we risk emitting data in the flow()
|
|
505
|
+
// the readable code triggers during a read() call
|
|
506
|
+
emitReadable(stream);
|
|
507
|
+
} else {
|
|
508
|
+
// emit 'readable' now to make sure it gets picked up.
|
|
509
|
+
state.needReadable = false;
|
|
488
510
|
|
|
489
|
-
|
|
511
|
+
if (!state.emittedReadable) {
|
|
512
|
+
state.emittedReadable = true;
|
|
513
|
+
emitReadable_(stream);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
} // Don't emit readable right away in sync mode, because this can trigger
|
|
490
517
|
// another read() call => stack overflow. This way, it might trigger
|
|
491
518
|
// a nextTick recursion warning, but that's not so bad.
|
|
519
|
+
|
|
520
|
+
|
|
492
521
|
function emitReadable(stream) {
|
|
493
522
|
var state = stream._readableState;
|
|
523
|
+
debug('emitReadable', state.needReadable, state.emittedReadable);
|
|
494
524
|
state.needReadable = false;
|
|
525
|
+
|
|
495
526
|
if (!state.emittedReadable) {
|
|
496
527
|
debug('emitReadable', state.flowing);
|
|
497
528
|
state.emittedReadable = true;
|
|
498
|
-
|
|
529
|
+
process.nextTick(emitReadable_, stream);
|
|
499
530
|
}
|
|
500
531
|
}
|
|
501
532
|
|
|
502
533
|
function emitReadable_(stream) {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
flow(stream);
|
|
506
|
-
}
|
|
534
|
+
var state = stream._readableState;
|
|
535
|
+
debug('emitReadable_', state.destroyed, state.length, state.ended);
|
|
507
536
|
|
|
508
|
-
|
|
537
|
+
if (!state.destroyed && (state.length || state.ended)) {
|
|
538
|
+
stream.emit('readable');
|
|
539
|
+
state.emittedReadable = false;
|
|
540
|
+
} // The stream needs another readable event if
|
|
541
|
+
// 1. It is not flowing, as the flow mechanism will take
|
|
542
|
+
// care of it.
|
|
543
|
+
// 2. It is not ended.
|
|
544
|
+
// 3. It is below the highWaterMark, so we can schedule
|
|
545
|
+
// another readable later.
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
|
|
549
|
+
flow(stream);
|
|
550
|
+
} // at this point, the user has presumably seen the 'readable' event,
|
|
509
551
|
// and called read() to consume some data. that may have triggered
|
|
510
552
|
// in turn another _read(n) call, in which case reading = true if
|
|
511
553
|
// it's in progress.
|
|
512
554
|
// However, if we're not ended, or reading, and the length < hwm,
|
|
513
555
|
// then go ahead and try to read some more preemptively.
|
|
556
|
+
|
|
557
|
+
|
|
514
558
|
function maybeReadMore(stream, state) {
|
|
515
559
|
if (!state.readingMore) {
|
|
516
560
|
state.readingMore = true;
|
|
517
|
-
|
|
561
|
+
process.nextTick(maybeReadMore_, stream, state);
|
|
518
562
|
}
|
|
519
563
|
}
|
|
520
564
|
|
|
521
565
|
function maybeReadMore_(stream, state) {
|
|
522
|
-
|
|
523
|
-
|
|
566
|
+
// Attempt to read more data if we should.
|
|
567
|
+
//
|
|
568
|
+
// The conditions for reading more data are (one of):
|
|
569
|
+
// - Not enough data buffered (state.length < state.highWaterMark). The loop
|
|
570
|
+
// is responsible for filling the buffer with enough data if such data
|
|
571
|
+
// is available. If highWaterMark is 0 and we are not in the flowing mode
|
|
572
|
+
// we should _not_ attempt to buffer any extra data. We'll get more data
|
|
573
|
+
// when the stream consumer calls read() instead.
|
|
574
|
+
// - No data in the buffer, and the stream is in flowing mode. In this mode
|
|
575
|
+
// the loop below is responsible for ensuring read() is called. Failing to
|
|
576
|
+
// call read here would abort the flow and there's no other mechanism for
|
|
577
|
+
// continuing the flow if the stream consumer has just subscribed to the
|
|
578
|
+
// 'data' event.
|
|
579
|
+
//
|
|
580
|
+
// In addition to the above conditions to keep reading data, the following
|
|
581
|
+
// conditions prevent the data from being read:
|
|
582
|
+
// - The stream has ended (state.ended).
|
|
583
|
+
// - There is already a pending 'read' operation (state.reading). This is a
|
|
584
|
+
// case where the the stream has called the implementation defined _read()
|
|
585
|
+
// method, but they are processing the call asynchronously and have _not_
|
|
586
|
+
// called push() with new data. In this case we skip performing more
|
|
587
|
+
// read()s. The execution ends in this method again after the _read() ends
|
|
588
|
+
// up calling push() with more data.
|
|
589
|
+
while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
|
|
590
|
+
var len = state.length;
|
|
524
591
|
debug('maybeReadMore read 0');
|
|
525
592
|
stream.read(0);
|
|
526
|
-
if (len === state.length)
|
|
527
|
-
|
|
528
|
-
break;else len = state.length;
|
|
593
|
+
if (len === state.length) // didn't get any data, stop spinning.
|
|
594
|
+
break;
|
|
529
595
|
}
|
|
530
|
-
state.readingMore = false;
|
|
531
|
-
}
|
|
532
596
|
|
|
533
|
-
|
|
597
|
+
state.readingMore = false;
|
|
598
|
+
} // abstract method. to be overridden in specific implementation classes.
|
|
534
599
|
// call cb(er, data) where data is <= n in length.
|
|
535
600
|
// for virtual (non-string, non-buffer) streams, "length" is somewhat
|
|
536
601
|
// arbitrary, and perhaps not very meaningful.
|
|
602
|
+
|
|
603
|
+
|
|
537
604
|
Readable.prototype._read = function (n) {
|
|
538
|
-
this
|
|
605
|
+
errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
|
|
539
606
|
};
|
|
540
607
|
|
|
541
608
|
Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
@@ -546,24 +613,26 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
|
546
613
|
case 0:
|
|
547
614
|
state.pipes = dest;
|
|
548
615
|
break;
|
|
616
|
+
|
|
549
617
|
case 1:
|
|
550
618
|
state.pipes = [state.pipes, dest];
|
|
551
619
|
break;
|
|
620
|
+
|
|
552
621
|
default:
|
|
553
622
|
state.pipes.push(dest);
|
|
554
623
|
break;
|
|
555
624
|
}
|
|
625
|
+
|
|
556
626
|
state.pipesCount += 1;
|
|
557
627
|
debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
|
|
558
|
-
|
|
559
628
|
var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
|
|
560
|
-
|
|
561
629
|
var endFn = doEnd ? onend : unpipe;
|
|
562
|
-
if (state.endEmitted)
|
|
563
|
-
|
|
630
|
+
if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
|
|
564
631
|
dest.on('unpipe', onunpipe);
|
|
632
|
+
|
|
565
633
|
function onunpipe(readable, unpipeInfo) {
|
|
566
634
|
debug('onunpipe');
|
|
635
|
+
|
|
567
636
|
if (readable === src) {
|
|
568
637
|
if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
|
|
569
638
|
unpipeInfo.hasUnpiped = true;
|
|
@@ -575,19 +644,19 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
|
575
644
|
function onend() {
|
|
576
645
|
debug('onend');
|
|
577
646
|
dest.end();
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
// when the dest drains, it reduces the awaitDrain counter
|
|
647
|
+
} // when the dest drains, it reduces the awaitDrain counter
|
|
581
648
|
// on the source. This would be more elegant with a .once()
|
|
582
649
|
// handler in flow(), but adding and removing repeatedly is
|
|
583
650
|
// too slow.
|
|
651
|
+
|
|
652
|
+
|
|
584
653
|
var ondrain = pipeOnDrain(src);
|
|
585
654
|
dest.on('drain', ondrain);
|
|
586
|
-
|
|
587
655
|
var cleanedUp = false;
|
|
656
|
+
|
|
588
657
|
function cleanup() {
|
|
589
|
-
debug('cleanup');
|
|
590
|
-
|
|
658
|
+
debug('cleanup'); // cleanup event handlers once the pipe is broken
|
|
659
|
+
|
|
591
660
|
dest.removeListener('close', onclose);
|
|
592
661
|
dest.removeListener('finish', onfinish);
|
|
593
662
|
dest.removeListener('drain', ondrain);
|
|
@@ -596,75 +665,71 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
|
596
665
|
src.removeListener('end', onend);
|
|
597
666
|
src.removeListener('end', unpipe);
|
|
598
667
|
src.removeListener('data', ondata);
|
|
599
|
-
|
|
600
|
-
cleanedUp = true;
|
|
601
|
-
|
|
602
|
-
// if the reader is waiting for a drain event from this
|
|
668
|
+
cleanedUp = true; // if the reader is waiting for a drain event from this
|
|
603
669
|
// specific writer, then it would cause it to never start
|
|
604
670
|
// flowing again.
|
|
605
671
|
// So, if this is awaiting a drain, then we just call it now.
|
|
606
672
|
// If we don't know, then assume that we are waiting for one.
|
|
673
|
+
|
|
607
674
|
if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
|
|
608
675
|
}
|
|
609
676
|
|
|
610
|
-
// If the user pushes more data while we're writing to dest then we'll end up
|
|
611
|
-
// in ondata again. However, we only want to increase awaitDrain once because
|
|
612
|
-
// dest will only emit one 'drain' event for the multiple writes.
|
|
613
|
-
// => Introduce a guard on increasing awaitDrain.
|
|
614
|
-
var increasedAwaitDrain = false;
|
|
615
677
|
src.on('data', ondata);
|
|
678
|
+
|
|
616
679
|
function ondata(chunk) {
|
|
617
680
|
debug('ondata');
|
|
618
|
-
increasedAwaitDrain = false;
|
|
619
681
|
var ret = dest.write(chunk);
|
|
620
|
-
|
|
682
|
+
debug('dest.write', ret);
|
|
683
|
+
|
|
684
|
+
if (ret === false) {
|
|
621
685
|
// If the user unpiped during `dest.write()`, it is possible
|
|
622
686
|
// to get stuck in a permanently paused state if that write
|
|
623
687
|
// also returned false.
|
|
624
688
|
// => Check whether `dest` is still a piping destination.
|
|
625
689
|
if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
|
|
626
|
-
debug('false write response, pause',
|
|
627
|
-
|
|
628
|
-
increasedAwaitDrain = true;
|
|
690
|
+
debug('false write response, pause', state.awaitDrain);
|
|
691
|
+
state.awaitDrain++;
|
|
629
692
|
}
|
|
693
|
+
|
|
630
694
|
src.pause();
|
|
631
695
|
}
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
// if the dest has an error, then stop piping into it.
|
|
696
|
+
} // if the dest has an error, then stop piping into it.
|
|
635
697
|
// however, don't suppress the throwing behavior for this.
|
|
698
|
+
|
|
699
|
+
|
|
636
700
|
function onerror(er) {
|
|
637
701
|
debug('onerror', er);
|
|
638
702
|
unpipe();
|
|
639
703
|
dest.removeListener('error', onerror);
|
|
640
|
-
if (EElistenerCount(dest, 'error') === 0) dest
|
|
641
|
-
}
|
|
704
|
+
if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
|
|
705
|
+
} // Make sure our error handler is attached before userland ones.
|
|
642
706
|
|
|
643
|
-
// Make sure our error handler is attached before userland ones.
|
|
644
|
-
prependListener(dest, 'error', onerror);
|
|
645
707
|
|
|
646
|
-
// Both close and finish should trigger unpipe, but only once.
|
|
708
|
+
prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
|
|
709
|
+
|
|
647
710
|
function onclose() {
|
|
648
711
|
dest.removeListener('finish', onfinish);
|
|
649
712
|
unpipe();
|
|
650
713
|
}
|
|
714
|
+
|
|
651
715
|
dest.once('close', onclose);
|
|
716
|
+
|
|
652
717
|
function onfinish() {
|
|
653
718
|
debug('onfinish');
|
|
654
719
|
dest.removeListener('close', onclose);
|
|
655
720
|
unpipe();
|
|
656
721
|
}
|
|
722
|
+
|
|
657
723
|
dest.once('finish', onfinish);
|
|
658
724
|
|
|
659
725
|
function unpipe() {
|
|
660
726
|
debug('unpipe');
|
|
661
727
|
src.unpipe(dest);
|
|
662
|
-
}
|
|
728
|
+
} // tell the dest that it's being piped to
|
|
663
729
|
|
|
664
|
-
// tell the dest that it's being piped to
|
|
665
|
-
dest.emit('pipe', src);
|
|
666
730
|
|
|
667
|
-
// start the flow if it hasn't been started already.
|
|
731
|
+
dest.emit('pipe', src); // start the flow if it hasn't been started already.
|
|
732
|
+
|
|
668
733
|
if (!state.flowing) {
|
|
669
734
|
debug('pipe resume');
|
|
670
735
|
src.resume();
|
|
@@ -674,10 +739,11 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
|
|
|
674
739
|
};
|
|
675
740
|
|
|
676
741
|
function pipeOnDrain(src) {
|
|
677
|
-
return function () {
|
|
742
|
+
return function pipeOnDrainFunctionResult() {
|
|
678
743
|
var state = src._readableState;
|
|
679
744
|
debug('pipeOnDrain', state.awaitDrain);
|
|
680
745
|
if (state.awaitDrain) state.awaitDrain--;
|
|
746
|
+
|
|
681
747
|
if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
|
|
682
748
|
state.flowing = true;
|
|
683
749
|
flow(src);
|
|
@@ -687,27 +753,24 @@ function pipeOnDrain(src) {
|
|
|
687
753
|
|
|
688
754
|
Readable.prototype.unpipe = function (dest) {
|
|
689
755
|
var state = this._readableState;
|
|
690
|
-
var unpipeInfo = {
|
|
756
|
+
var unpipeInfo = {
|
|
757
|
+
hasUnpiped: false
|
|
758
|
+
}; // if we're not piping anywhere, then do nothing.
|
|
691
759
|
|
|
692
|
-
|
|
693
|
-
if (state.pipesCount === 0) return this;
|
|
760
|
+
if (state.pipesCount === 0) return this; // just one destination. most common case.
|
|
694
761
|
|
|
695
|
-
// just one destination. most common case.
|
|
696
762
|
if (state.pipesCount === 1) {
|
|
697
763
|
// passed in one, but it's not the right one.
|
|
698
764
|
if (dest && dest !== state.pipes) return this;
|
|
765
|
+
if (!dest) dest = state.pipes; // got a match.
|
|
699
766
|
|
|
700
|
-
if (!dest) dest = state.pipes;
|
|
701
|
-
|
|
702
|
-
// got a match.
|
|
703
767
|
state.pipes = null;
|
|
704
768
|
state.pipesCount = 0;
|
|
705
769
|
state.flowing = false;
|
|
706
770
|
if (dest) dest.emit('unpipe', this, unpipeInfo);
|
|
707
771
|
return this;
|
|
708
|
-
}
|
|
772
|
+
} // slow case. multiple pipe destinations.
|
|
709
773
|
|
|
710
|
-
// slow case. multiple pipe destinations.
|
|
711
774
|
|
|
712
775
|
if (!dest) {
|
|
713
776
|
// remove all.
|
|
@@ -718,80 +781,139 @@ Readable.prototype.unpipe = function (dest) {
|
|
|
718
781
|
state.flowing = false;
|
|
719
782
|
|
|
720
783
|
for (var i = 0; i < len; i++) {
|
|
721
|
-
dests[i].emit('unpipe', this,
|
|
722
|
-
|
|
723
|
-
|
|
784
|
+
dests[i].emit('unpipe', this, {
|
|
785
|
+
hasUnpiped: false
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
return this;
|
|
790
|
+
} // try to find the right one.
|
|
791
|
+
|
|
724
792
|
|
|
725
|
-
// try to find the right one.
|
|
726
793
|
var index = indexOf(state.pipes, dest);
|
|
727
794
|
if (index === -1) return this;
|
|
728
|
-
|
|
729
795
|
state.pipes.splice(index, 1);
|
|
730
796
|
state.pipesCount -= 1;
|
|
731
797
|
if (state.pipesCount === 1) state.pipes = state.pipes[0];
|
|
732
|
-
|
|
733
798
|
dest.emit('unpipe', this, unpipeInfo);
|
|
734
|
-
|
|
735
799
|
return this;
|
|
736
|
-
};
|
|
737
|
-
|
|
738
|
-
// set up data events if they are asked for
|
|
800
|
+
}; // set up data events if they are asked for
|
|
739
801
|
// Ensure readable listeners eventually get something
|
|
802
|
+
|
|
803
|
+
|
|
740
804
|
Readable.prototype.on = function (ev, fn) {
|
|
741
805
|
var res = Stream.prototype.on.call(this, ev, fn);
|
|
806
|
+
var state = this._readableState;
|
|
742
807
|
|
|
743
808
|
if (ev === 'data') {
|
|
744
|
-
//
|
|
745
|
-
|
|
809
|
+
// update readableListening so that resume() may be a no-op
|
|
810
|
+
// a few lines down. This is needed to support once('readable').
|
|
811
|
+
state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused
|
|
812
|
+
|
|
813
|
+
if (state.flowing !== false) this.resume();
|
|
746
814
|
} else if (ev === 'readable') {
|
|
747
|
-
var state = this._readableState;
|
|
748
815
|
if (!state.endEmitted && !state.readableListening) {
|
|
749
816
|
state.readableListening = state.needReadable = true;
|
|
817
|
+
state.flowing = false;
|
|
750
818
|
state.emittedReadable = false;
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
819
|
+
debug('on readable', state.length, state.reading);
|
|
820
|
+
|
|
821
|
+
if (state.length) {
|
|
754
822
|
emitReadable(this);
|
|
823
|
+
} else if (!state.reading) {
|
|
824
|
+
process.nextTick(nReadingNextTick, this);
|
|
755
825
|
}
|
|
756
826
|
}
|
|
757
827
|
}
|
|
758
828
|
|
|
759
829
|
return res;
|
|
760
830
|
};
|
|
831
|
+
|
|
761
832
|
Readable.prototype.addListener = Readable.prototype.on;
|
|
762
833
|
|
|
834
|
+
Readable.prototype.removeListener = function (ev, fn) {
|
|
835
|
+
var res = Stream.prototype.removeListener.call(this, ev, fn);
|
|
836
|
+
|
|
837
|
+
if (ev === 'readable') {
|
|
838
|
+
// We need to check if there is someone still listening to
|
|
839
|
+
// readable and reset the state. However this needs to happen
|
|
840
|
+
// after readable has been emitted but before I/O (nextTick) to
|
|
841
|
+
// support once('readable', fn) cycles. This means that calling
|
|
842
|
+
// resume within the same tick will have no
|
|
843
|
+
// effect.
|
|
844
|
+
process.nextTick(updateReadableListening, this);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
return res;
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
Readable.prototype.removeAllListeners = function (ev) {
|
|
851
|
+
var res = Stream.prototype.removeAllListeners.apply(this, arguments);
|
|
852
|
+
|
|
853
|
+
if (ev === 'readable' || ev === undefined) {
|
|
854
|
+
// We need to check if there is someone still listening to
|
|
855
|
+
// readable and reset the state. However this needs to happen
|
|
856
|
+
// after readable has been emitted but before I/O (nextTick) to
|
|
857
|
+
// support once('readable', fn) cycles. This means that calling
|
|
858
|
+
// resume within the same tick will have no
|
|
859
|
+
// effect.
|
|
860
|
+
process.nextTick(updateReadableListening, this);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
return res;
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
function updateReadableListening(self) {
|
|
867
|
+
var state = self._readableState;
|
|
868
|
+
state.readableListening = self.listenerCount('readable') > 0;
|
|
869
|
+
|
|
870
|
+
if (state.resumeScheduled && !state.paused) {
|
|
871
|
+
// flowing needs to be set to true now, otherwise
|
|
872
|
+
// the upcoming resume will not flow.
|
|
873
|
+
state.flowing = true; // crude way to check if we should resume
|
|
874
|
+
} else if (self.listenerCount('data') > 0) {
|
|
875
|
+
self.resume();
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
|
|
763
879
|
function nReadingNextTick(self) {
|
|
764
880
|
debug('readable nexttick read 0');
|
|
765
881
|
self.read(0);
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
// pause() and resume() are remnants of the legacy readable stream API
|
|
882
|
+
} // pause() and resume() are remnants of the legacy readable stream API
|
|
769
883
|
// If the user uses them, then switch into old mode.
|
|
884
|
+
|
|
885
|
+
|
|
770
886
|
Readable.prototype.resume = function () {
|
|
771
887
|
var state = this._readableState;
|
|
888
|
+
|
|
772
889
|
if (!state.flowing) {
|
|
773
|
-
debug('resume');
|
|
774
|
-
|
|
890
|
+
debug('resume'); // we flow only if there is no one listening
|
|
891
|
+
// for readable, but we still have to call
|
|
892
|
+
// resume()
|
|
893
|
+
|
|
894
|
+
state.flowing = !state.readableListening;
|
|
775
895
|
resume(this, state);
|
|
776
896
|
}
|
|
897
|
+
|
|
898
|
+
state.paused = false;
|
|
777
899
|
return this;
|
|
778
900
|
};
|
|
779
901
|
|
|
780
902
|
function resume(stream, state) {
|
|
781
903
|
if (!state.resumeScheduled) {
|
|
782
904
|
state.resumeScheduled = true;
|
|
783
|
-
|
|
905
|
+
process.nextTick(resume_, stream, state);
|
|
784
906
|
}
|
|
785
907
|
}
|
|
786
908
|
|
|
787
909
|
function resume_(stream, state) {
|
|
910
|
+
debug('resume', state.reading);
|
|
911
|
+
|
|
788
912
|
if (!state.reading) {
|
|
789
|
-
debug('resume read 0');
|
|
790
913
|
stream.read(0);
|
|
791
914
|
}
|
|
792
915
|
|
|
793
916
|
state.resumeScheduled = false;
|
|
794
|
-
state.awaitDrain = 0;
|
|
795
917
|
stream.emit('resume');
|
|
796
918
|
flow(stream);
|
|
797
919
|
if (state.flowing && !state.reading) stream.read(0);
|
|
@@ -799,31 +921,37 @@ function resume_(stream, state) {
|
|
|
799
921
|
|
|
800
922
|
Readable.prototype.pause = function () {
|
|
801
923
|
debug('call pause flowing=%j', this._readableState.flowing);
|
|
802
|
-
|
|
924
|
+
|
|
925
|
+
if (this._readableState.flowing !== false) {
|
|
803
926
|
debug('pause');
|
|
804
927
|
this._readableState.flowing = false;
|
|
805
928
|
this.emit('pause');
|
|
806
929
|
}
|
|
930
|
+
|
|
931
|
+
this._readableState.paused = true;
|
|
807
932
|
return this;
|
|
808
933
|
};
|
|
809
934
|
|
|
810
935
|
function flow(stream) {
|
|
811
936
|
var state = stream._readableState;
|
|
812
937
|
debug('flow', state.flowing);
|
|
813
|
-
while (state.flowing && stream.read() !== null) {}
|
|
814
|
-
}
|
|
815
938
|
|
|
816
|
-
|
|
939
|
+
while (state.flowing && stream.read() !== null) {
|
|
940
|
+
;
|
|
941
|
+
}
|
|
942
|
+
} // wrap an old-style stream as the async data source.
|
|
817
943
|
// This is *not* part of the readable stream interface.
|
|
818
944
|
// It is an ugly unfortunate mess of history.
|
|
945
|
+
|
|
946
|
+
|
|
819
947
|
Readable.prototype.wrap = function (stream) {
|
|
820
948
|
var _this = this;
|
|
821
949
|
|
|
822
950
|
var state = this._readableState;
|
|
823
951
|
var paused = false;
|
|
824
|
-
|
|
825
952
|
stream.on('end', function () {
|
|
826
953
|
debug('wrapped end');
|
|
954
|
+
|
|
827
955
|
if (state.decoder && !state.ended) {
|
|
828
956
|
var chunk = state.decoder.end();
|
|
829
957
|
if (chunk && chunk.length) _this.push(chunk);
|
|
@@ -831,42 +959,41 @@ Readable.prototype.wrap = function (stream) {
|
|
|
831
959
|
|
|
832
960
|
_this.push(null);
|
|
833
961
|
});
|
|
834
|
-
|
|
835
962
|
stream.on('data', function (chunk) {
|
|
836
963
|
debug('wrapped data');
|
|
837
|
-
if (state.decoder) chunk = state.decoder.write(chunk);
|
|
964
|
+
if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
|
|
838
965
|
|
|
839
|
-
// don't skip over falsy values in objectMode
|
|
840
966
|
if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
|
|
841
967
|
|
|
842
968
|
var ret = _this.push(chunk);
|
|
969
|
+
|
|
843
970
|
if (!ret) {
|
|
844
971
|
paused = true;
|
|
845
972
|
stream.pause();
|
|
846
973
|
}
|
|
847
|
-
});
|
|
848
|
-
|
|
849
|
-
// proxy all the other methods.
|
|
974
|
+
}); // proxy all the other methods.
|
|
850
975
|
// important when wrapping filters and duplexes.
|
|
976
|
+
|
|
851
977
|
for (var i in stream) {
|
|
852
978
|
if (this[i] === undefined && typeof stream[i] === 'function') {
|
|
853
|
-
this[i] = function (method) {
|
|
854
|
-
return function () {
|
|
979
|
+
this[i] = function methodWrap(method) {
|
|
980
|
+
return function methodWrapReturnFunction() {
|
|
855
981
|
return stream[method].apply(stream, arguments);
|
|
856
982
|
};
|
|
857
983
|
}(i);
|
|
858
984
|
}
|
|
859
|
-
}
|
|
985
|
+
} // proxy certain important events.
|
|
986
|
+
|
|
860
987
|
|
|
861
|
-
// proxy certain important events.
|
|
862
988
|
for (var n = 0; n < kProxyEvents.length; n++) {
|
|
863
989
|
stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
// when we try to consume some more bytes, simply unpause the
|
|
990
|
+
} // when we try to consume some more bytes, simply unpause the
|
|
867
991
|
// underlying stream.
|
|
992
|
+
|
|
993
|
+
|
|
868
994
|
this._read = function (n) {
|
|
869
995
|
debug('wrapped _read', n);
|
|
996
|
+
|
|
870
997
|
if (paused) {
|
|
871
998
|
paused = false;
|
|
872
999
|
stream.resume();
|
|
@@ -876,144 +1003,122 @@ Readable.prototype.wrap = function (stream) {
|
|
|
876
1003
|
return this;
|
|
877
1004
|
};
|
|
878
1005
|
|
|
1006
|
+
if (typeof Symbol === 'function') {
|
|
1007
|
+
Readable.prototype[Symbol.asyncIterator] = function () {
|
|
1008
|
+
if (createReadableStreamAsyncIterator === undefined) {
|
|
1009
|
+
createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
return createReadableStreamAsyncIterator(this);
|
|
1013
|
+
};
|
|
1014
|
+
}
|
|
1015
|
+
|
|
879
1016
|
Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
|
|
880
1017
|
// making it explicit this property is not enumerable
|
|
881
1018
|
// because otherwise some prototype manipulation in
|
|
882
1019
|
// userland will fail
|
|
883
1020
|
enumerable: false,
|
|
884
|
-
get: function () {
|
|
1021
|
+
get: function get() {
|
|
885
1022
|
return this._readableState.highWaterMark;
|
|
886
1023
|
}
|
|
887
1024
|
});
|
|
1025
|
+
Object.defineProperty(Readable.prototype, 'readableBuffer', {
|
|
1026
|
+
// making it explicit this property is not enumerable
|
|
1027
|
+
// because otherwise some prototype manipulation in
|
|
1028
|
+
// userland will fail
|
|
1029
|
+
enumerable: false,
|
|
1030
|
+
get: function get() {
|
|
1031
|
+
return this._readableState && this._readableState.buffer;
|
|
1032
|
+
}
|
|
1033
|
+
});
|
|
1034
|
+
Object.defineProperty(Readable.prototype, 'readableFlowing', {
|
|
1035
|
+
// making it explicit this property is not enumerable
|
|
1036
|
+
// because otherwise some prototype manipulation in
|
|
1037
|
+
// userland will fail
|
|
1038
|
+
enumerable: false,
|
|
1039
|
+
get: function get() {
|
|
1040
|
+
return this._readableState.flowing;
|
|
1041
|
+
},
|
|
1042
|
+
set: function set(state) {
|
|
1043
|
+
if (this._readableState) {
|
|
1044
|
+
this._readableState.flowing = state;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
}); // exposed for testing purposes only.
|
|
888
1048
|
|
|
889
|
-
// exposed for testing purposes only.
|
|
890
1049
|
Readable._fromList = fromList;
|
|
891
|
-
|
|
892
|
-
//
|
|
1050
|
+
Object.defineProperty(Readable.prototype, 'readableLength', {
|
|
1051
|
+
// making it explicit this property is not enumerable
|
|
1052
|
+
// because otherwise some prototype manipulation in
|
|
1053
|
+
// userland will fail
|
|
1054
|
+
enumerable: false,
|
|
1055
|
+
get: function get() {
|
|
1056
|
+
return this._readableState.length;
|
|
1057
|
+
}
|
|
1058
|
+
}); // Pluck off n bytes from an array of buffers.
|
|
893
1059
|
// Length is the combined lengths of all the buffers in the list.
|
|
894
1060
|
// This function is designed to be inlinable, so please take care when making
|
|
895
1061
|
// changes to the function body.
|
|
1062
|
+
|
|
896
1063
|
function fromList(n, state) {
|
|
897
1064
|
// nothing buffered
|
|
898
1065
|
if (state.length === 0) return null;
|
|
899
|
-
|
|
900
1066
|
var ret;
|
|
901
1067
|
if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
|
|
902
1068
|
// read it all, truncate the list
|
|
903
|
-
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.
|
|
1069
|
+
if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
|
|
904
1070
|
state.buffer.clear();
|
|
905
1071
|
} else {
|
|
906
1072
|
// read part of list
|
|
907
|
-
ret =
|
|
1073
|
+
ret = state.buffer.consume(n, state.decoder);
|
|
908
1074
|
}
|
|
909
|
-
|
|
910
|
-
return ret;
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
// Extracts only enough buffered data to satisfy the amount requested.
|
|
914
|
-
// This function is designed to be inlinable, so please take care when making
|
|
915
|
-
// changes to the function body.
|
|
916
|
-
function fromListPartial(n, list, hasStrings) {
|
|
917
|
-
var ret;
|
|
918
|
-
if (n < list.head.data.length) {
|
|
919
|
-
// slice is the same for buffers and strings
|
|
920
|
-
ret = list.head.data.slice(0, n);
|
|
921
|
-
list.head.data = list.head.data.slice(n);
|
|
922
|
-
} else if (n === list.head.data.length) {
|
|
923
|
-
// first chunk is a perfect match
|
|
924
|
-
ret = list.shift();
|
|
925
|
-
} else {
|
|
926
|
-
// result spans more than one buffer
|
|
927
|
-
ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
|
|
928
|
-
}
|
|
929
|
-
return ret;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
// Copies a specified amount of characters from the list of buffered data
|
|
933
|
-
// chunks.
|
|
934
|
-
// This function is designed to be inlinable, so please take care when making
|
|
935
|
-
// changes to the function body.
|
|
936
|
-
function copyFromBufferString(n, list) {
|
|
937
|
-
var p = list.head;
|
|
938
|
-
var c = 1;
|
|
939
|
-
var ret = p.data;
|
|
940
|
-
n -= ret.length;
|
|
941
|
-
while (p = p.next) {
|
|
942
|
-
var str = p.data;
|
|
943
|
-
var nb = n > str.length ? str.length : n;
|
|
944
|
-
if (nb === str.length) ret += str;else ret += str.slice(0, n);
|
|
945
|
-
n -= nb;
|
|
946
|
-
if (n === 0) {
|
|
947
|
-
if (nb === str.length) {
|
|
948
|
-
++c;
|
|
949
|
-
if (p.next) list.head = p.next;else list.head = list.tail = null;
|
|
950
|
-
} else {
|
|
951
|
-
list.head = p;
|
|
952
|
-
p.data = str.slice(nb);
|
|
953
|
-
}
|
|
954
|
-
break;
|
|
955
|
-
}
|
|
956
|
-
++c;
|
|
957
|
-
}
|
|
958
|
-
list.length -= c;
|
|
959
|
-
return ret;
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
// Copies a specified amount of bytes from the list of buffered data chunks.
|
|
963
|
-
// This function is designed to be inlinable, so please take care when making
|
|
964
|
-
// changes to the function body.
|
|
965
|
-
function copyFromBuffer(n, list) {
|
|
966
|
-
var ret = Buffer.allocUnsafe(n);
|
|
967
|
-
var p = list.head;
|
|
968
|
-
var c = 1;
|
|
969
|
-
p.data.copy(ret);
|
|
970
|
-
n -= p.data.length;
|
|
971
|
-
while (p = p.next) {
|
|
972
|
-
var buf = p.data;
|
|
973
|
-
var nb = n > buf.length ? buf.length : n;
|
|
974
|
-
buf.copy(ret, ret.length - n, 0, nb);
|
|
975
|
-
n -= nb;
|
|
976
|
-
if (n === 0) {
|
|
977
|
-
if (nb === buf.length) {
|
|
978
|
-
++c;
|
|
979
|
-
if (p.next) list.head = p.next;else list.head = list.tail = null;
|
|
980
|
-
} else {
|
|
981
|
-
list.head = p;
|
|
982
|
-
p.data = buf.slice(nb);
|
|
983
|
-
}
|
|
984
|
-
break;
|
|
985
|
-
}
|
|
986
|
-
++c;
|
|
987
|
-
}
|
|
988
|
-
list.length -= c;
|
|
989
1075
|
return ret;
|
|
990
1076
|
}
|
|
991
1077
|
|
|
992
1078
|
function endReadable(stream) {
|
|
993
1079
|
var state = stream._readableState;
|
|
994
|
-
|
|
995
|
-
// If we get here before consuming all the bytes, then that is a
|
|
996
|
-
// bug in node. Should never happen.
|
|
997
|
-
if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
|
|
1080
|
+
debug('endReadable', state.endEmitted);
|
|
998
1081
|
|
|
999
1082
|
if (!state.endEmitted) {
|
|
1000
1083
|
state.ended = true;
|
|
1001
|
-
|
|
1084
|
+
process.nextTick(endReadableNT, state, stream);
|
|
1002
1085
|
}
|
|
1003
1086
|
}
|
|
1004
1087
|
|
|
1005
1088
|
function endReadableNT(state, stream) {
|
|
1006
|
-
// Check that we didn't get one last unshift.
|
|
1089
|
+
debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.
|
|
1090
|
+
|
|
1007
1091
|
if (!state.endEmitted && state.length === 0) {
|
|
1008
1092
|
state.endEmitted = true;
|
|
1009
1093
|
stream.readable = false;
|
|
1010
1094
|
stream.emit('end');
|
|
1095
|
+
|
|
1096
|
+
if (state.autoDestroy) {
|
|
1097
|
+
// In case of duplex streams we need a way to detect
|
|
1098
|
+
// if the writable side is ready for autoDestroy as well
|
|
1099
|
+
var wState = stream._writableState;
|
|
1100
|
+
|
|
1101
|
+
if (!wState || wState.autoDestroy && wState.finished) {
|
|
1102
|
+
stream.destroy();
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1011
1105
|
}
|
|
1012
1106
|
}
|
|
1013
1107
|
|
|
1108
|
+
if (typeof Symbol === 'function') {
|
|
1109
|
+
Readable.from = function (iterable, opts) {
|
|
1110
|
+
if (from === undefined) {
|
|
1111
|
+
from = require('./internal/streams/from');
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
return from(Readable, iterable, opts);
|
|
1115
|
+
};
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1014
1118
|
function indexOf(xs, x) {
|
|
1015
1119
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|
1016
1120
|
if (xs[i] === x) return i;
|
|
1017
1121
|
}
|
|
1122
|
+
|
|
1018
1123
|
return -1;
|
|
1019
1124
|
}
|