UNPKG

2.37 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.mapAsyncIterator = void 0;
4const jsutils_js_1 = require("./jsutils.js");
5/**
6 * Given an AsyncIterable and a callback function, return an AsyncIterator
7 * which produces values mapped via calling the callback function.
8 */
9function 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 // Capture rejectCallback to ensure it cannot be null.
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}
62exports.mapAsyncIterator = mapAsyncIterator;
63function asyncMapValue(value, callback) {
64 return new Promise(resolve => resolve(callback(value)));
65}
66function iteratorResult(value) {
67 return { value, done: false };
68}