| 'use strict'; | 
| // https://github.com/tc39/proposal-async-explicit-resource-management | 
| var $ = require('../internals/export'); | 
| var DESCRIPTORS = require('../internals/descriptors'); | 
| var getBuiltIn = require('../internals/get-built-in'); | 
| var aCallable = require('../internals/a-callable'); | 
| var anInstance = require('../internals/an-instance'); | 
| var defineBuiltIn = require('../internals/define-built-in'); | 
| var defineBuiltIns = require('../internals/define-built-ins'); | 
| var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); | 
| var wellKnownSymbol = require('../internals/well-known-symbol'); | 
| var InternalStateModule = require('../internals/internal-state'); | 
| var addDisposableResource = require('../internals/add-disposable-resource'); | 
| var V8_VERSION = require('../internals/environment-v8-version'); | 
|   | 
| var Promise = getBuiltIn('Promise'); | 
| var SuppressedError = getBuiltIn('SuppressedError'); | 
| var $ReferenceError = ReferenceError; | 
|   | 
| var ASYNC_DISPOSE = wellKnownSymbol('asyncDispose'); | 
| var TO_STRING_TAG = wellKnownSymbol('toStringTag'); | 
|   | 
| var ASYNC_DISPOSABLE_STACK = 'AsyncDisposableStack'; | 
| var setInternalState = InternalStateModule.set; | 
| var getAsyncDisposableStackInternalState = InternalStateModule.getterFor(ASYNC_DISPOSABLE_STACK); | 
|   | 
| var HINT = 'async-dispose'; | 
| var DISPOSED = 'disposed'; | 
| var PENDING = 'pending'; | 
|   | 
| var getPendingAsyncDisposableStackInternalState = function (stack) { | 
|   var internalState = getAsyncDisposableStackInternalState(stack); | 
|   if (internalState.state === DISPOSED) throw new $ReferenceError(ASYNC_DISPOSABLE_STACK + ' already disposed'); | 
|   return internalState; | 
| }; | 
|   | 
| var $AsyncDisposableStack = function AsyncDisposableStack() { | 
|   setInternalState(anInstance(this, AsyncDisposableStackPrototype), { | 
|     type: ASYNC_DISPOSABLE_STACK, | 
|     state: PENDING, | 
|     stack: [] | 
|   }); | 
|   | 
|   if (!DESCRIPTORS) this.disposed = false; | 
| }; | 
|   | 
| var AsyncDisposableStackPrototype = $AsyncDisposableStack.prototype; | 
|   | 
| defineBuiltIns(AsyncDisposableStackPrototype, { | 
|   disposeAsync: function disposeAsync() { | 
|     var asyncDisposableStack = this; | 
|     return new Promise(function (resolve, reject) { | 
|       var internalState = getAsyncDisposableStackInternalState(asyncDisposableStack); | 
|       if (internalState.state === DISPOSED) return resolve(undefined); | 
|       internalState.state = DISPOSED; | 
|       if (!DESCRIPTORS) asyncDisposableStack.disposed = true; | 
|       var stack = internalState.stack; | 
|       var i = stack.length; | 
|       var thrown = false; | 
|       var suppressed; | 
|   | 
|       var handleError = function (result) { | 
|         if (thrown) { | 
|           suppressed = new SuppressedError(result, suppressed); | 
|         } else { | 
|           thrown = true; | 
|           suppressed = result; | 
|         } | 
|   | 
|         loop(); | 
|       }; | 
|   | 
|       var loop = function () { | 
|         if (i) { | 
|           var disposeMethod = stack[--i]; | 
|           stack[i] = null; | 
|           try { | 
|             Promise.resolve(disposeMethod()).then(loop, handleError); | 
|           } catch (error) { | 
|             handleError(error); | 
|           } | 
|         } else { | 
|           internalState.stack = null; | 
|           thrown ? reject(suppressed) : resolve(undefined); | 
|         } | 
|       }; | 
|   | 
|       loop(); | 
|     }); | 
|   }, | 
|   use: function use(value) { | 
|     addDisposableResource(getPendingAsyncDisposableStackInternalState(this), value, HINT); | 
|     return value; | 
|   }, | 
|   adopt: function adopt(value, onDispose) { | 
|     var internalState = getPendingAsyncDisposableStackInternalState(this); | 
|     aCallable(onDispose); | 
|     addDisposableResource(internalState, undefined, HINT, function () { | 
|       return onDispose(value); | 
|     }); | 
|     return value; | 
|   }, | 
|   defer: function defer(onDispose) { | 
|     var internalState = getPendingAsyncDisposableStackInternalState(this); | 
|     aCallable(onDispose); | 
|     addDisposableResource(internalState, undefined, HINT, onDispose); | 
|   }, | 
|   move: function move() { | 
|     var internalState = getPendingAsyncDisposableStackInternalState(this); | 
|     var newAsyncDisposableStack = new $AsyncDisposableStack(); | 
|     getAsyncDisposableStackInternalState(newAsyncDisposableStack).stack = internalState.stack; | 
|     internalState.stack = []; | 
|     internalState.state = DISPOSED; | 
|     if (!DESCRIPTORS) this.disposed = true; | 
|     return newAsyncDisposableStack; | 
|   } | 
| }); | 
|   | 
| if (DESCRIPTORS) defineBuiltInAccessor(AsyncDisposableStackPrototype, 'disposed', { | 
|   configurable: true, | 
|   get: function disposed() { | 
|     return getAsyncDisposableStackInternalState(this).state === DISPOSED; | 
|   } | 
| }); | 
|   | 
| defineBuiltIn(AsyncDisposableStackPrototype, ASYNC_DISPOSE, AsyncDisposableStackPrototype.disposeAsync, { name: 'disposeAsync' }); | 
| defineBuiltIn(AsyncDisposableStackPrototype, TO_STRING_TAG, ASYNC_DISPOSABLE_STACK, { nonWritable: true }); | 
|   | 
| // https://github.com/tc39/proposal-explicit-resource-management/issues/256 | 
| // can't be detected synchronously | 
| var SYNC_DISPOSE_RETURNING_PROMISE_RESOLUTION_BUG = V8_VERSION && V8_VERSION < 136; | 
|   | 
| $({ global: true, constructor: true, forced: SYNC_DISPOSE_RETURNING_PROMISE_RESOLUTION_BUG }, { | 
|   AsyncDisposableStack: $AsyncDisposableStack | 
| }); |