123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- 'use strict';
- var call = require('../internals/function-call');
- var perform = require('../internals/perform');
- var anObject = require('../internals/an-object');
- var create = require('../internals/object-create');
- var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
- var defineBuiltIns = require('../internals/define-built-ins');
- var wellKnownSymbol = require('../internals/well-known-symbol');
- var InternalStateModule = require('../internals/internal-state');
- var getBuiltIn = require('../internals/get-built-in');
- var getMethod = require('../internals/get-method');
- var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
- var createIterResultObject = require('../internals/create-iter-result-object');
- var iteratorClose = require('../internals/iterator-close');
- var Promise = getBuiltIn('Promise');
- var ASYNC_ITERATOR_HELPER = 'AsyncIteratorHelper';
- var WRAP_FOR_VALID_ASYNC_ITERATOR = 'WrapForValidAsyncIterator';
- var setInternalState = InternalStateModule.set;
- var TO_STRING_TAG = wellKnownSymbol('toStringTag');
- var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) {
- var IS_GENERATOR = !IS_ITERATOR;
- var ASYNC_ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER;
- var getInternalState = InternalStateModule.getterFor(ASYNC_ITERATOR_PROXY);
- var getStateOrEarlyExit = function (that) {
- var stateCompletion = perform(function () {
- return getInternalState(that);
- });
- var stateError = stateCompletion.error;
- var state = stateCompletion.value;
- if (stateError || (IS_GENERATOR && state.done)) {
- return { exit: true, value: stateError ? Promise.reject(state) : Promise.resolve(createIterResultObject(undefined, true)) };
- } return { exit: false, value: state };
- };
- var enqueue = function (state, handler) {
- var task = function () {
- var promise = handler();
- if (IS_GENERATOR) {
- state.awaiting = promise;
- var clean = function () {
- if (state.awaiting === promise) state.awaiting = null;
- };
- promise.then(clean, clean);
- } return promise;
- };
- return state.awaiting ? state.awaiting = state.awaiting.then(task, task) : task();
- };
- var AsyncIteratorProxyPrototype = defineBuiltIns(create(AsyncIteratorPrototype), {
- next: function next() {
- var stateCompletion = getStateOrEarlyExit(this);
- var exit = stateCompletion.exit;
- var state = stateCompletion.value;
- return exit ? state : enqueue(state, function () {
- var handlerCompletion = perform(function () {
- return anObject(state.nextHandler(Promise));
- });
- var handlerError = handlerCompletion.error;
- var value = handlerCompletion.value;
- if (handlerError) state.done = true;
- return handlerError ? Promise.reject(value) : Promise.resolve(value);
- });
- },
- 'return': function () {
- var stateCompletion = getStateOrEarlyExit(this);
- var exit = stateCompletion.exit;
- var state = stateCompletion.value;
- return exit ? state : enqueue(state, function () {
- state.done = true;
- var iterator = state.iterator;
- var returnMethod, result;
- var completion = perform(function () {
- if (state.inner) try {
- iteratorClose(state.inner.iterator, 'return');
- } catch (error) {
- return iteratorClose(iterator, 'throw', error);
- }
- return getMethod(iterator, 'return');
- });
- returnMethod = result = completion.value;
- if (completion.error) return Promise.reject(result);
- if (returnMethod === undefined) return Promise.resolve(createIterResultObject(undefined, true));
- completion = perform(function () {
- return call(returnMethod, iterator);
- });
- result = completion.value;
- if (completion.error) return Promise.reject(result);
- return IS_ITERATOR ? Promise.resolve(result) : Promise.resolve(result).then(function (resolved) {
- anObject(resolved);
- return createIterResultObject(undefined, true);
- });
- });
- }
- });
- if (IS_GENERATOR) {
- createNonEnumerableProperty(AsyncIteratorProxyPrototype, TO_STRING_TAG, 'Async Iterator Helper');
- }
- return AsyncIteratorProxyPrototype;
- };
- var AsyncIteratorHelperPrototype = createAsyncIteratorProxyPrototype(false);
- var WrapForValidAsyncIteratorPrototype = createAsyncIteratorProxyPrototype(true);
- module.exports = function (nextHandler, IS_ITERATOR) {
- var ASYNC_ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER;
- var AsyncIteratorProxy = function AsyncIterator(record, state) {
- if (state) {
- state.iterator = record.iterator;
- state.next = record.next;
- } else state = record;
- state.type = ASYNC_ITERATOR_PROXY;
- state.nextHandler = nextHandler;
- state.counter = 0;
- state.done = false;
- state.awaiting = null;
- setInternalState(this, state);
- };
- AsyncIteratorProxy.prototype = IS_ITERATOR ? WrapForValidAsyncIteratorPrototype : AsyncIteratorHelperPrototype;
- return AsyncIteratorProxy;
- };
|