summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/_stream_readable.js39
-rw-r--r--lib/internal/streams/from.js46
-rw-r--r--node.gyp1
3 files changed, 51 insertions, 35 deletions
diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js
index 5d2300cf89..91cf2f75b0 100644
--- a/lib/_stream_readable.js
+++ b/lib/_stream_readable.js
@@ -47,6 +47,7 @@ const {
// Lazy loaded to improve the startup performance.
let StringDecoder;
let createReadableStreamAsyncIterator;
+let from;
Object.setPrototypeOf(Readable.prototype, Stream.prototype);
Object.setPrototypeOf(Readable, Stream);
@@ -1209,40 +1210,8 @@ function endReadableNT(state, stream) {
}
Readable.from = function(iterable, opts) {
- let iterator;
- if (iterable && iterable[Symbol.asyncIterator])
- iterator = iterable[Symbol.asyncIterator]();
- else if (iterable && iterable[Symbol.iterator])
- iterator = iterable[Symbol.iterator]();
- else
- throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
-
- const readable = new Readable({
- objectMode: true,
- ...opts
- });
- // Reading boolean to protect against _read
- // being called before last iteration completion.
- let reading = false;
- readable._read = function() {
- if (!reading) {
- reading = true;
- next();
- }
- };
- async function next() {
- try {
- const { value, done } = await iterator.next();
- if (done) {
- readable.push(null);
- } else if (readable.push(await value)) {
- next();
- } else {
- reading = false;
- }
- } catch (err) {
- readable.destroy(err);
- }
+ if (from === undefined) {
+ from = require('internal/streams/from');
}
- return readable;
+ return from(Readable, iterable, opts);
};
diff --git a/lib/internal/streams/from.js b/lib/internal/streams/from.js
new file mode 100644
index 0000000000..e809f2658d
--- /dev/null
+++ b/lib/internal/streams/from.js
@@ -0,0 +1,46 @@
+'use strict';
+
+const {
+ ERR_INVALID_ARG_TYPE
+} = require('internal/errors').codes;
+
+function from(Readable, iterable, opts) {
+ let iterator;
+ if (iterable && iterable[Symbol.asyncIterator])
+ iterator = iterable[Symbol.asyncIterator]();
+ else if (iterable && iterable[Symbol.iterator])
+ iterator = iterable[Symbol.iterator]();
+ else
+ throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
+
+ const readable = new Readable({
+ objectMode: true,
+ ...opts
+ });
+ // Reading boolean to protect against _read
+ // being called before last iteration completion.
+ let reading = false;
+ readable._read = function() {
+ if (!reading) {
+ reading = true;
+ next();
+ }
+ };
+ async function next() {
+ try {
+ const { value, done } = await iterator.next();
+ if (done) {
+ readable.push(null);
+ } else if (readable.push(await value)) {
+ next();
+ } else {
+ reading = false;
+ }
+ } catch (err) {
+ readable.destroy(err);
+ }
+ }
+ return readable;
+}
+
+module.exports = from;
diff --git a/node.gyp b/node.gyp
index ecdecb05f4..5f8089e617 100644
--- a/node.gyp
+++ b/node.gyp
@@ -205,6 +205,7 @@
'lib/internal/streams/async_iterator.js',
'lib/internal/streams/buffer_list.js',
'lib/internal/streams/duplexpair.js',
+ 'lib/internal/streams/from.js',
'lib/internal/streams/legacy.js',
'lib/internal/streams/destroy.js',
'lib/internal/streams/state.js',