summaryrefslogtreecommitdiff
path: root/lib/internal/streams/from.js
diff options
context:
space:
mode:
authorMatteo Collina <hello@matteocollina.com>2019-10-27 01:09:03 +0200
committerMatteo Collina <hello@matteocollina.com>2019-10-29 09:36:24 +0100
commit009952935f253405ac095a4aaaa762fb080b7cb9 (patch)
treed71ba250495482c7f7d6b371a8b8b4a93d61f451 /lib/internal/streams/from.js
parent1d89c5d1e16d67962db2735efc601b48bd78255d (diff)
downloadandroid-node-v8-009952935f253405ac095a4aaaa762fb080b7cb9.tar.gz
android-node-v8-009952935f253405ac095a4aaaa762fb080b7cb9.tar.bz2
android-node-v8-009952935f253405ac095a4aaaa762fb080b7cb9.zip
stream: extract Readable.from in its own file
See: https://github.com/nodejs/readable-stream/pull/420 PR-URL: https://github.com/nodejs/node/pull/30140 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Beth Griggs <Bethany.Griggs@uk.ibm.com>
Diffstat (limited to 'lib/internal/streams/from.js')
-rw-r--r--lib/internal/streams/from.js46
1 files changed, 46 insertions, 0 deletions
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;