@dxos/context 0.8.4-main.84f28bd → 0.8.4-main.937b3ca
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 +57 -32
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +57 -32
- 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 +17 -3
- package/dist/types/src/resource.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -8
- package/src/context.ts +16 -4
- package/src/resource.ts +30 -8
package/package.json
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/context",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.937b3ca",
|
|
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
|
".": {
|
|
17
|
+
"types": "./dist/types/src/index.d.ts",
|
|
13
18
|
"browser": "./dist/lib/browser/index.mjs",
|
|
14
19
|
"node": {
|
|
15
20
|
"require": "./dist/lib/node/index.cjs",
|
|
16
21
|
"default": "./dist/lib/node-esm/index.mjs"
|
|
17
|
-
}
|
|
18
|
-
"types": "./dist/types/src/index.d.ts"
|
|
22
|
+
}
|
|
19
23
|
}
|
|
20
24
|
},
|
|
21
25
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -27,10 +31,11 @@
|
|
|
27
31
|
"src"
|
|
28
32
|
],
|
|
29
33
|
"dependencies": {
|
|
30
|
-
"@
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
+
"@hazae41/symbol-dispose-polyfill": "^1.0.2",
|
|
35
|
+
"@dxos/debug": "0.8.4-main.937b3ca",
|
|
36
|
+
"@dxos/util": "0.8.4-main.937b3ca",
|
|
37
|
+
"@dxos/node-std": "0.8.4-main.937b3ca",
|
|
38
|
+
"@dxos/log": "0.8.4-main.937b3ca"
|
|
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,7 +234,7 @@ 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({
|
|
227
239
|
// TODO(dmaretskyi): Optimize to not require allocating a new closure for every context.
|
|
228
240
|
onError: async (error) => {
|
|
@@ -267,7 +279,7 @@ export class Context {
|
|
|
267
279
|
}
|
|
268
280
|
}
|
|
269
281
|
|
|
270
|
-
const getContextName = (params:
|
|
282
|
+
const getContextName = (params: CreateContextProps, callMeta?: Partial<CallMetadata>): string | undefined => {
|
|
271
283
|
if (params.name) {
|
|
272
284
|
return params.name;
|
|
273
285
|
}
|
package/src/resource.ts
CHANGED
|
@@ -6,6 +6,8 @@ import { throwUnhandledError } from '@dxos/util';
|
|
|
6
6
|
|
|
7
7
|
import { Context } from './context';
|
|
8
8
|
|
|
9
|
+
import '@hazae41/symbol-dispose-polyfill';
|
|
10
|
+
|
|
9
11
|
export enum LifecycleState {
|
|
10
12
|
CLOSED = 'CLOSED',
|
|
11
13
|
OPEN = 'OPEN',
|
|
@@ -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
|
|
|
@@ -41,6 +44,17 @@ export abstract class Resource implements Lifecycle {
|
|
|
41
44
|
*/
|
|
42
45
|
#parentCtx: Context = this.#createParentContext();
|
|
43
46
|
|
|
47
|
+
/**
|
|
48
|
+
* ```ts
|
|
49
|
+
* await using resource = new Resource();
|
|
50
|
+
* await resource.open();
|
|
51
|
+
* ```
|
|
52
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using
|
|
53
|
+
*/
|
|
54
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
55
|
+
await this.close();
|
|
56
|
+
}
|
|
57
|
+
|
|
44
58
|
get #name() {
|
|
45
59
|
return Object.getPrototypeOf(this).constructor.name;
|
|
46
60
|
}
|
|
@@ -60,12 +74,12 @@ export abstract class Resource implements Lifecycle {
|
|
|
60
74
|
/**
|
|
61
75
|
* To be overridden by subclasses.
|
|
62
76
|
*/
|
|
63
|
-
protected async _open(
|
|
77
|
+
protected async _open(_ctx: Context): Promise<void> {}
|
|
64
78
|
|
|
65
79
|
/**
|
|
66
80
|
* To be overridden by subclasses.
|
|
67
81
|
*/
|
|
68
|
-
protected async _close(
|
|
82
|
+
protected async _close(_ctx: Context): Promise<void> {}
|
|
69
83
|
|
|
70
84
|
/**
|
|
71
85
|
* Error handler for errors that are caught by the context.
|
|
@@ -82,6 +96,20 @@ export abstract class Resource implements Lifecycle {
|
|
|
82
96
|
throw err;
|
|
83
97
|
}
|
|
84
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Calls the provided function, opening and closing the resource.
|
|
101
|
+
* NOTE: Consider using `using` instead.
|
|
102
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using
|
|
103
|
+
*/
|
|
104
|
+
async use<T>(fn: (resource: this) => Promise<T>): Promise<T> {
|
|
105
|
+
try {
|
|
106
|
+
await this.open();
|
|
107
|
+
return await fn(this);
|
|
108
|
+
} finally {
|
|
109
|
+
await this.close();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
85
113
|
/**
|
|
86
114
|
* Opens the resource.
|
|
87
115
|
* If the resource is already open, it does nothing.
|
|
@@ -100,7 +128,6 @@ export abstract class Resource implements Lifecycle {
|
|
|
100
128
|
|
|
101
129
|
await this.#closePromise;
|
|
102
130
|
await (this.#openPromise ??= this.#open(ctx));
|
|
103
|
-
|
|
104
131
|
return this;
|
|
105
132
|
}
|
|
106
133
|
|
|
@@ -114,7 +141,6 @@ export abstract class Resource implements Lifecycle {
|
|
|
114
141
|
}
|
|
115
142
|
await this.#openPromise;
|
|
116
143
|
await (this.#closePromise ??= this.#close(ctx));
|
|
117
|
-
|
|
118
144
|
return this;
|
|
119
145
|
}
|
|
120
146
|
|
|
@@ -135,10 +161,6 @@ export abstract class Resource implements Lifecycle {
|
|
|
135
161
|
await this.#openPromise;
|
|
136
162
|
}
|
|
137
163
|
|
|
138
|
-
async [Symbol.asyncDispose](): Promise<void> {
|
|
139
|
-
await this.close();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
164
|
async #open(ctx?: Context): Promise<void> {
|
|
143
165
|
this.#closePromise = null;
|
|
144
166
|
this.#parentCtx = ctx?.derive({ name: this.#name }) ?? this.#createParentContext();
|