@dxos/context 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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 +20 -6
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +20 -6
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/context.d.ts +4 -3
- package/dist/types/src/context.d.ts.map +1 -1
- package/dist/types/src/resource.d.ts +1 -0
- package/dist/types/src/resource.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -6
- package/src/context.ts +17 -4
- package/src/resource.ts +6 -1
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/context",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.74a063c4e0",
|
|
4
4
|
"description": "Async utils.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
@@ -27,10 +31,11 @@
|
|
|
27
31
|
"src"
|
|
28
32
|
],
|
|
29
33
|
"dependencies": {
|
|
30
|
-
"@
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/node-std": "0.8.4-main.
|
|
33
|
-
"@dxos/
|
|
34
|
+
"@hazae41/symbol-dispose-polyfill": "^1.0.2",
|
|
35
|
+
"@dxos/debug": "0.8.4-main.74a063c4e0",
|
|
36
|
+
"@dxos/node-std": "0.8.4-main.74a063c4e0",
|
|
37
|
+
"@dxos/log": "0.8.4-main.74a063c4e0",
|
|
38
|
+
"@dxos/util": "0.8.4-main.74a063c4e0"
|
|
34
39
|
},
|
|
35
40
|
"publishConfig": {
|
|
36
41
|
"access": "public"
|
package/src/context.ts
CHANGED
|
@@ -14,7 +14,7 @@ export type ContextErrorHandler = (error: Error, ctx: Context) => void;
|
|
|
14
14
|
|
|
15
15
|
export type DisposeCallback = () => any | Promise<any>;
|
|
16
16
|
|
|
17
|
-
export type
|
|
17
|
+
export type CreateContextProps = {
|
|
18
18
|
name?: string;
|
|
19
19
|
parent?: Context;
|
|
20
20
|
attributes?: Record<string, any>;
|
|
@@ -67,9 +67,11 @@ export class Context {
|
|
|
67
67
|
#flags: ContextFlags = 0;
|
|
68
68
|
#disposePromise?: Promise<boolean> = undefined;
|
|
69
69
|
|
|
70
|
+
#signal: AbortSignal | undefined = undefined;
|
|
71
|
+
|
|
70
72
|
public maxSafeDisposeCallbacks = MAX_SAFE_DISPOSE_CALLBACKS;
|
|
71
73
|
|
|
72
|
-
constructor(params:
|
|
74
|
+
constructor(params: CreateContextProps = {}, callMeta?: Partial<CallMetadata>) {
|
|
73
75
|
this.#name = getContextName(params, callMeta);
|
|
74
76
|
this.#parent = params.parent;
|
|
75
77
|
this.#attributes = params.attributes ?? {};
|
|
@@ -100,6 +102,16 @@ export class Context {
|
|
|
100
102
|
return this.#disposeCallbacks.length;
|
|
101
103
|
}
|
|
102
104
|
|
|
105
|
+
get signal(): AbortSignal {
|
|
106
|
+
if (this.#signal) {
|
|
107
|
+
return this.#signal;
|
|
108
|
+
}
|
|
109
|
+
const controller = new AbortController();
|
|
110
|
+
this.#signal = controller.signal;
|
|
111
|
+
this.onDispose(() => controller.abort());
|
|
112
|
+
return this.#signal;
|
|
113
|
+
}
|
|
114
|
+
|
|
103
115
|
/**
|
|
104
116
|
* Schedules a callback to run when the context is disposed.
|
|
105
117
|
* May be async, in this case the disposer might choose to wait for all resource to released.
|
|
@@ -222,8 +234,9 @@ export class Context {
|
|
|
222
234
|
}
|
|
223
235
|
}
|
|
224
236
|
|
|
225
|
-
derive({ onError, attributes }:
|
|
237
|
+
derive({ onError, attributes }: CreateContextProps = {}): Context {
|
|
226
238
|
const newCtx = new Context({
|
|
239
|
+
parent: this,
|
|
227
240
|
// TODO(dmaretskyi): Optimize to not require allocating a new closure for every context.
|
|
228
241
|
onError: async (error) => {
|
|
229
242
|
if (!onError) {
|
|
@@ -267,7 +280,7 @@ export class Context {
|
|
|
267
280
|
}
|
|
268
281
|
}
|
|
269
282
|
|
|
270
|
-
const getContextName = (params:
|
|
283
|
+
const getContextName = (params: CreateContextProps, callMeta?: Partial<CallMetadata>): string | undefined => {
|
|
271
284
|
if (params.name) {
|
|
272
285
|
return params.name;
|
|
273
286
|
}
|
package/src/resource.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import '@hazae41/symbol-dispose-polyfill';
|
|
6
|
+
|
|
5
7
|
import { throwUnhandledError } from '@dxos/util';
|
|
6
8
|
|
|
7
9
|
import { Context } from './context';
|
|
@@ -25,6 +27,7 @@ const CLOSE_RESOURCE_ON_UNHANDLED_ERROR = false;
|
|
|
25
27
|
*/
|
|
26
28
|
export abstract class Resource implements Lifecycle {
|
|
27
29
|
#lifecycleState = LifecycleState.CLOSED;
|
|
30
|
+
|
|
28
31
|
#openPromise: Promise<void> | null = null;
|
|
29
32
|
#closePromise: Promise<void> | null = null;
|
|
30
33
|
|
|
@@ -161,6 +164,7 @@ export abstract class Resource implements Lifecycle {
|
|
|
161
164
|
async #open(ctx?: Context): Promise<void> {
|
|
162
165
|
this.#closePromise = null;
|
|
163
166
|
this.#parentCtx = ctx?.derive({ name: this.#name }) ?? this.#createParentContext();
|
|
167
|
+
this.#internalCtx = this.#createContext(this.#parentCtx);
|
|
164
168
|
await this._open(this.#parentCtx);
|
|
165
169
|
this.#lifecycleState = LifecycleState.OPEN;
|
|
166
170
|
}
|
|
@@ -173,9 +177,10 @@ export abstract class Resource implements Lifecycle {
|
|
|
173
177
|
this.#lifecycleState = LifecycleState.CLOSED;
|
|
174
178
|
}
|
|
175
179
|
|
|
176
|
-
#createContext(): Context {
|
|
180
|
+
#createContext(attributeParent?: Context): Context {
|
|
177
181
|
return new Context({
|
|
178
182
|
name: this.#name,
|
|
183
|
+
parent: attributeParent,
|
|
179
184
|
onError: (error) =>
|
|
180
185
|
queueMicrotask(async () => {
|
|
181
186
|
try {
|