stream: extract Readable.from in its own file · nodejs/node@894aaa2 · GitHub
Skip to content

Commit 894aaa2

Browse files
mcollinaMylesBorins
authored andcommitted
stream: extract Readable.from in its own file
See: nodejs/readable-stream#420 PR-URL: #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>
1 parent 20f64a9 commit 894aaa2

3 files changed

Lines changed: 51 additions & 35 deletions

File tree

lib/_stream_readable.js

Lines changed: 4 additions & 35 deletions

lib/internal/streams/from.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict';
2+
3+
const {
4+
ERR_INVALID_ARG_TYPE
5+
} = require('internal/errors').codes;
6+
7+
function from(Readable, iterable, opts) {
8+
let iterator;
9+
if (iterable && iterable[Symbol.asyncIterator])
10+
iterator = iterable[Symbol.asyncIterator]();
11+
else if (iterable && iterable[Symbol.iterator])
12+
iterator = iterable[Symbol.iterator]();
13+
else
14+
throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
15+
16+
const readable = new Readable({
17+
objectMode: true,
18+
...opts
19+
});
20+
// Reading boolean to protect against _read
21+
// being called before last iteration completion.
22+
let reading = false;
23+
readable._read = function() {
24+
if (!reading) {
25+
reading = true;
26+
next();
27+
}
28+
};
29+
async function next() {
30+
try {
31+
const { value, done } = await iterator.next();
32+
if (done) {
33+
readable.push(null);
34+
} else if (readable.push(await value)) {
35+
next();
36+
} else {
37+
reading = false;
38+
}
39+
} catch (err) {
40+
readable.destroy(err);
41+
}
42+
}
43+
return readable;
44+
}
45+
46+
module.exports = from;

node.gyp

Lines changed: 1 addition & 0 deletions

0 commit comments

Comments
 (0)