@dxos/context 0.8.4-main.a4bbb77 → 0.8.4-main.ae835ea
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +129 -286
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +129 -286
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/resource.d.ts +6 -2
- package/dist/types/src/resource.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/resource.ts +14 -4
|
@@ -12,59 +12,6 @@ var ContextDisposedError = class extends Error {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
// src/context.ts
|
|
15
|
-
function _check_private_redeclaration(obj, privateCollection) {
|
|
16
|
-
if (privateCollection.has(obj)) {
|
|
17
|
-
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function _class_apply_descriptor_get(receiver, descriptor) {
|
|
21
|
-
if (descriptor.get) {
|
|
22
|
-
return descriptor.get.call(receiver);
|
|
23
|
-
}
|
|
24
|
-
return descriptor.value;
|
|
25
|
-
}
|
|
26
|
-
function _class_apply_descriptor_set(receiver, descriptor, value) {
|
|
27
|
-
if (descriptor.set) {
|
|
28
|
-
descriptor.set.call(receiver, value);
|
|
29
|
-
} else {
|
|
30
|
-
if (!descriptor.writable) {
|
|
31
|
-
throw new TypeError("attempted to set read only private field");
|
|
32
|
-
}
|
|
33
|
-
descriptor.value = value;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function _class_extract_field_descriptor(receiver, privateMap, action) {
|
|
37
|
-
if (!privateMap.has(receiver)) {
|
|
38
|
-
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
39
|
-
}
|
|
40
|
-
return privateMap.get(receiver);
|
|
41
|
-
}
|
|
42
|
-
function _class_private_field_get(receiver, privateMap) {
|
|
43
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
|
|
44
|
-
return _class_apply_descriptor_get(receiver, descriptor);
|
|
45
|
-
}
|
|
46
|
-
function _class_private_field_init(obj, privateMap, value) {
|
|
47
|
-
_check_private_redeclaration(obj, privateMap);
|
|
48
|
-
privateMap.set(obj, value);
|
|
49
|
-
}
|
|
50
|
-
function _class_private_field_set(receiver, privateMap, value) {
|
|
51
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
|
|
52
|
-
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
53
|
-
return value;
|
|
54
|
-
}
|
|
55
|
-
function _define_property(obj, key, value) {
|
|
56
|
-
if (key in obj) {
|
|
57
|
-
Object.defineProperty(obj, key, {
|
|
58
|
-
value,
|
|
59
|
-
enumerable: true,
|
|
60
|
-
configurable: true,
|
|
61
|
-
writable: true
|
|
62
|
-
});
|
|
63
|
-
} else {
|
|
64
|
-
obj[key] = value;
|
|
65
|
-
}
|
|
66
|
-
return obj;
|
|
67
|
-
}
|
|
68
15
|
function _ts_decorate(decorators, target, key, desc) {
|
|
69
16
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
70
17
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -83,25 +30,41 @@ var DEFAULT_ERROR_HANDLER = (error, ctx) => {
|
|
|
83
30
|
};
|
|
84
31
|
var CONTEXT_FLAG_IS_DISPOSED = 1 << 0;
|
|
85
32
|
var CONTEXT_FLAG_LEAK_DETECTED = 1 << 1;
|
|
86
|
-
var _disposeCallbacks = /* @__PURE__ */ new WeakMap();
|
|
87
|
-
var _name = /* @__PURE__ */ new WeakMap();
|
|
88
|
-
var _parent = /* @__PURE__ */ new WeakMap();
|
|
89
|
-
var _attributes = /* @__PURE__ */ new WeakMap();
|
|
90
|
-
var _onError = /* @__PURE__ */ new WeakMap();
|
|
91
|
-
var _flags = /* @__PURE__ */ new WeakMap();
|
|
92
|
-
var _disposePromise = /* @__PURE__ */ new WeakMap();
|
|
93
|
-
var _isDisposed = /* @__PURE__ */ new WeakMap();
|
|
94
|
-
var _leakDetected = /* @__PURE__ */ new WeakMap();
|
|
95
|
-
var _inspect_custom = inspect.custom;
|
|
96
33
|
var Context = class _Context {
|
|
97
34
|
static default() {
|
|
98
35
|
return new _Context();
|
|
99
36
|
}
|
|
37
|
+
#disposeCallbacks = [];
|
|
38
|
+
#name = void 0;
|
|
39
|
+
#parent = void 0;
|
|
40
|
+
#attributes;
|
|
41
|
+
#onError;
|
|
42
|
+
#flags = 0;
|
|
43
|
+
#disposePromise = void 0;
|
|
44
|
+
maxSafeDisposeCallbacks = MAX_SAFE_DISPOSE_CALLBACKS;
|
|
45
|
+
constructor(params = {}, callMeta) {
|
|
46
|
+
this.#name = getContextName(params, callMeta);
|
|
47
|
+
this.#parent = params.parent;
|
|
48
|
+
this.#attributes = params.attributes ?? {};
|
|
49
|
+
this.#onError = params.onError ?? DEFAULT_ERROR_HANDLER;
|
|
50
|
+
}
|
|
51
|
+
get #isDisposed() {
|
|
52
|
+
return !!(this.#flags & CONTEXT_FLAG_IS_DISPOSED);
|
|
53
|
+
}
|
|
54
|
+
set #isDisposed(value) {
|
|
55
|
+
this.#flags = value ? this.#flags | CONTEXT_FLAG_IS_DISPOSED : this.#flags & ~CONTEXT_FLAG_IS_DISPOSED;
|
|
56
|
+
}
|
|
57
|
+
get #leakDetected() {
|
|
58
|
+
return !!(this.#flags & CONTEXT_FLAG_LEAK_DETECTED);
|
|
59
|
+
}
|
|
60
|
+
set #leakDetected(value) {
|
|
61
|
+
this.#flags = value ? this.#flags | CONTEXT_FLAG_LEAK_DETECTED : this.#flags & ~CONTEXT_FLAG_LEAK_DETECTED;
|
|
62
|
+
}
|
|
100
63
|
get disposed() {
|
|
101
|
-
return
|
|
64
|
+
return this.#isDisposed;
|
|
102
65
|
}
|
|
103
66
|
get disposeCallbacksLength() {
|
|
104
|
-
return
|
|
67
|
+
return this.#disposeCallbacks.length;
|
|
105
68
|
}
|
|
106
69
|
/**
|
|
107
70
|
* Schedules a callback to run when the context is disposed.
|
|
@@ -113,13 +76,13 @@ var Context = class _Context {
|
|
|
113
76
|
* @returns A function that can be used to remove the callback from the dispose list.
|
|
114
77
|
*/
|
|
115
78
|
onDispose(callback) {
|
|
116
|
-
if (
|
|
79
|
+
if (this.#isDisposed) {
|
|
117
80
|
void (async () => {
|
|
118
81
|
try {
|
|
119
82
|
await callback();
|
|
120
83
|
} catch (error) {
|
|
121
84
|
log.catch(error, {
|
|
122
|
-
context:
|
|
85
|
+
context: this.#name
|
|
123
86
|
}, {
|
|
124
87
|
F: __dxlog_file,
|
|
125
88
|
L: 119,
|
|
@@ -129,14 +92,14 @@ var Context = class _Context {
|
|
|
129
92
|
}
|
|
130
93
|
})();
|
|
131
94
|
}
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
|
|
95
|
+
this.#disposeCallbacks.push(callback);
|
|
96
|
+
if (this.#disposeCallbacks.length > this.maxSafeDisposeCallbacks && !this.#leakDetected) {
|
|
97
|
+
this.#leakDetected = true;
|
|
135
98
|
const callSite = new StackTrace().getStackArray(1)[0].trim();
|
|
136
99
|
log.warn("Context has a large number of dispose callbacks (this might be a memory leak).", {
|
|
137
|
-
context:
|
|
100
|
+
context: this.#name,
|
|
138
101
|
callSite,
|
|
139
|
-
count:
|
|
102
|
+
count: this.#disposeCallbacks.length
|
|
140
103
|
}, {
|
|
141
104
|
F: __dxlog_file,
|
|
142
105
|
L: 128,
|
|
@@ -145,9 +108,9 @@ var Context = class _Context {
|
|
|
145
108
|
});
|
|
146
109
|
}
|
|
147
110
|
return () => {
|
|
148
|
-
const index =
|
|
111
|
+
const index = this.#disposeCallbacks.indexOf(callback);
|
|
149
112
|
if (index !== -1) {
|
|
150
|
-
|
|
113
|
+
this.#disposeCallbacks.splice(index, 1);
|
|
151
114
|
}
|
|
152
115
|
};
|
|
153
116
|
}
|
|
@@ -160,20 +123,20 @@ var Context = class _Context {
|
|
|
160
123
|
* @returns true if there were no errors during the dispose process.
|
|
161
124
|
*/
|
|
162
125
|
async dispose(throwOnError = false) {
|
|
163
|
-
if (
|
|
164
|
-
return
|
|
126
|
+
if (this.#disposePromise) {
|
|
127
|
+
return this.#disposePromise;
|
|
165
128
|
}
|
|
166
|
-
|
|
129
|
+
this.#isDisposed = true;
|
|
167
130
|
let resolveDispose;
|
|
168
131
|
const promise = new Promise((resolve) => {
|
|
169
132
|
resolveDispose = resolve;
|
|
170
133
|
});
|
|
171
|
-
|
|
172
|
-
const callbacks = Array.from(
|
|
173
|
-
|
|
134
|
+
this.#disposePromise = promise;
|
|
135
|
+
const callbacks = Array.from(this.#disposeCallbacks).reverse();
|
|
136
|
+
this.#disposeCallbacks.length = 0;
|
|
174
137
|
if (DEBUG_LOG_DISPOSE) {
|
|
175
138
|
log("disposing", {
|
|
176
|
-
context:
|
|
139
|
+
context: this.#name,
|
|
177
140
|
count: callbacks.length
|
|
178
141
|
}, {
|
|
179
142
|
F: __dxlog_file,
|
|
@@ -195,7 +158,7 @@ var Context = class _Context {
|
|
|
195
158
|
errors.push(err);
|
|
196
159
|
} else {
|
|
197
160
|
log.catch(err, {
|
|
198
|
-
context:
|
|
161
|
+
context: this.#name,
|
|
199
162
|
callback: i,
|
|
200
163
|
count: callbacks.length
|
|
201
164
|
}, {
|
|
@@ -213,7 +176,7 @@ var Context = class _Context {
|
|
|
213
176
|
resolveDispose(clean);
|
|
214
177
|
if (DEBUG_LOG_DISPOSE) {
|
|
215
178
|
log("disposed", {
|
|
216
|
-
context:
|
|
179
|
+
context: this.#name
|
|
217
180
|
}, {
|
|
218
181
|
F: __dxlog_file,
|
|
219
182
|
L: 199,
|
|
@@ -229,11 +192,11 @@ var Context = class _Context {
|
|
|
229
192
|
* IF the error handler is not set, the error will dispose the context and cause an unhandled rejection.
|
|
230
193
|
*/
|
|
231
194
|
raise(error) {
|
|
232
|
-
if (
|
|
195
|
+
if (this.#isDisposed) {
|
|
233
196
|
return;
|
|
234
197
|
}
|
|
235
198
|
try {
|
|
236
|
-
|
|
199
|
+
this.#onError(error, this);
|
|
237
200
|
} catch (err) {
|
|
238
201
|
void Promise.reject(err);
|
|
239
202
|
}
|
|
@@ -259,78 +222,23 @@ var Context = class _Context {
|
|
|
259
222
|
return newCtx;
|
|
260
223
|
}
|
|
261
224
|
getAttribute(key) {
|
|
262
|
-
if (key in
|
|
263
|
-
return
|
|
225
|
+
if (key in this.#attributes) {
|
|
226
|
+
return this.#attributes[key];
|
|
264
227
|
}
|
|
265
|
-
if (
|
|
266
|
-
return
|
|
228
|
+
if (this.#parent) {
|
|
229
|
+
return this.#parent.getAttribute(key);
|
|
267
230
|
}
|
|
268
231
|
return void 0;
|
|
269
232
|
}
|
|
233
|
+
[Symbol.toStringTag] = "Context";
|
|
234
|
+
[inspect.custom] = () => this.toString();
|
|
270
235
|
toString() {
|
|
271
|
-
return `Context(${
|
|
236
|
+
return `Context(${this.#isDisposed ? "disposed" : "active"})`;
|
|
272
237
|
}
|
|
273
238
|
async [Symbol.asyncDispose]() {
|
|
274
239
|
await this.dispose();
|
|
275
240
|
}
|
|
276
|
-
constructor(params = {}, callMeta) {
|
|
277
|
-
_class_private_field_init(this, _isDisposed, {
|
|
278
|
-
get: get_isDisposed,
|
|
279
|
-
set: set_isDisposed
|
|
280
|
-
});
|
|
281
|
-
_class_private_field_init(this, _leakDetected, {
|
|
282
|
-
get: get_leakDetected,
|
|
283
|
-
set: set_leakDetected
|
|
284
|
-
});
|
|
285
|
-
_class_private_field_init(this, _disposeCallbacks, {
|
|
286
|
-
writable: true,
|
|
287
|
-
value: []
|
|
288
|
-
});
|
|
289
|
-
_class_private_field_init(this, _name, {
|
|
290
|
-
writable: true,
|
|
291
|
-
value: void 0
|
|
292
|
-
});
|
|
293
|
-
_class_private_field_init(this, _parent, {
|
|
294
|
-
writable: true,
|
|
295
|
-
value: void 0
|
|
296
|
-
});
|
|
297
|
-
_class_private_field_init(this, _attributes, {
|
|
298
|
-
writable: true,
|
|
299
|
-
value: void 0
|
|
300
|
-
});
|
|
301
|
-
_class_private_field_init(this, _onError, {
|
|
302
|
-
writable: true,
|
|
303
|
-
value: void 0
|
|
304
|
-
});
|
|
305
|
-
_class_private_field_init(this, _flags, {
|
|
306
|
-
writable: true,
|
|
307
|
-
value: 0
|
|
308
|
-
});
|
|
309
|
-
_class_private_field_init(this, _disposePromise, {
|
|
310
|
-
writable: true,
|
|
311
|
-
value: void 0
|
|
312
|
-
});
|
|
313
|
-
_define_property(this, "maxSafeDisposeCallbacks", MAX_SAFE_DISPOSE_CALLBACKS);
|
|
314
|
-
_define_property(this, Symbol.toStringTag, "Context");
|
|
315
|
-
_define_property(this, _inspect_custom, () => this.toString());
|
|
316
|
-
_class_private_field_set(this, _name, getContextName(params, callMeta));
|
|
317
|
-
_class_private_field_set(this, _parent, params.parent);
|
|
318
|
-
_class_private_field_set(this, _attributes, params.attributes ?? {});
|
|
319
|
-
_class_private_field_set(this, _onError, params.onError ?? DEFAULT_ERROR_HANDLER);
|
|
320
|
-
}
|
|
321
241
|
};
|
|
322
|
-
function get_isDisposed() {
|
|
323
|
-
return !!(_class_private_field_get(this, _flags) & CONTEXT_FLAG_IS_DISPOSED);
|
|
324
|
-
}
|
|
325
|
-
function set_isDisposed(value) {
|
|
326
|
-
_class_private_field_set(this, _flags, value ? _class_private_field_get(this, _flags) | CONTEXT_FLAG_IS_DISPOSED : _class_private_field_get(this, _flags) & ~CONTEXT_FLAG_IS_DISPOSED);
|
|
327
|
-
}
|
|
328
|
-
function get_leakDetected() {
|
|
329
|
-
return !!(_class_private_field_get(this, _flags) & CONTEXT_FLAG_LEAK_DETECTED);
|
|
330
|
-
}
|
|
331
|
-
function set_leakDetected(value) {
|
|
332
|
-
_class_private_field_set(this, _flags, value ? _class_private_field_get(this, _flags) | CONTEXT_FLAG_LEAK_DETECTED : _class_private_field_get(this, _flags) & ~CONTEXT_FLAG_LEAK_DETECTED);
|
|
333
|
-
}
|
|
334
242
|
Context = _ts_decorate([
|
|
335
243
|
safeInstanceof("Context")
|
|
336
244
|
], Context);
|
|
@@ -361,56 +269,6 @@ var cancelWithContext = (ctx, promise) => {
|
|
|
361
269
|
|
|
362
270
|
// src/resource.ts
|
|
363
271
|
import { throwUnhandledError } from "@dxos/util";
|
|
364
|
-
function _check_private_redeclaration2(obj, privateCollection) {
|
|
365
|
-
if (privateCollection.has(obj)) {
|
|
366
|
-
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
function _class_apply_descriptor_get2(receiver, descriptor) {
|
|
370
|
-
if (descriptor.get) {
|
|
371
|
-
return descriptor.get.call(receiver);
|
|
372
|
-
}
|
|
373
|
-
return descriptor.value;
|
|
374
|
-
}
|
|
375
|
-
function _class_apply_descriptor_set2(receiver, descriptor, value) {
|
|
376
|
-
if (descriptor.set) {
|
|
377
|
-
descriptor.set.call(receiver, value);
|
|
378
|
-
} else {
|
|
379
|
-
if (!descriptor.writable) {
|
|
380
|
-
throw new TypeError("attempted to set read only private field");
|
|
381
|
-
}
|
|
382
|
-
descriptor.value = value;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
function _class_extract_field_descriptor2(receiver, privateMap, action) {
|
|
386
|
-
if (!privateMap.has(receiver)) {
|
|
387
|
-
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
388
|
-
}
|
|
389
|
-
return privateMap.get(receiver);
|
|
390
|
-
}
|
|
391
|
-
function _class_private_field_get2(receiver, privateMap) {
|
|
392
|
-
var descriptor = _class_extract_field_descriptor2(receiver, privateMap, "get");
|
|
393
|
-
return _class_apply_descriptor_get2(receiver, descriptor);
|
|
394
|
-
}
|
|
395
|
-
function _class_private_field_init2(obj, privateMap, value) {
|
|
396
|
-
_check_private_redeclaration2(obj, privateMap);
|
|
397
|
-
privateMap.set(obj, value);
|
|
398
|
-
}
|
|
399
|
-
function _class_private_field_set2(receiver, privateMap, value) {
|
|
400
|
-
var descriptor = _class_extract_field_descriptor2(receiver, privateMap, "set");
|
|
401
|
-
_class_apply_descriptor_set2(receiver, descriptor, value);
|
|
402
|
-
return value;
|
|
403
|
-
}
|
|
404
|
-
function _class_private_method_get(receiver, privateSet, fn) {
|
|
405
|
-
if (!privateSet.has(receiver)) {
|
|
406
|
-
throw new TypeError("attempted to get private field on non-instance");
|
|
407
|
-
}
|
|
408
|
-
return fn;
|
|
409
|
-
}
|
|
410
|
-
function _class_private_method_init(obj, privateSet) {
|
|
411
|
-
_check_private_redeclaration2(obj, privateSet);
|
|
412
|
-
privateSet.add(obj);
|
|
413
|
-
}
|
|
414
272
|
var LifecycleState = /* @__PURE__ */ (function(LifecycleState2) {
|
|
415
273
|
LifecycleState2["CLOSED"] = "CLOSED";
|
|
416
274
|
LifecycleState2["OPEN"] = "OPEN";
|
|
@@ -418,35 +276,42 @@ var LifecycleState = /* @__PURE__ */ (function(LifecycleState2) {
|
|
|
418
276
|
return LifecycleState2;
|
|
419
277
|
})({});
|
|
420
278
|
var CLOSE_RESOURCE_ON_UNHANDLED_ERROR = false;
|
|
421
|
-
var _lifecycleState = /* @__PURE__ */ new WeakMap();
|
|
422
|
-
var _openPromise = /* @__PURE__ */ new WeakMap();
|
|
423
|
-
var _closePromise = /* @__PURE__ */ new WeakMap();
|
|
424
|
-
var _internalCtx = /* @__PURE__ */ new WeakMap();
|
|
425
|
-
var _parentCtx = /* @__PURE__ */ new WeakMap();
|
|
426
|
-
var _name2 = /* @__PURE__ */ new WeakMap();
|
|
427
|
-
var _open = /* @__PURE__ */ new WeakSet();
|
|
428
|
-
var _close = /* @__PURE__ */ new WeakSet();
|
|
429
|
-
var _createContext = /* @__PURE__ */ new WeakSet();
|
|
430
|
-
var _createParentContext = /* @__PURE__ */ new WeakSet();
|
|
431
279
|
var Resource = class {
|
|
280
|
+
#lifecycleState = "CLOSED";
|
|
281
|
+
#openPromise = null;
|
|
282
|
+
#closePromise = null;
|
|
283
|
+
/**
|
|
284
|
+
* Managed internally by the resource.
|
|
285
|
+
* Recreated on close.
|
|
286
|
+
* Errors are propagated to the `_catch` method and the parent context.
|
|
287
|
+
*/
|
|
288
|
+
#internalCtx = this.#createContext();
|
|
289
|
+
/**
|
|
290
|
+
* Context that is used to bubble up errors that are not handled by the resource.
|
|
291
|
+
* Provided in the open method.
|
|
292
|
+
*/
|
|
293
|
+
#parentCtx = this.#createParentContext();
|
|
294
|
+
get #name() {
|
|
295
|
+
return Object.getPrototypeOf(this).constructor.name;
|
|
296
|
+
}
|
|
432
297
|
get isOpen() {
|
|
433
|
-
return
|
|
298
|
+
return this.#lifecycleState === "OPEN" && this.#closePromise == null;
|
|
434
299
|
}
|
|
435
300
|
get _lifecycleState() {
|
|
436
|
-
return
|
|
301
|
+
return this.#lifecycleState;
|
|
437
302
|
}
|
|
438
303
|
get _ctx() {
|
|
439
|
-
return
|
|
304
|
+
return this.#internalCtx;
|
|
440
305
|
}
|
|
441
306
|
/**
|
|
442
307
|
* To be overridden by subclasses.
|
|
443
308
|
*/
|
|
444
|
-
async _open(
|
|
309
|
+
async _open(_ctx) {
|
|
445
310
|
}
|
|
446
311
|
/**
|
|
447
312
|
* To be overridden by subclasses.
|
|
448
313
|
*/
|
|
449
|
-
async _close(
|
|
314
|
+
async _close(_ctx) {
|
|
450
315
|
}
|
|
451
316
|
/**
|
|
452
317
|
* Error handler for errors that are caught by the context.
|
|
@@ -463,6 +328,17 @@ var Resource = class {
|
|
|
463
328
|
throw err;
|
|
464
329
|
}
|
|
465
330
|
/**
|
|
331
|
+
* Calls the provided function, opening and closing the resource.
|
|
332
|
+
*/
|
|
333
|
+
async use(fn) {
|
|
334
|
+
try {
|
|
335
|
+
await this.open();
|
|
336
|
+
return await fn(this);
|
|
337
|
+
} finally {
|
|
338
|
+
await this.close();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
466
342
|
* Opens the resource.
|
|
467
343
|
* If the resource is already open, it does nothing.
|
|
468
344
|
* If the resource is in an error state, it throws an error.
|
|
@@ -470,15 +346,15 @@ var Resource = class {
|
|
|
470
346
|
* @param ctx - Context to use for opening the resource. This context will receive errors that are not handled in `_catch`.
|
|
471
347
|
*/
|
|
472
348
|
async open(ctx) {
|
|
473
|
-
switch (
|
|
349
|
+
switch (this.#lifecycleState) {
|
|
474
350
|
case "OPEN":
|
|
475
351
|
return this;
|
|
476
352
|
case "ERROR":
|
|
477
|
-
throw new Error(`Invalid state: ${
|
|
353
|
+
throw new Error(`Invalid state: ${this.#lifecycleState}`);
|
|
478
354
|
default:
|
|
479
355
|
}
|
|
480
|
-
await
|
|
481
|
-
await
|
|
356
|
+
await this.#closePromise;
|
|
357
|
+
await (this.#openPromise ??= this.#open(ctx));
|
|
482
358
|
return this;
|
|
483
359
|
}
|
|
484
360
|
/**
|
|
@@ -486,98 +362,65 @@ var Resource = class {
|
|
|
486
362
|
* If the resource is already closed, it does nothing.
|
|
487
363
|
*/
|
|
488
364
|
async close(ctx) {
|
|
489
|
-
if (
|
|
365
|
+
if (this.#lifecycleState === "CLOSED") {
|
|
490
366
|
return this;
|
|
491
367
|
}
|
|
492
|
-
await
|
|
493
|
-
await
|
|
368
|
+
await this.#openPromise;
|
|
369
|
+
await (this.#closePromise ??= this.#close(ctx));
|
|
494
370
|
return this;
|
|
495
371
|
}
|
|
496
372
|
/**
|
|
497
373
|
* Waits until the resource is open.
|
|
498
374
|
*/
|
|
499
375
|
async waitUntilOpen() {
|
|
500
|
-
switch (
|
|
376
|
+
switch (this.#lifecycleState) {
|
|
501
377
|
case "OPEN":
|
|
502
378
|
return;
|
|
503
379
|
case "ERROR":
|
|
504
|
-
throw new Error(`Invalid state: ${
|
|
380
|
+
throw new Error(`Invalid state: ${this.#lifecycleState}`);
|
|
505
381
|
}
|
|
506
|
-
if (!
|
|
382
|
+
if (!this.#openPromise) {
|
|
507
383
|
throw new Error("Resource is not being opened");
|
|
508
384
|
}
|
|
509
|
-
await
|
|
385
|
+
await this.#openPromise;
|
|
510
386
|
}
|
|
511
387
|
async [Symbol.asyncDispose]() {
|
|
512
388
|
await this.close();
|
|
513
389
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
390
|
+
async #open(ctx) {
|
|
391
|
+
this.#closePromise = null;
|
|
392
|
+
this.#parentCtx = ctx?.derive({
|
|
393
|
+
name: this.#name
|
|
394
|
+
}) ?? this.#createParentContext();
|
|
395
|
+
await this._open(this.#parentCtx);
|
|
396
|
+
this.#lifecycleState = "OPEN";
|
|
397
|
+
}
|
|
398
|
+
async #close(ctx = Context.default()) {
|
|
399
|
+
this.#openPromise = null;
|
|
400
|
+
await this.#internalCtx.dispose();
|
|
401
|
+
await this._close(ctx);
|
|
402
|
+
this.#internalCtx = this.#createContext();
|
|
403
|
+
this.#lifecycleState = "CLOSED";
|
|
404
|
+
}
|
|
405
|
+
#createContext() {
|
|
406
|
+
return new Context({
|
|
407
|
+
name: this.#name,
|
|
408
|
+
onError: (error) => queueMicrotask(async () => {
|
|
409
|
+
try {
|
|
410
|
+
await this._catch(error);
|
|
411
|
+
} catch (err) {
|
|
412
|
+
this.#lifecycleState = "ERROR";
|
|
413
|
+
this.#parentCtx.raise(err);
|
|
414
|
+
}
|
|
415
|
+
})
|
|
538
416
|
});
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
417
|
+
}
|
|
418
|
+
#createParentContext() {
|
|
419
|
+
return new Context({
|
|
420
|
+
name: this.#name
|
|
542
421
|
});
|
|
543
422
|
}
|
|
544
423
|
};
|
|
545
|
-
function get_name() {
|
|
546
|
-
return Object.getPrototypeOf(this).constructor.name;
|
|
547
|
-
}
|
|
548
|
-
async function open(ctx) {
|
|
549
|
-
_class_private_field_set2(this, _closePromise, null);
|
|
550
|
-
_class_private_field_set2(this, _parentCtx, ctx?.derive({
|
|
551
|
-
name: _class_private_field_get2(this, _name2)
|
|
552
|
-
}) ?? _class_private_method_get(this, _createParentContext, createParentContext).call(this));
|
|
553
|
-
await this._open(_class_private_field_get2(this, _parentCtx));
|
|
554
|
-
_class_private_field_set2(this, _lifecycleState, "OPEN");
|
|
555
|
-
}
|
|
556
|
-
async function close(ctx = Context.default()) {
|
|
557
|
-
_class_private_field_set2(this, _openPromise, null);
|
|
558
|
-
await _class_private_field_get2(this, _internalCtx).dispose();
|
|
559
|
-
await this._close(ctx);
|
|
560
|
-
_class_private_field_set2(this, _internalCtx, _class_private_method_get(this, _createContext, createContext).call(this));
|
|
561
|
-
_class_private_field_set2(this, _lifecycleState, "CLOSED");
|
|
562
|
-
}
|
|
563
|
-
function createContext() {
|
|
564
|
-
return new Context({
|
|
565
|
-
name: _class_private_field_get2(this, _name2),
|
|
566
|
-
onError: (error) => queueMicrotask(async () => {
|
|
567
|
-
try {
|
|
568
|
-
await this._catch(error);
|
|
569
|
-
} catch (err) {
|
|
570
|
-
_class_private_field_set2(this, _lifecycleState, "ERROR");
|
|
571
|
-
_class_private_field_get2(this, _parentCtx).raise(err);
|
|
572
|
-
}
|
|
573
|
-
})
|
|
574
|
-
});
|
|
575
|
-
}
|
|
576
|
-
function createParentContext() {
|
|
577
|
-
return new Context({
|
|
578
|
-
name: _class_private_field_get2(this, _name2)
|
|
579
|
-
});
|
|
580
|
-
}
|
|
581
424
|
var openInContext = async (ctx, resource) => {
|
|
582
425
|
await resource.open?.(ctx);
|
|
583
426
|
ctx.onDispose(() => resource.close?.());
|