@earendil-works/chord 1.0.4 → 1.2.0
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/CHANGELOG.md +20 -0
- package/README.md +77 -194
- package/dist/cell.d.ts +101 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +316 -0
- package/dist/cell.js.map +1 -0
- package/dist/cluster.d.ts +26 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +214 -0
- package/dist/cluster.js.map +1 -0
- package/dist/connection.d.ts +157 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +757 -0
- package/dist/connection.js.map +1 -0
- package/dist/context/index.d.ts +12 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +133 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +157 -0
- package/dist/contract.js.map +1 -0
- package/dist/declare.d.ts +70 -0
- package/dist/declare.d.ts.map +1 -0
- package/dist/declare.js +22 -0
- package/dist/declare.js.map +1 -0
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +2 -2
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +41 -0
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/revision-validator.d.ts +1 -1
- package/dist/delta/revision-validator.d.ts.map +1 -1
- package/dist/delta/revision-validator.js.map +1 -1
- package/dist/delta/tracker.d.ts +1 -1
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +40 -4
- package/dist/delta/tracker.js.map +1 -1
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/host.d.ts +254 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +795 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +17 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +9 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js.map +1 -1
- package/dist/link.d.ts +72 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +169 -0
- package/dist/link.js.map +1 -0
- package/dist/loader.d.ts +4 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +68 -0
- package/dist/loader.js.map +1 -0
- package/dist/manager.d.ts +115 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +319 -0
- package/dist/manager.js.map +1 -0
- package/dist/node.d.ts +3 -4
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -2
- package/dist/node.js.map +1 -1
- package/dist/publish.d.ts +5 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +40 -0
- package/dist/publish.js.map +1 -0
- package/dist/record.d.ts +320 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +1292 -0
- package/dist/record.js.map +1 -0
- package/dist/registry.d.ts +25 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +6 -0
- package/dist/registry.js.map +1 -0
- package/dist/reload.d.ts +118 -0
- package/dist/reload.d.ts.map +1 -0
- package/dist/reload.js +589 -0
- package/dist/reload.js.map +1 -0
- package/dist/remote.d.ts +70 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +308 -0
- package/dist/remote.js.map +1 -0
- package/dist/schema.d.ts +21 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +228 -0
- package/dist/schema.js.map +1 -0
- package/dist/state.d.ts +92 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/{services/state.js → state.js} +28 -138
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +62 -262
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/websocket.d.ts +16 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +15 -0
- package/dist/websocket.js.map +1 -0
- package/dist/wire.d.ts +135 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +112 -0
- package/dist/wire.js.map +1 -0
- package/docs/guide.md +750 -0
- package/docs/spec.md +261 -0
- package/docs/tutorial.md +909 -0
- package/package.json +10 -11
- package/src/delta/README.md +5 -3
- package/dist/api.d.ts +0 -20
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -77
- package/dist/api.js.map +0 -1
- package/dist/bundler.d.ts +0 -6
- package/dist/bundler.d.ts.map +0 -1
- package/dist/bundler.js +0 -3
- package/dist/bundler.js.map +0 -1
- package/dist/facets/host.d.ts +0 -12
- package/dist/facets/host.d.ts.map +0 -1
- package/dist/facets/host.js +0 -763
- package/dist/facets/host.js.map +0 -1
- package/dist/facets/loader.d.ts +0 -3
- package/dist/facets/loader.d.ts.map +0 -1
- package/dist/facets/loader.js +0 -5
- package/dist/facets/loader.js.map +0 -1
- package/dist/node/bundle-loader.d.ts +0 -30
- package/dist/node/bundle-loader.d.ts.map +0 -1
- package/dist/node/bundle-loader.js +0 -377
- package/dist/node/bundle-loader.js.map +0 -1
- package/dist/node/bundle.d.ts +0 -26
- package/dist/node/bundle.d.ts.map +0 -1
- package/dist/node/bundle.js +0 -183
- package/dist/node/bundle.js.map +0 -1
- package/dist/node/manifest.d.ts +0 -36
- package/dist/node/manifest.d.ts.map +0 -1
- package/dist/node/manifest.js +0 -6
- package/dist/node/manifest.js.map +0 -1
- package/dist/node/package.d.ts +0 -15
- package/dist/node/package.d.ts.map +0 -1
- package/dist/node/package.js +0 -199
- package/dist/node/package.js.map +0 -1
- package/dist/services/consumer.d.ts +0 -11
- package/dist/services/consumer.d.ts.map +0 -1
- package/dist/services/consumer.js +0 -585
- package/dist/services/consumer.js.map +0 -1
- package/dist/services/errors.d.ts +0 -8
- package/dist/services/errors.d.ts.map +0 -1
- package/dist/services/errors.js +0 -22
- package/dist/services/errors.js.map +0 -1
- package/dist/services/handle.d.ts +0 -15
- package/dist/services/handle.d.ts.map +0 -1
- package/dist/services/handle.js +0 -101
- package/dist/services/handle.js.map +0 -1
- package/dist/services/instances.d.ts +0 -26
- package/dist/services/instances.d.ts.map +0 -1
- package/dist/services/instances.js +0 -140
- package/dist/services/instances.js.map +0 -1
- package/dist/services/loopback.d.ts +0 -5
- package/dist/services/loopback.d.ts.map +0 -1
- package/dist/services/loopback.js +0 -15
- package/dist/services/loopback.js.map +0 -1
- package/dist/services/provider.d.ts +0 -37
- package/dist/services/provider.d.ts.map +0 -1
- package/dist/services/provider.js +0 -521
- package/dist/services/provider.js.map +0 -1
- package/dist/services/state-codec.d.ts +0 -15
- package/dist/services/state-codec.d.ts.map +0 -1
- package/dist/services/state-codec.js +0 -133
- package/dist/services/state-codec.js.map +0 -1
- package/dist/services/state-internals.d.ts +0 -13
- package/dist/services/state-internals.d.ts.map +0 -1
- package/dist/services/state-internals.js +0 -10
- package/dist/services/state-internals.js.map +0 -1
- package/dist/services/state.d.ts +0 -28
- package/dist/services/state.d.ts.map +0 -1
- package/dist/services/state.js.map +0 -1
- package/dist/services/wire.d.ts +0 -63
- package/dist/services/wire.d.ts.map +0 -1
- package/dist/services/wire.js +0 -186
- package/dist/services/wire.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@earendil-works/chord",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Typed host runtime for plugins, contracts, replicated state, and RPC over JSON links",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -21,11 +21,6 @@
|
|
|
21
21
|
"types": "./dist/delta/index.d.ts",
|
|
22
22
|
"import": "./dist/delta/index.js"
|
|
23
23
|
},
|
|
24
|
-
"./bundler": {
|
|
25
|
-
"source": "./src/bundler.ts",
|
|
26
|
-
"types": "./dist/bundler.d.ts",
|
|
27
|
-
"import": "./dist/bundler.js"
|
|
28
|
-
},
|
|
29
24
|
"./node": {
|
|
30
25
|
"source": "./src/node.ts",
|
|
31
26
|
"types": "./dist/node.d.ts",
|
|
@@ -36,7 +31,9 @@
|
|
|
36
31
|
"sideEffects": false,
|
|
37
32
|
"files": [
|
|
38
33
|
"dist",
|
|
34
|
+
"docs",
|
|
39
35
|
"README.md",
|
|
36
|
+
"CHANGELOG.md",
|
|
40
37
|
"src/delta/README.md"
|
|
41
38
|
],
|
|
42
39
|
"scripts": {
|
|
@@ -49,7 +46,7 @@
|
|
|
49
46
|
"application",
|
|
50
47
|
"plugins",
|
|
51
48
|
"rpc",
|
|
52
|
-
"
|
|
49
|
+
"contracts",
|
|
53
50
|
"state"
|
|
54
51
|
],
|
|
55
52
|
"author": "Earendil Works",
|
|
@@ -63,10 +60,12 @@
|
|
|
63
60
|
"node": ">=22.19.0"
|
|
64
61
|
},
|
|
65
62
|
"dependencies": {
|
|
66
|
-
"
|
|
63
|
+
"typebox": "1.3.27"
|
|
67
64
|
},
|
|
68
65
|
"devDependencies": {
|
|
69
|
-
"
|
|
70
|
-
"
|
|
66
|
+
"@types/ws": "8.18.2",
|
|
67
|
+
"shx": "0.3.4",
|
|
68
|
+
"vitest": "4.1.11",
|
|
69
|
+
"ws": "8.21.0"
|
|
71
70
|
}
|
|
72
71
|
}
|
package/src/delta/README.md
CHANGED
|
@@ -35,7 +35,7 @@ const replica = applyImmutable(prepared.base, prepared.ops);
|
|
|
35
35
|
| `tracker.value`, `prepared.base`, retained older revisions | No. |
|
|
36
36
|
| `prepared.value`, `prepared.ops`, op tuples, paths, permutations, payloads | No. Payloads may be the same objects as parts of `prepared.value`. |
|
|
37
37
|
| `applyImmutable()` / `applyImmutableBatches()` inputs and result | No. The result shares containers with both inputs. |
|
|
38
|
-
| Values from replicated state (`value`, listener values,
|
|
38
|
+
| Values from replicated state and cells (`value`, listener values, in-process handles) | No. In-process consumers may share the provider's containers. |
|
|
39
39
|
| Mutable replica passed to `apply()` | Only through `apply()`, with batches it owns exclusively. Code that edits it between batches breaks convergence. |
|
|
40
40
|
| Batch passed to `apply()` | Consumed. `apply()` adopts payload containers into the replica. Use a detached copy for exactly one replica and never touch it again. |
|
|
41
41
|
|
|
@@ -173,7 +173,8 @@ set of the nearest safe ancestor, or `r` at the root. `apply()`, `applyImmutable
|
|
|
173
173
|
those segments with `UnsafePathError`.
|
|
174
174
|
The appliers write values as own data properties, never through a prototype setter.
|
|
175
175
|
Appliers check op shape and path safety but not payload strictness. Chord's
|
|
176
|
-
|
|
176
|
+
remote state applies batches decoded from JSON frames, so their payloads are strict
|
|
177
|
+
JSON; validate payloads of batches from any other source.
|
|
177
178
|
|
|
178
179
|
`encoder()` interns repeated paths into `WireOp` tuples; `decoder()` validates
|
|
179
180
|
and restores `Op` tuples. Use one encoder/decoder pair per ordered state stream.
|
|
@@ -183,9 +184,10 @@ apply error, discard the decoder and replica and recover from a later `r`.
|
|
|
183
184
|
## Limits and footguns
|
|
184
185
|
|
|
185
186
|
- No freezing. Mutating any immutable value corrupts state silently.
|
|
186
|
-
-
|
|
187
|
+
- In-process sharing: local handles, cell subscribers, and `replicatedState` subscribers receive the provider's containers. A consumer mutation corrupts authority and makes remote replicas diverge.
|
|
187
188
|
- A change inside a large flat array copies that array's pointer storage for the new revision.
|
|
188
189
|
- Placement validation costs time and memory on bulk inserts. In a benchmark unshifting 100k three-field objects, it added about 19 ms and 20 MiB of transient heap.
|
|
190
|
+
- Draft reads go through proxies. In one measurement, 20,000 hot nested reads took about 9 ms through the tracker versus 0.08 ms on raw objects; compare with `node --expose-gc packages/chord/test/delta-traversal.bench.ts --quick`.
|
|
189
191
|
- External proxies as placements, argument coercion callbacks that mutate the draft, non-primitive array indices, and non-numeric comparator results are out of contract. So are sort comparators that mutate, prepare, abort, or adopt. Behavior is unspecified.
|
|
190
192
|
- Object identity is not replicated. Each path is an independent value placement.
|
|
191
193
|
- One tracker is one revision sequence. Delivery order and persistence belong to the surrounding protocol.
|
package/dist/api.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { AttachedReplicatedState, Facet, FacetHost, FacetLoader, FacetOptions, MutableReplicatedState, RemoteServiceBinding, RemoteServiceBindingOptions, RemoteServiceContract, ReplicatedStateSource, ReplicatedStateSourceOptions, Service } from "./types.ts";
|
|
2
|
-
/** Create an active host for one complete set of facets. */
|
|
3
|
-
export declare function createFacetHost(options: FacetOptions): Promise<FacetHost>;
|
|
4
|
-
export declare function createStaticFacetLoader(facets: readonly Facet[]): FacetLoader;
|
|
5
|
-
export declare function combineFacetLoaders(loaders: readonly FacetLoader[]): FacetLoader;
|
|
6
|
-
export declare function defineFacet(facet: Facet): Facet;
|
|
7
|
-
export declare function defineService<T>(id: string, options: {
|
|
8
|
-
readonly local: true;
|
|
9
|
-
}): Service<T>;
|
|
10
|
-
export declare function defineService<T>(id: string, ...options: [RemoteServiceContract<T>] extends [never] ? readonly [options: never] : readonly [options?: {
|
|
11
|
-
readonly local?: false;
|
|
12
|
-
}]): Service<T>;
|
|
13
|
-
export declare function createRemoteServiceBinding(options: RemoteServiceBindingOptions): RemoteServiceBinding;
|
|
14
|
-
export declare function replicatedState<T>(source: ReplicatedStateSource<T>, options?: ReplicatedStateSourceOptions): AttachedReplicatedState<T>;
|
|
15
|
-
/**
|
|
16
|
-
* Create authoritative state by taking immutable ownership of an alias-free strict-JSON root.
|
|
17
|
-
* The caller must not mutate `initial` after this call.
|
|
18
|
-
*/
|
|
19
|
-
export declare function replicatedState<T extends object>(initial: T): MutableReplicatedState<T>;
|
|
20
|
-
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACX,uBAAuB,EACvB,KAAK,EACL,SAAS,EACT,WAAW,EACX,YAAY,EAEZ,sBAAsB,EACtB,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,EAC5B,OAAO,EACP,MAAM,YAAY,CAAC;AAEpB,4DAA4D;AAC5D,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAQ/E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAO7E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CA0BhF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5F,wBAAgB,aAAa,CAAC,CAAC,EAC9B,EAAE,EAAE,MAAM,EACV,GAAG,OAAO,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACnD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,GACzB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAAC;AAQd,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,oBAAoB,CAErG;AAED,wBAAgB,eAAe,CAAC,CAAC,EAChC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAChC,OAAO,CAAC,EAAE,4BAA4B,GACpC,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAC9B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/api.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { FacetKernel } from "./facets/host.js";
|
|
2
|
-
import { disposeLoadedFacets } from "./facets/loader.js";
|
|
3
|
-
import { RemoteServiceBindingImpl } from "./services/consumer.js";
|
|
4
|
-
import { attachReplicatedStateSource, MutableReplicatedStateImpl } from "./services/state.js";
|
|
5
|
-
/** Create an active host for one complete set of facets. */
|
|
6
|
-
export async function createFacetHost(options) {
|
|
7
|
-
const kernel = new FacetKernel(options);
|
|
8
|
-
await kernel.activate();
|
|
9
|
-
return Object.freeze({
|
|
10
|
-
services: kernel.provider,
|
|
11
|
-
reload: (facets) => kernel.reload(facets),
|
|
12
|
-
dispose: () => kernel.dispose(),
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
export function createStaticFacetLoader(facets) {
|
|
16
|
-
const loadedFacets = Object.freeze([...facets]);
|
|
17
|
-
return {
|
|
18
|
-
async load() {
|
|
19
|
-
return { facets: loadedFacets, async dispose() { } };
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export function combineFacetLoaders(loaders) {
|
|
24
|
-
return {
|
|
25
|
-
async load() {
|
|
26
|
-
const loaded = [];
|
|
27
|
-
try {
|
|
28
|
-
for (const loader of loaders)
|
|
29
|
-
loaded.push(await loader.load());
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
const cleanupErrors = await disposeLoadedFacets(loaded.reverse());
|
|
33
|
-
if (cleanupErrors.length > 0) {
|
|
34
|
-
throw new AggregateError([error, ...cleanupErrors], "Facet loading and cleanup failed");
|
|
35
|
-
}
|
|
36
|
-
throw error;
|
|
37
|
-
}
|
|
38
|
-
let disposed = false;
|
|
39
|
-
return {
|
|
40
|
-
facets: Object.freeze(loaded.flatMap(({ facets }) => facets)),
|
|
41
|
-
async dispose() {
|
|
42
|
-
if (disposed)
|
|
43
|
-
return;
|
|
44
|
-
disposed = true;
|
|
45
|
-
const errors = await disposeLoadedFacets([...loaded].reverse());
|
|
46
|
-
if (errors.length === 1)
|
|
47
|
-
throw errors[0];
|
|
48
|
-
if (errors.length > 1)
|
|
49
|
-
throw new AggregateError(errors, "Failed to dispose loaded facets");
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
export function defineFacet(facet) {
|
|
56
|
-
return facet;
|
|
57
|
-
}
|
|
58
|
-
export function defineService(id, options) {
|
|
59
|
-
if (id.length === 0)
|
|
60
|
-
throw new TypeError("Service ID must not be empty");
|
|
61
|
-
// TODO: check if the reserved namespace should be part of Chord.
|
|
62
|
-
if (id.startsWith("$chord."))
|
|
63
|
-
throw new TypeError("Service IDs beginning with $chord. are reserved");
|
|
64
|
-
return Object.freeze({ id, local: options?.local ?? false });
|
|
65
|
-
}
|
|
66
|
-
export function createRemoteServiceBinding(options) {
|
|
67
|
-
return new RemoteServiceBindingImpl(options);
|
|
68
|
-
}
|
|
69
|
-
export function replicatedState(initialOrSource, options) {
|
|
70
|
-
if (isReplicatedStateSource(initialOrSource))
|
|
71
|
-
return attachReplicatedStateSource(initialOrSource, options);
|
|
72
|
-
return new MutableReplicatedStateImpl(initialOrSource);
|
|
73
|
-
}
|
|
74
|
-
function isReplicatedStateSource(value) {
|
|
75
|
-
return typeof value.attach === "function";
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { FacetKernel } from \"./facets/host.ts\";\nimport { disposeLoadedFacets } from \"./facets/loader.ts\";\nimport { RemoteServiceBindingImpl } from \"./services/consumer.ts\";\nimport { attachReplicatedStateSource, MutableReplicatedStateImpl } from \"./services/state.ts\";\nimport type {\n\tAttachedReplicatedState,\n\tFacet,\n\tFacetHost,\n\tFacetLoader,\n\tFacetOptions,\n\tLoadedFacets,\n\tMutableReplicatedState,\n\tRemoteServiceBinding,\n\tRemoteServiceBindingOptions,\n\tRemoteServiceContract,\n\tReplicatedStateSource,\n\tReplicatedStateSourceOptions,\n\tService,\n} from \"./types.ts\";\n\n/** Create an active host for one complete set of facets. */\nexport async function createFacetHost(options: FacetOptions): Promise<FacetHost> {\n\tconst kernel = new FacetKernel(options);\n\tawait kernel.activate();\n\treturn Object.freeze({\n\t\tservices: kernel.provider,\n\t\treload: (facets: readonly Facet[]) => kernel.reload(facets),\n\t\tdispose: () => kernel.dispose(),\n\t});\n}\n\nexport function createStaticFacetLoader(facets: readonly Facet[]): FacetLoader {\n\tconst loadedFacets = Object.freeze([...facets]);\n\treturn {\n\t\tasync load() {\n\t\t\treturn { facets: loadedFacets, async dispose() {} };\n\t\t},\n\t};\n}\n\nexport function combineFacetLoaders(loaders: readonly FacetLoader[]): FacetLoader {\n\treturn {\n\t\tasync load() {\n\t\t\tconst loaded: LoadedFacets[] = [];\n\t\t\ttry {\n\t\t\t\tfor (const loader of loaders) loaded.push(await loader.load());\n\t\t\t} catch (error) {\n\t\t\t\tconst cleanupErrors = await disposeLoadedFacets(loaded.reverse());\n\t\t\t\tif (cleanupErrors.length > 0) {\n\t\t\t\t\tthrow new AggregateError([error, ...cleanupErrors], \"Facet loading and cleanup failed\");\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlet disposed = false;\n\t\t\treturn {\n\t\t\t\tfacets: Object.freeze(loaded.flatMap(({ facets }) => facets)),\n\t\t\t\tasync dispose() {\n\t\t\t\t\tif (disposed) return;\n\t\t\t\t\tdisposed = true;\n\t\t\t\t\tconst errors = await disposeLoadedFacets([...loaded].reverse());\n\t\t\t\t\tif (errors.length === 1) throw errors[0];\n\t\t\t\t\tif (errors.length > 1) throw new AggregateError(errors, \"Failed to dispose loaded facets\");\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function defineFacet(facet: Facet): Facet {\n\treturn facet;\n}\n\nexport function defineService<T>(id: string, options: { readonly local: true }): Service<T>;\nexport function defineService<T>(\n\tid: string,\n\t...options: [RemoteServiceContract<T>] extends [never]\n\t\t? readonly [options: never]\n\t\t: readonly [options?: { readonly local?: false }]\n): Service<T>;\nexport function defineService(id: string, options?: { readonly local?: boolean }): Service<unknown> {\n\tif (id.length === 0) throw new TypeError(\"Service ID must not be empty\");\n\t// TODO: check if the reserved namespace should be part of Chord.\n\tif (id.startsWith(\"$chord.\")) throw new TypeError(\"Service IDs beginning with $chord. are reserved\");\n\treturn Object.freeze({ id, local: options?.local ?? false });\n}\n\nexport function createRemoteServiceBinding(options: RemoteServiceBindingOptions): RemoteServiceBinding {\n\treturn new RemoteServiceBindingImpl(options);\n}\n\nexport function replicatedState<T>(\n\tsource: ReplicatedStateSource<T>,\n\toptions?: ReplicatedStateSourceOptions,\n): AttachedReplicatedState<T>;\n/**\n * Create authoritative state by taking immutable ownership of an alias-free strict-JSON root.\n * The caller must not mutate `initial` after this call.\n */\nexport function replicatedState<T extends object>(initial: T): MutableReplicatedState<T>;\nexport function replicatedState(\n\tinitialOrSource: object | ReplicatedStateSource<unknown>,\n\toptions?: ReplicatedStateSourceOptions,\n): MutableReplicatedState<object> | AttachedReplicatedState<unknown> {\n\tif (isReplicatedStateSource(initialOrSource)) return attachReplicatedStateSource(initialOrSource, options);\n\treturn new MutableReplicatedStateImpl(initialOrSource);\n}\n\nfunction isReplicatedStateSource(value: object): value is ReplicatedStateSource<unknown> {\n\treturn typeof (value as { readonly attach?: unknown }).attach === \"function\";\n}\n"]}
|
package/dist/bundler.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type { BundleFacetsOptions, BundleFacetsResult, FacetBundlePlatform, } from "./node/bundle.ts";
|
|
2
|
-
export { bundleFacets } from "./node/bundle.ts";
|
|
3
|
-
export type { FacetBundleEntry, FacetBundleManifest } from "./node/manifest.ts";
|
|
4
|
-
export type { BundleFacetPackageOptions, BundleFacetPackageResult } from "./node/package.ts";
|
|
5
|
-
export { bundleFacetPackage } from "./node/package.ts";
|
|
6
|
-
//# sourceMappingURL=bundler.d.ts.map
|
package/dist/bundler.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/bundler.js
DELETED
package/dist/bundler.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["export type {\n\tBundleFacetsOptions,\n\tBundleFacetsResult,\n\tFacetBundlePlatform,\n} from \"./node/bundle.ts\";\nexport { bundleFacets } from \"./node/bundle.ts\";\nexport type { FacetBundleEntry, FacetBundleManifest } from \"./node/manifest.ts\";\nexport type { BundleFacetPackageOptions, BundleFacetPackageResult } from \"./node/package.ts\";\nexport { bundleFacetPackage } from \"./node/package.ts\";\n"]}
|
package/dist/facets/host.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { RemoteServiceProvider } from "../services/provider.ts";
|
|
2
|
-
import type { Facet, FacetOptions } from "../types.ts";
|
|
3
|
-
/** Private lifecycle and dependency kernel behind the atomic host entry point. */
|
|
4
|
-
export declare class FacetKernel {
|
|
5
|
-
#private;
|
|
6
|
-
constructor(options: FacetOptions);
|
|
7
|
-
get provider(): RemoteServiceProvider;
|
|
8
|
-
activate(): Promise<void>;
|
|
9
|
-
reload(facets: readonly Facet[]): Promise<void>;
|
|
10
|
-
dispose(): Promise<void>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=host.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/facets/host.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAuC,MAAM,yBAAyB,CAAC;AAErG,OAAO,KAAK,EAEX,KAAK,EAEL,YAAY,EAOZ,MAAM,aAAa,CAAC;AAgUrB,kFAAkF;AAClF,qBAAa,WAAW;;IAavB,YAAY,OAAO,EAAE,YAAY,EAQhC;IAED,IAAI,QAAQ,IAAI,qBAAqB,CAGpC;IAsBK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC9B;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFpD;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7B;CAmRD"}
|