source: frontend/node_modules/core-js-pure/modules/es.async-disposable-stack.constructor.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 4.9 KB
Line 
1'use strict';
2// https://github.com/tc39/proposal-async-explicit-resource-management
3var $ = require('../internals/export');
4var DESCRIPTORS = require('../internals/descriptors');
5var getBuiltIn = require('../internals/get-built-in');
6var aCallable = require('../internals/a-callable');
7var anInstance = require('../internals/an-instance');
8var defineBuiltIn = require('../internals/define-built-in');
9var defineBuiltIns = require('../internals/define-built-ins');
10var defineBuiltInAccessor = require('../internals/define-built-in-accessor');
11var wellKnownSymbol = require('../internals/well-known-symbol');
12var InternalStateModule = require('../internals/internal-state');
13var addDisposableResource = require('../internals/add-disposable-resource');
14var V8_VERSION = require('../internals/environment-v8-version');
15
16var Promise = getBuiltIn('Promise');
17var SuppressedError = getBuiltIn('SuppressedError');
18var $ReferenceError = ReferenceError;
19
20var ASYNC_DISPOSE = wellKnownSymbol('asyncDispose');
21var TO_STRING_TAG = wellKnownSymbol('toStringTag');
22
23var ASYNC_DISPOSABLE_STACK = 'AsyncDisposableStack';
24var setInternalState = InternalStateModule.set;
25var getAsyncDisposableStackInternalState = InternalStateModule.getterFor(ASYNC_DISPOSABLE_STACK);
26
27var HINT = 'async-dispose';
28var DISPOSED = 'disposed';
29var PENDING = 'pending';
30
31var getPendingAsyncDisposableStackInternalState = function (stack) {
32 var internalState = getAsyncDisposableStackInternalState(stack);
33 if (internalState.state === DISPOSED) throw new $ReferenceError(ASYNC_DISPOSABLE_STACK + ' already disposed');
34 return internalState;
35};
36
37var $AsyncDisposableStack = function AsyncDisposableStack() {
38 setInternalState(anInstance(this, AsyncDisposableStackPrototype), {
39 type: ASYNC_DISPOSABLE_STACK,
40 state: PENDING,
41 stack: []
42 });
43
44 if (!DESCRIPTORS) this.disposed = false;
45};
46
47var AsyncDisposableStackPrototype = $AsyncDisposableStack.prototype;
48
49defineBuiltIns(AsyncDisposableStackPrototype, {
50 disposeAsync: function disposeAsync() {
51 var asyncDisposableStack = this;
52 return new Promise(function (resolve, reject) {
53 var internalState = getAsyncDisposableStackInternalState(asyncDisposableStack);
54 if (internalState.state === DISPOSED) return resolve(undefined);
55 internalState.state = DISPOSED;
56 if (!DESCRIPTORS) asyncDisposableStack.disposed = true;
57 var stack = internalState.stack;
58 var i = stack.length;
59 var thrown = false;
60 var suppressed;
61
62 var handleError = function (result) {
63 if (thrown) {
64 suppressed = new SuppressedError(result, suppressed);
65 } else {
66 thrown = true;
67 suppressed = result;
68 }
69
70 loop();
71 };
72
73 var loop = function () {
74 if (i) {
75 var disposeMethod = stack[--i];
76 stack[i] = null;
77 try {
78 Promise.resolve(disposeMethod()).then(loop, handleError);
79 } catch (error) {
80 handleError(error);
81 }
82 } else {
83 internalState.stack = null;
84 thrown ? reject(suppressed) : resolve(undefined);
85 }
86 };
87
88 loop();
89 });
90 },
91 use: function use(value) {
92 addDisposableResource(getPendingAsyncDisposableStackInternalState(this), value, HINT);
93 return value;
94 },
95 adopt: function adopt(value, onDispose) {
96 var internalState = getPendingAsyncDisposableStackInternalState(this);
97 aCallable(onDispose);
98 addDisposableResource(internalState, undefined, HINT, function () {
99 return onDispose(value);
100 });
101 return value;
102 },
103 defer: function defer(onDispose) {
104 var internalState = getPendingAsyncDisposableStackInternalState(this);
105 aCallable(onDispose);
106 addDisposableResource(internalState, undefined, HINT, onDispose);
107 },
108 move: function move() {
109 var internalState = getPendingAsyncDisposableStackInternalState(this);
110 var newAsyncDisposableStack = new $AsyncDisposableStack();
111 getAsyncDisposableStackInternalState(newAsyncDisposableStack).stack = internalState.stack;
112 internalState.stack = [];
113 internalState.state = DISPOSED;
114 if (!DESCRIPTORS) this.disposed = true;
115 return newAsyncDisposableStack;
116 }
117});
118
119if (DESCRIPTORS) defineBuiltInAccessor(AsyncDisposableStackPrototype, 'disposed', {
120 configurable: true,
121 get: function disposed() {
122 return getAsyncDisposableStackInternalState(this).state === DISPOSED;
123 }
124});
125
126defineBuiltIn(AsyncDisposableStackPrototype, ASYNC_DISPOSE, AsyncDisposableStackPrototype.disposeAsync, { name: 'disposeAsync' });
127defineBuiltIn(AsyncDisposableStackPrototype, TO_STRING_TAG, ASYNC_DISPOSABLE_STACK, { nonWritable: true });
128
129// https://github.com/tc39/proposal-explicit-resource-management/issues/256
130// can't be detected synchronously
131var SYNC_DISPOSE_RETURNING_PROMISE_RESOLUTION_BUG = V8_VERSION && V8_VERSION < 136;
132
133$({ global: true, constructor: true, forced: SYNC_DISPOSE_RETURNING_PROMISE_RESOLUTION_BUG }, {
134 AsyncDisposableStack: $AsyncDisposableStack
135});
Note: See TracBrowser for help on using the repository browser.