| 1 | 'use strict';
|
|---|
| 2 | var call = require('../internals/function-call');
|
|---|
| 3 | var perform = require('../internals/perform');
|
|---|
| 4 | var anObject = require('../internals/an-object');
|
|---|
| 5 | var create = require('../internals/object-create');
|
|---|
| 6 | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
|---|
| 7 | var defineBuiltIns = require('../internals/define-built-ins');
|
|---|
| 8 | var wellKnownSymbol = require('../internals/well-known-symbol');
|
|---|
| 9 | var InternalStateModule = require('../internals/internal-state');
|
|---|
| 10 | var getBuiltIn = require('../internals/get-built-in');
|
|---|
| 11 | var getMethod = require('../internals/get-method');
|
|---|
| 12 | var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
|
|---|
| 13 | var createIterResultObject = require('../internals/create-iter-result-object');
|
|---|
| 14 |
|
|---|
| 15 | var Promise = getBuiltIn('Promise');
|
|---|
| 16 |
|
|---|
| 17 | var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|---|
| 18 | var ASYNC_ITERATOR_HELPER = 'AsyncIteratorHelper';
|
|---|
| 19 | var WRAP_FOR_VALID_ASYNC_ITERATOR = 'WrapForValidAsyncIterator';
|
|---|
| 20 | var setInternalState = InternalStateModule.set;
|
|---|
| 21 |
|
|---|
| 22 | var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) {
|
|---|
| 23 | var IS_GENERATOR = !IS_ITERATOR;
|
|---|
| 24 | var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER);
|
|---|
| 25 |
|
|---|
| 26 | var getStateOrEarlyExit = function (that) {
|
|---|
| 27 | var stateCompletion = perform(function () {
|
|---|
| 28 | return getInternalState(that);
|
|---|
| 29 | });
|
|---|
| 30 |
|
|---|
| 31 | var stateError = stateCompletion.error;
|
|---|
| 32 | var state = stateCompletion.value;
|
|---|
| 33 |
|
|---|
| 34 | if (stateError || (IS_GENERATOR && state.done)) {
|
|---|
| 35 | return { exit: true, value: stateError ? Promise.reject(state) : Promise.resolve(createIterResultObject(undefined, true)) };
|
|---|
| 36 | } return { exit: false, value: state };
|
|---|
| 37 | };
|
|---|
| 38 |
|
|---|
| 39 | return defineBuiltIns(create(AsyncIteratorPrototype), {
|
|---|
| 40 | next: function next() {
|
|---|
| 41 | var stateCompletion = getStateOrEarlyExit(this);
|
|---|
| 42 | var state = stateCompletion.value;
|
|---|
| 43 | if (stateCompletion.exit) return state;
|
|---|
| 44 | var handlerCompletion = perform(function () {
|
|---|
| 45 | return anObject(state.nextHandler(Promise));
|
|---|
| 46 | });
|
|---|
| 47 | var handlerError = handlerCompletion.error;
|
|---|
| 48 | var value = handlerCompletion.value;
|
|---|
| 49 | if (handlerError) state.done = true;
|
|---|
| 50 | return handlerError ? Promise.reject(value) : Promise.resolve(value);
|
|---|
| 51 | },
|
|---|
| 52 | 'return': function () {
|
|---|
| 53 | var stateCompletion = getStateOrEarlyExit(this);
|
|---|
| 54 | var state = stateCompletion.value;
|
|---|
| 55 | if (stateCompletion.exit) return state;
|
|---|
| 56 | state.done = true;
|
|---|
| 57 | var iterator = state.iterator;
|
|---|
| 58 | var inner = state.inner;
|
|---|
| 59 | var returnMethod, result;
|
|---|
| 60 | var closeOuterIterator = function () {
|
|---|
| 61 | var completion = perform(function () {
|
|---|
| 62 | return getMethod(iterator, 'return');
|
|---|
| 63 | });
|
|---|
| 64 | returnMethod = result = completion.value;
|
|---|
| 65 | if (completion.error) return Promise.reject(result);
|
|---|
| 66 | if (returnMethod === undefined) return Promise.resolve(createIterResultObject(undefined, true));
|
|---|
| 67 | completion = perform(function () {
|
|---|
| 68 | return call(returnMethod, iterator);
|
|---|
| 69 | });
|
|---|
| 70 | result = completion.value;
|
|---|
| 71 | if (completion.error) return Promise.reject(result);
|
|---|
| 72 | return IS_ITERATOR ? Promise.resolve(result) : Promise.resolve(result).then(function (resolved) {
|
|---|
| 73 | anObject(resolved);
|
|---|
| 74 | return createIterResultObject(undefined, true);
|
|---|
| 75 | });
|
|---|
| 76 | };
|
|---|
| 77 |
|
|---|
| 78 | var closeAndReject = function (error) {
|
|---|
| 79 | return closeOuterIterator().then(function () {
|
|---|
| 80 | throw error;
|
|---|
| 81 | }, function () {
|
|---|
| 82 | throw error;
|
|---|
| 83 | });
|
|---|
| 84 | };
|
|---|
| 85 |
|
|---|
| 86 | if (inner) {
|
|---|
| 87 | var innerIterator = inner.iterator;
|
|---|
| 88 | var innerReturn;
|
|---|
| 89 | var completion = perform(function () {
|
|---|
| 90 | innerReturn = getMethod(innerIterator, 'return');
|
|---|
| 91 | if (innerReturn) return call(innerReturn, innerIterator);
|
|---|
| 92 | });
|
|---|
| 93 | if (completion.error) return closeAndReject(completion.value);
|
|---|
| 94 | if (innerReturn) {
|
|---|
| 95 | return Promise.resolve(completion.value).then(function (innerResult) {
|
|---|
| 96 | try {
|
|---|
| 97 | anObject(innerResult);
|
|---|
| 98 | } catch (error) {
|
|---|
| 99 | return closeAndReject(error);
|
|---|
| 100 | }
|
|---|
| 101 | return closeOuterIterator();
|
|---|
| 102 | }, closeAndReject);
|
|---|
| 103 | }
|
|---|
| 104 | }
|
|---|
| 105 |
|
|---|
| 106 | return closeOuterIterator();
|
|---|
| 107 | }
|
|---|
| 108 | });
|
|---|
| 109 | };
|
|---|
| 110 |
|
|---|
| 111 | var WrapForValidAsyncIteratorPrototype = createAsyncIteratorProxyPrototype(true);
|
|---|
| 112 | var AsyncIteratorHelperPrototype = createAsyncIteratorProxyPrototype(false);
|
|---|
| 113 |
|
|---|
| 114 | createNonEnumerableProperty(AsyncIteratorHelperPrototype, TO_STRING_TAG, 'Async Iterator Helper');
|
|---|
| 115 |
|
|---|
| 116 | module.exports = function (nextHandler, IS_ITERATOR) {
|
|---|
| 117 | var AsyncIteratorProxy = function AsyncIterator(record, state) {
|
|---|
| 118 | if (state) {
|
|---|
| 119 | state.iterator = record.iterator;
|
|---|
| 120 | state.next = record.next;
|
|---|
| 121 | } else state = record;
|
|---|
| 122 | state.type = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER;
|
|---|
| 123 | state.nextHandler = nextHandler;
|
|---|
| 124 | state.counter = 0;
|
|---|
| 125 | state.done = false;
|
|---|
| 126 | setInternalState(this, state);
|
|---|
| 127 | };
|
|---|
| 128 |
|
|---|
| 129 | AsyncIteratorProxy.prototype = IS_ITERATOR ? WrapForValidAsyncIteratorPrototype : AsyncIteratorHelperPrototype;
|
|---|
| 130 |
|
|---|
| 131 | return AsyncIteratorProxy;
|
|---|
| 132 | };
|
|---|