Skip to content

Commit c73f5f6

Browse files
authored
Update to Node v10.17.0 (#420)
* Update to Node v10.17.0 * Browsers might not have Symbol, from edition * Use Node 12 for airtap * test passing on browser * Update to Node 10.18.1 * fixed file patterns for build * possibly browser fix * test passing down to Node 6
1 parent ed213f0 commit c73f5f6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1396
-250
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ matrix:
1414
env: CMD=test
1515
- node_js: 12
1616
env: CMD=test
17-
- node_js: stable
17+
- node_js: 12
1818
env: CMD=test-browsers
1919
addons:
2020
sauce_connect: true

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ npm install --save readable-stream
1515

1616
This package is a mirror of the streams implementations in Node.js.
1717

18-
Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.15.3/docs/api/stream.html).
18+
Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.18.1/docs/api/stream.html).
1919

2020
If you want to guarantee a stable streams base, regardless of what version of
2121
Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).

build/build.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ pump(
131131
//--------------------------------------------------------------------
132132
// Discover, grab and process all test-stream* files on the given release
133133

134-
glob(path.join(testsrcurl, 'test-stream*.js'), function (err, list) {
134+
glob(path.join(testsrcurl, 'test-@(stream|readable)*.js'), function (err, list) {
135135
if (err) {
136136
throw err
137137
}
@@ -153,7 +153,6 @@ pump(
153153
})
154154
})
155155

156-
157156
//--------------------------------------------------------------------
158157
// Grab the nodejs/node test/common.js
159158

build/files.js

+21
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,14 @@ function CorkedRequest(state) {
208208
/return createReadableStreamAsyncIterator\(this\);\n};/m
209209
, 'return createReadableStreamAsyncIterator(this);\n};\n}'
210210
]
211+
, noAsyncIteratorsFrom1 = [
212+
/Readable\.from = function *\(iterable, opts\) \{/g
213+
, 'if (typeof Symbol === \'function\' ) {\nReadable.from = function (iterable, opts) {'
214+
]
215+
, noAsyncIteratorsFrom2 = [
216+
/return from\(Readable, iterable, opts\);\n};/m
217+
, 'return from(Readable, iterable, opts);\n};\n}'
218+
]
211219
, once = [
212220
/const \{ once \} = require\('internal\/util'\);/
213221
, 'function once(callback) { let called = false; return function(...args) { if (called) return; called = true; callback(...args); }; }'
@@ -257,6 +265,8 @@ module.exports['_stream_readable.js'] = [
257265
, numberIE11
258266
, noAsyncIterators1
259267
, noAsyncIterators2
268+
, noAsyncIteratorsFrom1
269+
, noAsyncIteratorsFrom2
260270
]
261271

262272
module.exports['_stream_transform.js'] = [
@@ -358,3 +368,14 @@ module.exports['internal/streams/pipeline.js'] = [
358368
'require(\'.\/end-of-stream\')'
359369
]
360370
]
371+
372+
module.exports['internal/streams/from.js'] = [
373+
errorsTwoLevel
374+
, [
375+
/if \(iterable && iterable\[Symbol.asyncIterator\]\)/
376+
, `if (iterable && typeof iterable.next === 'function') {
377+
iterator = iterable
378+
}
379+
else if (iterable && iterable[Symbol.asyncIterator])`
380+
]
381+
]

build/test-replacements.js

+20-1
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,14 @@ module.exports.all = [
5555
]
5656
, bufferShimFix
5757
, bufferStaticMethods
58-
, [
58+
, [
5959
/require\(['"]assert['"]\)/g
6060
, 'require(\'assert/\')'
6161
]
62+
, [
63+
/\/\/ Flags: .*/
64+
, ''
65+
]
6266
]
6367

6468
module.exports['test-stream2-basic.js'] = [
@@ -105,6 +109,14 @@ module.exports['common.js'] = [
105109
, deepStrictEqual
106110
, catchES7
107111
, catchES7OpenClose
112+
, [
113+
/require\('module'\)\.builtinModules\.includes\('worker_threads'\)/,
114+
'false'
115+
]
116+
, [
117+
/process.argv.length === 2/,
118+
'false'
119+
]
108120
, [
109121
/^( for \(var x in global\) \{|function leakedGlobals\(\) \{)$/m
110122
, ' /*<replacement>*/\n'
@@ -452,3 +464,10 @@ module.exports['test-stream-readable-async-iterators.js'] = [
452464
'const AsyncIteratorPrototype = Object\.getPrototypeOf(function () {})'
453465
]
454466
]
467+
468+
module.exports['test-readable-from.js'] = [
469+
[
470+
/const \{ once \} = require\('events'\);/
471+
, 'const once = require(\'events.once\');'
472+
]
473+
]

lib/_stream_readable.js

+54-17
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,16 @@ var _require$codes = require('../errors').codes,
8080
ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
8181
ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
8282
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;
84-
85-
var _require2 = require('../experimentalWarning'),
86-
emitExperimentalWarning = _require2.emitExperimentalWarning; // Lazy loaded to improve the startup performance.
83+
ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.
8784

8885

8986
var StringDecoder;
9087
var createReadableStreamAsyncIterator;
88+
var from;
9189

9290
require('inherits')(Readable, Stream);
9391

92+
var errorOrDestroy = destroyImpl.errorOrDestroy;
9493
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
9594

9695
function prependListener(emitter, event, fn) {
@@ -144,7 +143,9 @@ function ReadableState(options, stream, isDuplex) {
144143
this.resumeScheduled = false;
145144
this.paused = true; // Should close be emitted on destroy. Defaults to true.
146145

147-
this.emitClose = options.emitClose !== false; // has it been destroyed
146+
this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')
147+
148+
this.autoDestroy = !!options.autoDestroy; // has it been destroyed
148149

149150
this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string
150151
// encoding is 'binary' so we have to make this configurable.
@@ -257,16 +258,16 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
257258
if (!skipChunkCheck) er = chunkInvalid(state, chunk);
258259

259260
if (er) {
260-
stream.emit('error', er);
261+
errorOrDestroy(stream, er);
261262
} else if (state.objectMode || chunk && chunk.length > 0) {
262263
if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
263264
chunk = _uint8ArrayToBuffer(chunk);
264265
}
265266

266267
if (addToFront) {
267-
if (state.endEmitted) stream.emit('error', new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
268+
if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
268269
} else if (state.ended) {
269-
stream.emit('error', new ERR_STREAM_PUSH_AFTER_EOF());
270+
errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
270271
} else if (state.destroyed) {
271272
return false;
272273
} else {
@@ -322,17 +323,32 @@ Readable.prototype.isPaused = function () {
322323

323324
Readable.prototype.setEncoding = function (enc) {
324325
if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
325-
this._readableState.decoder = new StringDecoder(enc); // if setEncoding(null), decoder.encoding equals utf8
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();
326340

327-
this._readableState.encoding = this._readableState.decoder.encoding;
341+
if (content !== '') this._readableState.buffer.push(content);
342+
this._readableState.length = content.length;
328343
return this;
329-
}; // Don't raise the hwm > 8MB
344+
}; // Don't raise the hwm > 1GB
330345

331346

332-
var MAX_HWM = 0x800000;
347+
var MAX_HWM = 0x40000000;
333348

334349
function computeNewHighWaterMark(n) {
335350
if (n >= MAX_HWM) {
351+
// TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
336352
n = MAX_HWM;
337353
} else {
338354
// Get the next highest power of 2 to prevent increasing hwm excessively in
@@ -449,7 +465,7 @@ Readable.prototype.read = function (n) {
449465
if (n > 0) ret = fromList(n, state);else ret = null;
450466

451467
if (ret === null) {
452-
state.needReadable = true;
468+
state.needReadable = state.length <= state.highWaterMark;
453469
n = 0;
454470
} else {
455471
state.length -= n;
@@ -469,6 +485,7 @@ Readable.prototype.read = function (n) {
469485
};
470486

471487
function onEofChunk(stream, state) {
488+
debug('onEofChunk');
472489
if (state.ended) return;
473490

474491
if (state.decoder) {
@@ -503,6 +520,7 @@ function onEofChunk(stream, state) {
503520

504521
function emitReadable(stream) {
505522
var state = stream._readableState;
523+
debug('emitReadable', state.needReadable, state.emittedReadable);
506524
state.needReadable = false;
507525

508526
if (!state.emittedReadable) {
@@ -518,6 +536,7 @@ function emitReadable_(stream) {
518536

519537
if (!state.destroyed && (state.length || state.ended)) {
520538
stream.emit('readable');
539+
state.emittedReadable = false;
521540
} // The stream needs another readable event if
522541
// 1. It is not flowing, as the flow mechanism will take
523542
// care of it.
@@ -583,7 +602,7 @@ function maybeReadMore_(stream, state) {
583602

584603

585604
Readable.prototype._read = function (n) {
586-
this.emit('error', new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
605+
errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
587606
};
588607

589608
Readable.prototype.pipe = function (dest, pipeOpts) {
@@ -682,7 +701,7 @@ Readable.prototype.pipe = function (dest, pipeOpts) {
682701
debug('onerror', er);
683702
unpipe();
684703
dest.removeListener('error', onerror);
685-
if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
704+
if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
686705
} // Make sure our error handler is attached before userland ones.
687706

688707

@@ -986,8 +1005,6 @@ Readable.prototype.wrap = function (stream) {
9861005

9871006
if (typeof Symbol === 'function') {
9881007
Readable.prototype[Symbol.asyncIterator] = function () {
989-
emitExperimentalWarning('Readable[Symbol.asyncIterator]');
990-
9911008
if (createReadableStreamAsyncIterator === undefined) {
9921009
createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
9931010
}
@@ -1075,9 +1092,29 @@ function endReadableNT(state, stream) {
10751092
state.endEmitted = true;
10761093
stream.readable = false;
10771094
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+
}
10781105
}
10791106
}
10801107

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+
10811118
function indexOf(xs, x) {
10821119
for (var i = 0, l = xs.length; i < l; i++) {
10831120
if (xs[i] === x) return i;

lib/_stream_writable.js

+21-7
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ var _require$codes = require('../errors').codes,
9494
ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
9595
ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
9696

97+
var errorOrDestroy = destroyImpl.errorOrDestroy;
98+
9799
require('inherits')(Writable, Stream);
98100

99101
function nop() {}
@@ -173,7 +175,9 @@ function WritableState(options, stream, isDuplex) {
173175

174176
this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.
175177

176-
this.emitClose = options.emitClose !== false; // count buffered requests
178+
this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')
179+
180+
this.autoDestroy = !!options.autoDestroy; // count buffered requests
177181

178182
this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
179183
// one allocated and free to use, and we maintain at most two
@@ -250,13 +254,13 @@ function Writable(options) {
250254

251255

252256
Writable.prototype.pipe = function () {
253-
this.emit('error', new ERR_STREAM_CANNOT_PIPE());
257+
errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
254258
};
255259

256260
function writeAfterEnd(stream, cb) {
257261
var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb
258262

259-
stream.emit('error', er);
263+
errorOrDestroy(stream, er);
260264
process.nextTick(cb, er);
261265
} // Checks that a user-supplied chunk is valid, especially for the particular
262266
// mode the stream is in. Currently this means that `null` is never accepted
@@ -273,7 +277,7 @@ function validChunk(stream, state, chunk, cb) {
273277
}
274278

275279
if (er) {
276-
stream.emit('error', er);
280+
errorOrDestroy(stream, er);
277281
process.nextTick(cb, er);
278282
return false;
279283
}
@@ -417,13 +421,13 @@ function onwriteError(stream, state, sync, er, cb) {
417421

418422
process.nextTick(finishMaybe, stream, state);
419423
stream._writableState.errorEmitted = true;
420-
stream.emit('error', er);
424+
errorOrDestroy(stream, er);
421425
} else {
422426
// the caller expect this to happen before if
423427
// it is async
424428
cb(er);
425429
stream._writableState.errorEmitted = true;
426-
stream.emit('error', er); // this can emit finish, but finish must
430+
errorOrDestroy(stream, er); // this can emit finish, but finish must
427431
// always follow error
428432

429433
finishMaybe(stream, state);
@@ -587,7 +591,7 @@ function callFinal(stream, state) {
587591
state.pendingcb--;
588592

589593
if (err) {
590-
stream.emit('error', err);
594+
errorOrDestroy(stream, err);
591595
}
592596

593597
state.prefinished = true;
@@ -618,6 +622,16 @@ function finishMaybe(stream, state) {
618622
if (state.pendingcb === 0) {
619623
state.finished = true;
620624
stream.emit('finish');
625+
626+
if (state.autoDestroy) {
627+
// In case of duplex streams we need a way to detect
628+
// if the readable side is ready for autoDestroy as well
629+
var rState = stream._readableState;
630+
631+
if (!rState || rState.autoDestroy && rState.endEmitted) {
632+
stream.destroy();
633+
}
634+
}
621635
}
622636
}
623637

lib/internal/streams/buffer_list.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

3-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
3+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
4+
5+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
46

57
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
68

0 commit comments

Comments
 (0)