Skip to content

Commit 8a31136

Browse files
mcollinatargos
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 375f349 commit 8a31136

File tree

3 files changed

+51
-35
lines changed

3 files changed

+51
-35
lines changed

lib/_stream_readable.js

+4-35
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const {
4747
// Lazy loaded to improve the startup performance.
4848
let StringDecoder;
4949
let createReadableStreamAsyncIterator;
50+
let from;
5051

5152
Object.setPrototypeOf(Readable.prototype, Stream.prototype);
5253
Object.setPrototypeOf(Readable, Stream);
@@ -1194,40 +1195,8 @@ function endReadableNT(state, stream) {
11941195
}
11951196

11961197
Readable.from = function(iterable, opts) {
1197-
let iterator;
1198-
if (iterable && iterable[Symbol.asyncIterator])
1199-
iterator = iterable[Symbol.asyncIterator]();
1200-
else if (iterable && iterable[Symbol.iterator])
1201-
iterator = iterable[Symbol.iterator]();
1202-
else
1203-
throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
1204-
1205-
const readable = new Readable({
1206-
objectMode: true,
1207-
...opts
1208-
});
1209-
// Reading boolean to protect against _read
1210-
// being called before last iteration completion.
1211-
let reading = false;
1212-
readable._read = function() {
1213-
if (!reading) {
1214-
reading = true;
1215-
next();
1216-
}
1217-
};
1218-
async function next() {
1219-
try {
1220-
const { value, done } = await iterator.next();
1221-
if (done) {
1222-
readable.push(null);
1223-
} else if (readable.push(await value)) {
1224-
next();
1225-
} else {
1226-
reading = false;
1227-
}
1228-
} catch (err) {
1229-
readable.destroy(err);
1230-
}
1198+
if (from === undefined) {
1199+
from = require('internal/streams/from');
12311200
}
1232-
return readable;
1201+
return from(Readable, iterable, opts);
12331202
};

lib/internal/streams/from.js

+46
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

+1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@
205205
'lib/internal/streams/async_iterator.js',
206206
'lib/internal/streams/buffer_list.js',
207207
'lib/internal/streams/duplexpair.js',
208+
'lib/internal/streams/from.js',
208209
'lib/internal/streams/legacy.js',
209210
'lib/internal/streams/destroy.js',
210211
'lib/internal/streams/state.js',

0 commit comments

Comments
 (0)