1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.mapAsyncIterator = void 0;
|
4 | const jsutils_js_1 = require("./jsutils.js");
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | function mapAsyncIterator(iterator, onNext, onError, onEnd) {
|
10 | if (Symbol.asyncIterator in iterator) {
|
11 | iterator = iterator[Symbol.asyncIterator]();
|
12 | }
|
13 | let $return;
|
14 | let abruptClose;
|
15 | let onEndWithValue;
|
16 | if (onEnd) {
|
17 | onEndWithValue = value => {
|
18 | const onEnd$ = onEnd();
|
19 | return (0, jsutils_js_1.isPromise)(onEnd$) ? onEnd$.then(() => value) : value;
|
20 | };
|
21 | }
|
22 | if (typeof iterator.return === 'function') {
|
23 | $return = iterator.return;
|
24 | abruptClose = (error) => {
|
25 | const rethrow = () => Promise.reject(error);
|
26 | return $return.call(iterator).then(rethrow, rethrow);
|
27 | };
|
28 | }
|
29 | function mapResult(result) {
|
30 | if (result.done) {
|
31 | return onEndWithValue ? onEndWithValue(result) : result;
|
32 | }
|
33 | return asyncMapValue(result.value, onNext).then(iteratorResult, abruptClose);
|
34 | }
|
35 | let mapReject;
|
36 | if (onError) {
|
37 |
|
38 | const reject = onError;
|
39 | mapReject = (error) => asyncMapValue(error, reject).then(iteratorResult, abruptClose);
|
40 | }
|
41 | return {
|
42 | next() {
|
43 | return iterator.next().then(mapResult, mapReject);
|
44 | },
|
45 | return() {
|
46 | const res$ = $return
|
47 | ? $return.call(iterator).then(mapResult, mapReject)
|
48 | : Promise.resolve({ value: undefined, done: true });
|
49 | return onEndWithValue ? res$.then(onEndWithValue) : res$;
|
50 | },
|
51 | throw(error) {
|
52 | if (typeof iterator.throw === 'function') {
|
53 | return iterator.throw(error).then(mapResult, mapReject);
|
54 | }
|
55 | return Promise.reject(error).catch(abruptClose);
|
56 | },
|
57 | [Symbol.asyncIterator]() {
|
58 | return this;
|
59 | },
|
60 | };
|
61 | }
|
62 | exports.mapAsyncIterator = mapAsyncIterator;
|
63 | function asyncMapValue(value, callback) {
|
64 | return new Promise(resolve => resolve(callback(value)));
|
65 | }
|
66 | function iteratorResult(value) {
|
67 | return { value, done: false };
|
68 | }
|