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