UNPKG

2.12 kBJavaScriptView Raw
1import { canUseAsyncIteratorSymbol } from "../../../utilities/index.js";
2export default function nodeStreamIterator(stream) {
3 var cleanup = null;
4 var error = null;
5 var done = false;
6 var data = [];
7 var waiting = [];
8 function onData(chunk) {
9 if (error)
10 return;
11 if (waiting.length) {
12 var shiftedArr = waiting.shift();
13 if (Array.isArray(shiftedArr) && shiftedArr[0]) {
14 return shiftedArr[0]({ value: chunk, done: false });
15 }
16 }
17 data.push(chunk);
18 }
19 function onError(err) {
20 error = err;
21 var all = waiting.slice();
22 all.forEach(function (pair) {
23 pair[1](err);
24 });
25 !cleanup || cleanup();
26 }
27 function onEnd() {
28 done = true;
29 var all = waiting.slice();
30 all.forEach(function (pair) {
31 pair[0]({ value: undefined, done: true });
32 });
33 !cleanup || cleanup();
34 }
35 cleanup = function () {
36 cleanup = null;
37 stream.removeListener("data", onData);
38 stream.removeListener("error", onError);
39 stream.removeListener("end", onEnd);
40 stream.removeListener("finish", onEnd);
41 stream.removeListener("close", onEnd);
42 };
43 stream.on("data", onData);
44 stream.on("error", onError);
45 stream.on("end", onEnd);
46 stream.on("finish", onEnd);
47 stream.on("close", onEnd);
48 function getNext() {
49 return new Promise(function (resolve, reject) {
50 if (error)
51 return reject(error);
52 if (data.length)
53 return resolve({ value: data.shift(), done: false });
54 if (done)
55 return resolve({ value: undefined, done: true });
56 waiting.push([resolve, reject]);
57 });
58 }
59 var iterator = {
60 next: function () {
61 return getNext();
62 },
63 };
64 if (canUseAsyncIteratorSymbol) {
65 iterator[Symbol.asyncIterator] = function () {
66 return this;
67 };
68 }
69 return iterator;
70}
71//# sourceMappingURL=nodeStream.js.map
\No newline at end of file