@earendil-works/chord 1.1.0 → 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 +9 -10
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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","sourcesContent":["import { contractFromDescription, LOCAL_VARIANT } from \"./contract.ts\";\nimport { type Encoder, encoder } from \"./delta/index.ts\";\nimport { ChordError, invalid } from \"./errors.ts\";\nimport type { HostImpl } from \"./host.ts\";\nimport type { Link } from \"./link.ts\";\nimport { type CtxImpl, HandleImpl, kindOf } from \"./record.ts\";\nimport type { RemoteChannel, RemoteHandle, StateSink } from \"./remote.ts\";\nimport { assertValid } from \"./schema.ts\";\nimport type { Ctx, Principal, Readable, StateEvent } from \"./types.ts\";\nimport { type Frame, fromWireError, isFrame, type RootRef, toWireError } from \"./wire.ts\";\n\nexport interface LinkOptions {\n\t/** Milliseconds between pings (default 15000). */\n\treadonly pingInterval?: number;\n\t/** Close the link when nothing arrived for this long (default 45000). Everything held through it is released. */\n\treadonly pingTimeout?: number;\n}\n\nexport interface AcceptOptions extends LinkOptions {\n\t/** The principal of whatever connects, from the app's authenticator. Every request on the link acts as it. */\n\treadonly principal: Principal;\n\t/**\n\t * What the peer is, decided here and never by its `hello`: `client` (default; a browser: no roots, no epochs, not\n\t * a reload participant, not addressable) or `host` (a child host; needs `name`).\n\t */\n\treadonly kind?: \"host\" | \"client\";\n\t/** A child host's name: its hello must match, and it is reachable `at` this name. */\n\treadonly name?: string;\n\t/** On `invalidatePrincipal`: a new principal keeps the link, `undefined` closes it (default: close). */\n\treadonly restamp?: (principal: Principal) => Principal | undefined;\n}\n\nexport interface Peer {\n\treadonly kind: \"host\" | \"client\";\n\t/** Configured (downstream hosts) or announced by the trusted parent (upstream). */\n\treadonly name: string | undefined;\n}\n\n/** A hold the peer made on this host: served locally or relayed to another link. */\ntype Served =\n\t| { readonly kind: \"local\"; readonly handle: HandleImpl; readonly principal: Principal; readonly feeds: Set<number> }\n\t| { readonly kind: \"relay\"; readonly relay: RelayHold };\n\ntype Pending = { readonly resolve: (value: unknown) => void; readonly reject: (error: unknown) => void };\n\nconst unavailable = (message: string): ChordError => new ChordError(\"unavailable\", message);\n\n// ─── relay ───────────────────────────────────────────────────────────────────\n\n/**\n * A hold relayed from an origin link to a downstream link. It owns everything done through it: subscriptions and\n * calls queued while the route resolves, and the downstream twins once forwarded. `close` undoes all of it exactly\n * once (cancels calls downstream, drops subscriptions, releases the downstream hold, rejects waiters).\n */\nexport class RelayHold {\n\treadonly origin: Connection;\n\treadonly frame: Extract<Frame, { t: \"hold\" }>;\n\treadonly principal: Principal;\n\treadonly client: boolean;\n\t/** The origin's authorization generation when the hold arrived; a revocation bumps it. */\n\treadonly generation: number;\n\tdown: Connection | undefined;\n\tdownId = 0;\n\tclosed = false;\n\treadonly calls = new Map<number, RelayCall>();\n\treadonly subs = new Map<number, { readonly member: string; downId: number | undefined }>();\n\treadonly #waiters = new Set<Pending>();\n\n\tconstructor(origin: Connection, frame: Extract<Frame, { t: \"hold\" }>, principal: Principal, client: boolean) {\n\t\tthis.origin = origin;\n\t\tthis.frame = frame;\n\t\tthis.principal = principal;\n\t\tthis.client = client;\n\t\tthis.generation = origin.generation;\n\t}\n\n\tget originId(): number {\n\t\treturn this.frame.id;\n\t}\n\n\t/** Still authorized as it was when it arrived. */\n\tget current(): boolean {\n\t\treturn !this.closed && this.origin.open && this.origin.generation === this.generation;\n\t}\n\n\t/** The downstream connection once the route resolved; rejects if the relay closes first. */\n\tready(): Promise<Connection> {\n\t\tif (this.closed) return Promise.reject(new ChordError(\"gone\", \"relayed hold closed\"));\n\t\tif (this.down !== undefined) return Promise.resolve(this.down);\n\t\treturn new Promise<Connection>((resolve, reject) => {\n\t\t\tthis.#waiters.add({ resolve: resolve as (value: unknown) => void, reject });\n\t\t});\n\t}\n\n\t/** Forwards the hold (and what queued meanwhile) to `down`. */\n\topen(down: Connection): void {\n\t\tif (this.closed) return;\n\t\tthis.down = down;\n\t\tthis.downId = down.nextId();\n\t\tdown.relayedHolds.set(this.downId, this);\n\t\tdown.send({\n\t\t\t...this.frame,\n\t\t\tid: this.downId,\n\t\t\tprincipal: this.principal,\n\t\t\t...(this.client ? { client: true } : {}),\n\t\t});\n\t\tfor (const [originSubId, entry] of this.subs)\n\t\t\tif (entry.downId === undefined) this.#forwardSub(originSubId, entry);\n\t\tfor (const waiter of this.#waiters) waiter.resolve(down);\n\t\tthis.#waiters.clear();\n\t}\n\n\tsubscribe(originSubId: number, member: string): void {\n\t\tconst entry = { member, downId: undefined as number | undefined };\n\t\tthis.subs.set(originSubId, entry);\n\t\tthis.origin.relaySubs.set(originSubId, this);\n\t\tif (this.down !== undefined) this.#forwardSub(originSubId, entry);\n\t}\n\n\t#forwardSub(originSubId: number, entry: { readonly member: string; downId: number | undefined }): void {\n\t\tconst down = this.down!;\n\t\tentry.downId = down.nextId();\n\t\tdown.relayedSubs.set(entry.downId, { relay: this, originSubId });\n\t\tdown.send({ t: \"sub\", id: entry.downId, hold: this.downId, member: entry.member });\n\t}\n\n\tunsubscribe(originSubId: number, forward = true): void {\n\t\tconst entry = this.subs.get(originSubId);\n\t\tif (entry === undefined) return;\n\t\tthis.subs.delete(originSubId);\n\t\tthis.origin.relaySubs.delete(originSubId);\n\t\tif (entry.downId !== undefined && this.down !== undefined) {\n\t\t\tthis.down.relayedSubs.delete(entry.downId);\n\t\t\tif (forward) this.down.send({ t: \"unsub\", id: entry.downId });\n\t\t}\n\t}\n\n\t/**\n\t * Closes the relay. `releaseDown`: the downstream hold is still there (origin released, disconnected, or was\n\t * revoked): cancel its calls and release it. `notify`: tell the origin the hold is gone.\n\t */\n\tclose(error: unknown, options: { readonly releaseDown: boolean; readonly notify: boolean }): void {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tfor (const call of [...this.calls.values()]) call.cancel(error, options.releaseDown);\n\t\tfor (const originSubId of [...this.subs.keys()]) this.unsubscribe(originSubId, options.releaseDown);\n\t\tif (this.origin.served.get(this.originId)?.kind === \"relay\") this.origin.served.delete(this.originId);\n\t\tif (this.down !== undefined) {\n\t\t\tthis.down.relayedHolds.delete(this.downId);\n\t\t\tif (options.releaseDown) this.down.send({ t: \"release\", id: this.downId });\n\t\t}\n\t\tfor (const waiter of this.#waiters) waiter.reject(error);\n\t\tthis.#waiters.clear();\n\t\tif (options.notify) this.origin.send({ t: \"gone\", id: this.originId, error: toWireError(error) });\n\t}\n}\n\n/** One relayed call: settles once, by result, cancellation or the relay closing; removes both mappings. */\nexport class RelayCall {\n\treadonly relay: RelayHold;\n\treadonly originId: number;\n\treadonly downId: number;\n\treadonly #pending: Pending;\n\t#settled = false;\n\n\tconstructor(relay: RelayHold, originId: number, downId: number, pending: Pending) {\n\t\tthis.relay = relay;\n\t\tthis.originId = originId;\n\t\tthis.downId = downId;\n\t\tthis.#pending = pending;\n\t\trelay.calls.set(originId, this);\n\t\trelay.down?.relayedCalls.set(downId, this);\n\t}\n\n\tfinish(error: unknown, value?: unknown): void {\n\t\tif (this.#settled) return;\n\t\tthis.#settled = true;\n\t\tthis.relay.calls.delete(this.originId);\n\t\tthis.relay.down?.relayedCalls.delete(this.downId);\n\t\tif (error === undefined) this.#pending.resolve(value);\n\t\telse this.#pending.reject(error);\n\t}\n\n\t/** Cancels downstream (when the downstream hold still exists) and settles with `error`. */\n\tcancel(error: unknown, forward: boolean): void {\n\t\tif (this.#settled) return;\n\t\tif (forward) this.relay.down?.send({ t: \"cancel\", id: this.downId });\n\t\tthis.finish(error);\n\t}\n}\n\n// ─── connection ──────────────────────────────────────────────────────────────\n\n/** One end of a link on a host: consumer of remote handles, provider for the peer's holds, and relay. */\nexport class Connection implements RemoteChannel {\n\treadonly host: HostImpl;\n\treadonly link: Link;\n\t/** `upstream`: the link to this host's parent. `downstream`: a link this host accepted. */\n\treadonly role: \"upstream\" | \"downstream\";\n\treadonly peer: Peer;\n\tprincipal: Principal;\n\treadonly restamp: ((principal: Principal) => Principal | undefined) | undefined;\n\t/** Bumped when the stamped principal is revoked or re-stamped: relays from before are refused. */\n\tgeneration = 0;\n\t/** The epoch a downstream host peer runs (from its hello, then from commits). */\n\tpeerEpoch: number | undefined;\n\t/** A downstream host peer is usable once it runs this host's current epoch (see `HostImpl.peerHello`). */\n\tsynced: boolean;\n\t/** Epochs this child announced while behind this host (fenced): this host never ran them. */\n\treadonly fencedEpochs = new Set<number>();\n\t/** Roots of fenced epochs, by the epoch of this host they were admitted in. */\n\treadonly #admitted = new Map<string, number>();\n\t#parentName: string | undefined;\n\treadonly #syncWaiters = new Set<Pending>();\n\t#nextId = 1;\n\t#lastSeen = Date.now();\n\t#pinger: ReturnType<typeof setInterval> | undefined;\n\t// consumer side: what this host asked of the peer\n\treadonly remotes = new Map<number, RemoteHandle>();\n\treadonly calls = new Map<number, Pending>();\n\treadonly subs = new Map<number, (frame: StateSink) => void>();\n\t// provider side: what the peer asked of this host\n\treadonly served = new Map<number, Served>();\n\treadonly incoming = new Map<number, AbortController>();\n\treadonly feeds = new Map<number, () => void>();\n\t/** Origin side of relays: the peer's sub ids that are relayed. */\n\treadonly relaySubs = new Map<number, RelayHold>();\n\t// downstream side of relays: ids this host used on this link\n\treadonly relayedHolds = new Map<number, RelayHold>();\n\treadonly relayedCalls = new Map<number, RelayCall>();\n\treadonly relayedSubs = new Map<number, { readonly relay: RelayHold; readonly originSubId: number }>();\n\t/** Reload votes awaited from this (child) peer. */\n\treadonly votes = new Map<number, Pending>();\n\n\tconstructor(\n\t\thost: HostImpl,\n\t\tlink: Link,\n\t\tconfig: {\n\t\t\treadonly role: \"upstream\" | \"downstream\";\n\t\t\treadonly principal: Principal;\n\t\t\treadonly peer: Peer;\n\t\t\treadonly restamp?: (principal: Principal) => Principal | undefined;\n\t\t} & LinkOptions,\n\t) {\n\t\tthis.host = host;\n\t\tthis.link = link;\n\t\tthis.role = config.role;\n\t\tthis.peer = config.peer;\n\t\tthis.principal = config.principal;\n\t\tthis.restamp = config.restamp;\n\t\tthis.synced = !(this.role === \"downstream\" && this.peer.kind === \"host\");\n\t\tlink.onClose((reason) => this.#closed(reason));\n\t\tlink.receive((frame) => this.#receive(frame));\n\t\tthis.send({ t: \"hello\", name: host.name, kind: host.kind, epoch: host.current.id });\n\t\tconst interval = config.pingInterval ?? 15_000;\n\t\tconst timeout = config.pingTimeout ?? 45_000;\n\t\tlet n = 0;\n\t\tthis.#pinger = setInterval(() => {\n\t\t\tif (Date.now() - this.#lastSeen > timeout) link.close(\"ping timeout\");\n\t\t\telse this.send({ t: \"ping\", n: ++n });\n\t\t}, interval);\n\t\tthis.#pinger.unref?.();\n\t}\n\n\tget open(): boolean {\n\t\treturn !this.link.closed;\n\t}\n\n\t/** The peer's name: configured for downstream hosts, announced by the parent upstream. */\n\tget name(): string | undefined {\n\t\treturn this.role === \"upstream\" ? this.#parentName : this.peer.name;\n\t}\n\n\tsend(frame: Frame): void {\n\t\tthis.link.send(frame);\n\t}\n\n\tnextId(): number {\n\t\treturn this.#nextId++;\n\t}\n\n\t/** Resolves once the peer is usable (a host peer runs this host's epoch); rejects if the link closes first. */\n\twhenSynced(): Promise<void> {\n\t\tif (!this.open) return Promise.reject(unavailable(`link to ${this.name ?? \"peer\"} closed`));\n\t\tif (this.synced) return Promise.resolve();\n\t\treturn new Promise<void>((resolve, reject) => this.#syncWaiters.add({ resolve: resolve as () => void, reject }));\n\t}\n\n\tmarkSynced(epoch: number): void {\n\t\tthis.peerEpoch = epoch;\n\t\tthis.synced = true;\n\t\tfor (const waiter of this.#syncWaiters) waiter.resolve(undefined);\n\t\tthis.#syncWaiters.clear();\n\t}\n\n\t/** Revokes the stamped principal: relays made under it close at once (also those still resolving a route). */\n\trevoke(next: Principal | undefined): void {\n\t\tthis.generation++;\n\t\tconst error = new ChordError(\"gone\", \"principal invalidated\");\n\t\tfor (const served of [...this.served.values()]) {\n\t\t\tif (served.kind === \"relay\") served.relay.close(error, { releaseDown: true, notify: true });\n\t\t}\n\t\tif (next === undefined) this.link.close(\"principal invalidated\");\n\t\telse this.principal = next;\n\t}\n\n\t/** A protocol violation: the peer cannot be trusted with anything on this link any more. */\n\t#violation(reason: string): void {\n\t\tthis.host.report(new ChordError(\"invalid\", `link to ${this.name ?? \"peer\"}: ${reason}`, { reason: \"protocol\" }));\n\t\tthis.link.close(`protocol error: ${reason}`);\n\t}\n\n\t// ─── consumer side (RemoteChannel) ───\n\n\thold(handle: RemoteHandle): number {\n\t\tconst id = this.nextId();\n\t\tthis.remotes.set(id, handle);\n\t\thandle.bound(this, id);\n\t\tconst principal = handle.principal;\n\t\tthis.send({\n\t\t\tt: \"hold\",\n\t\t\tid,\n\t\t\tat: handle.at,\n\t\t\ttoken: handle.contract.description,\n\t\t\tinput: handle.input,\n\t\t\t...(principal === undefined ? {} : { principal }),\n\t\t\t...(handle.owner === \"client\" ? { client: true } : {}),\n\t\t});\n\t\treturn id;\n\t}\n\n\trelease(id: number): void {\n\t\tthis.remotes.delete(id);\n\t\tthis.send({ t: \"release\", id });\n\t}\n\n\tcall(hold: number, member: string, args: unknown, root: RootRef | undefined, signal: AbortSignal): Promise<unknown> {\n\t\tconst id = this.nextId();\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(new ChordError(\"aborted\", \"call aborted\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tthis.calls.delete(id);\n\t\t\t\tthis.send({ t: \"cancel\", id });\n\t\t\t\treject(new ChordError(\"aborted\", \"call aborted\", { cause: signal.reason }));\n\t\t\t};\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tconst done = (): void => signal.removeEventListener(\"abort\", onAbort);\n\t\t\tthis.calls.set(id, {\n\t\t\t\tresolve: (value) => {\n\t\t\t\t\tdone();\n\t\t\t\t\tresolve(value);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tdone();\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\t\t\t// Clients never carry roots or epochs: the server starts roots for them.\n\t\t\tconst carried = root !== undefined && this.host.kind === \"host\";\n\t\t\tif (carried) this.host.rootSent(root.rootId, this);\n\t\t\tthis.send({ t: \"call\", id, hold, member, args, ...(carried ? { root } : {}) });\n\t\t});\n\t}\n\n\tsub(hold: number, member: string, sink: (frame: StateSink) => void): number {\n\t\tconst id = this.nextId();\n\t\tthis.subs.set(id, sink);\n\t\tthis.send({ t: \"sub\", id, hold, member });\n\t\treturn id;\n\t}\n\n\tunsub(id: number): void {\n\t\tif (this.subs.delete(id)) this.send({ t: \"unsub\", id });\n\t}\n\n\t// ─── receiving ───\n\n\t#receive(frame: unknown): void {\n\t\tthis.#lastSeen = Date.now();\n\t\tif (!isFrame(frame)) {\n\t\t\tthis.#violation(\"malformed frame\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.#dispatch(frame);\n\t\t} catch (error) {\n\t\t\tthis.host.report(error);\n\t\t}\n\t}\n\n\t#dispatch(frame: Frame): void {\n\t\tswitch (frame.t) {\n\t\t\tcase \"hello\":\n\t\t\t\tthis.#onHello(frame);\n\t\t\t\treturn;\n\t\t\tcase \"ping\":\n\t\t\t\tthis.send({ t: \"pong\", n: frame.n });\n\t\t\t\treturn;\n\t\t\tcase \"pong\":\n\t\t\tcase \"bye\":\n\t\t\t\treturn;\n\t\t\tcase \"hold\":\n\t\t\t\tthis.#onHold(frame);\n\t\t\t\treturn;\n\t\t\tcase \"release\":\n\t\t\t\tthis.#dropServed(frame.id, true);\n\t\t\t\treturn;\n\t\t\tcase \"call\":\n\t\t\t\tthis.#onCall(frame);\n\t\t\t\treturn;\n\t\t\tcase \"cancel\":\n\t\t\t\tthis.incoming.get(frame.id)?.abort(new ChordError(\"aborted\", \"cancelled by caller\"));\n\t\t\t\treturn;\n\t\t\tcase \"sub\":\n\t\t\t\tthis.#onSub(frame);\n\t\t\t\treturn;\n\t\t\tcase \"unsub\":\n\t\t\t\tthis.#onUnsub(frame.id);\n\t\t\t\treturn;\n\t\t\tcase \"shape\":\n\t\t\tcase \"gone\":\n\t\t\t\tthis.#onHoldReply(frame);\n\t\t\t\treturn;\n\t\t\tcase \"result\":\n\t\t\t\tthis.#onResult(frame);\n\t\t\t\treturn;\n\t\t\tcase \"state\":\n\t\t\t\tthis.#onState(frame);\n\t\t\t\treturn;\n\t\t\tcase \"root_end\":\n\t\t\t\t// Honored only from the link the root came over (see HostImpl.foreignRootEnded).\n\t\t\t\tthis.#admitted.delete(frame.rootId);\n\t\t\t\tthis.host.foreignRootEnded(frame.rootId, this);\n\t\t\t\treturn;\n\t\t\tcase \"invalidate\":\n\t\t\tcase \"prepare\":\n\t\t\tcase \"commit\":\n\t\t\tcase \"abort\":\n\t\t\tcase \"retire\":\n\t\t\t\t// Control frames only from the parent.\n\t\t\t\tif (this.role !== \"upstream\") {\n\t\t\t\t\tthis.#violation(`${frame.t} from a child`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (frame.t === \"invalidate\") {\n\t\t\t\t\tthis.host.invalidatePrincipal(frame.pattern).catch((error: unknown) => this.host.report(error));\n\t\t\t\t} else if (frame.t === \"retire\") this.host.allowRetire(frame.epoch);\n\t\t\t\telse this.host.onReloadFrame(this, frame);\n\t\t\t\treturn;\n\t\t\tcase \"vote\": {\n\t\t\t\tif (this.role !== \"downstream\" || this.peer.kind !== \"host\") {\n\t\t\t\t\tthis.#violation(\"vote from a non-participant\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst vote = this.votes.get(frame.reload);\n\t\t\t\tthis.votes.delete(frame.reload);\n\t\t\t\tif (frame.error === undefined) vote?.resolve(frame.report);\n\t\t\t\telse vote?.reject(fromWireError(frame.error));\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The peer's hello must agree with what this side decided about it. A downstream host announces its epoch: the\n\t * host either finds it in step or fences and reconciles it (never renumbers).\n\t */\n\t#onHello(frame: Extract<Frame, { t: \"hello\" }>): void {\n\t\tif (this.role === \"upstream\") {\n\t\t\tif (frame.kind !== \"host\") {\n\t\t\t\tthis.#violation(\"parent is not a host\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#parentName ??= frame.name;\n\t\t\treturn;\n\t\t}\n\t\tif (frame.kind !== this.peer.kind || (this.peer.name !== undefined && frame.name !== this.peer.name)) {\n\t\t\tthis.#violation(\n\t\t\t\t`hello ${frame.kind} ${frame.name} does not match the accepted ${this.peer.kind} ${this.peer.name ?? \"\"}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (this.peer.kind === \"host\") this.host.peerHello(this, frame.epoch);\n\t}\n\n\t/**\n\t * Principal stamping: a downstream link acts as the principal it was accepted with, whatever the frame says. Only\n\t * the parent may forward a principal (relayed requests); its own requests act as `{ host: parentName }`.\n\t */\n\t#principalOf(frame: { readonly principal?: Principal }): Principal {\n\t\tif (this.role === \"downstream\") return this.principal;\n\t\treturn frame.principal ?? { host: this.#parentName ?? \"parent\" };\n\t}\n\n\t#isClient(frame: { readonly client?: boolean }): boolean {\n\t\treturn this.role === \"downstream\" ? this.peer.kind === \"client\" : frame.client === true;\n\t}\n\n\t#onHold(frame: Extract<Frame, { t: \"hold\" }>): void {\n\t\tif (this.served.has(frame.id)) {\n\t\t\tthis.#violation(`duplicate hold id ${frame.id}`);\n\t\t\treturn;\n\t\t}\n\t\tconst principal = this.#principalOf(frame);\n\t\tconst client = this.#isClient(frame);\n\t\tif (frame.at !== this.host.name) {\n\t\t\tif (this.role === \"upstream\") {\n\t\t\t\tthis.send({ t: \"gone\", id: frame.id, error: toWireError(unavailable(`${this.host.name} does not relay`)) });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst relay = new RelayHold(this, frame, principal, client);\n\t\t\tthis.served.set(frame.id, { kind: \"relay\", relay });\n\t\t\tthis.host.relay(relay).catch((error: unknown) => relay.close(error, { releaseDown: true, notify: true }));\n\t\t\treturn;\n\t\t}\n\t\tlet handle: HandleImpl;\n\t\ttry {\n\t\t\tconst token = contractFromDescription(frame.token);\n\t\t\tif (token.scope !== \"remote\") throw invalid(\"token\", `${token.name} is local; only remote types cross links`);\n\t\t\tconst acquired = this.host.acquire(token, frame.input, { principal }, client ? \"client\" : \"connection\");\n\t\t\tif (!(acquired instanceof HandleImpl)) throw unavailable(\"not a local handle\");\n\t\t\thandle = acquired;\n\t\t} catch (error) {\n\t\t\tthis.send({ t: \"gone\", id: frame.id, error: toWireError(client ? clientError(error) : error) });\n\t\t\treturn;\n\t\t}\n\t\tconst served: Served = { kind: \"local\", handle, principal, feeds: new Set() };\n\t\tthis.served.set(frame.id, served);\n\t\tconst shape = (): void => {\n\t\t\tconst current = handle.shape;\n\t\t\tif (current === undefined || this.served.get(frame.id) !== served) return;\n\t\t\tthis.send({\n\t\t\t\tt: \"shape\",\n\t\t\t\tid: frame.id,\n\t\t\t\tkind: current.kind,\n\t\t\t\tmembers: current.members,\n\t\t\t\tcontract: current.contract,\n\t\t\t\tepoch: current.epoch,\n\t\t\t});\n\t\t};\n\t\thandle.onShape(shape);\n\t\thandle.goneListeners.add((error) => {\n\t\t\tif (this.served.get(frame.id) !== served) return;\n\t\t\tthis.#dropServed(frame.id, false);\n\t\t\tthis.send({ t: \"gone\", id: frame.id, error: toWireError(error) });\n\t\t});\n\t\tif (handle.status === \"live\") shape();\n\t}\n\n\t/** Forgets a served hold: unsubscribes its feeds and releases it (locally or downstream). */\n\t#dropServed(id: number, release: boolean): void {\n\t\tconst served = this.served.get(id);\n\t\tif (served === undefined) return;\n\t\tthis.served.delete(id);\n\t\tif (served.kind === \"relay\") {\n\t\t\tserved.relay.close(new ChordError(\"released\", \"relayed hold released\"), {\n\t\t\t\treleaseDown: release,\n\t\t\t\tnotify: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tfor (const feed of served.feeds) this.#onUnsub(feed);\n\t\tif (release) served.handle.release();\n\t}\n\n\t#onCall(frame: Extract<Frame, { t: \"call\" }>): void {\n\t\tif (this.incoming.has(frame.id)) {\n\t\t\tthis.#violation(`duplicate call id ${frame.id}`);\n\t\t\treturn;\n\t\t}\n\t\tconst served = this.served.get(frame.hold);\n\t\tif (served === undefined) {\n\t\t\tthis.send({ t: \"result\", id: frame.id, error: toWireError(new ChordError(\"gone\", \"unknown hold\")) });\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tthis.incoming.set(frame.id, controller);\n\t\t// Roots are honored from hosts only; a request without one (or from a client) starts one here.\n\t\tconst root = this.peer.kind === \"host\" ? this.#admitRoot(frame.root) : undefined;\n\t\tconst principal = served.kind === \"local\" ? served.principal : served.relay.principal;\n\t\tconst options = { principal, signal: controller.signal };\n\t\tconst run =\n\t\t\tserved.kind === \"local\"\n\t\t\t\t? (ctx: Ctx) => served.handle.record.call(served.handle, frame.member, frame.args, ctx as CtxImpl)\n\t\t\t\t: (ctx: Ctx) =>\n\t\t\t\t\t\trelayCall(\n\t\t\t\t\t\t\tserved.relay,\n\t\t\t\t\t\t\tframe,\n\t\t\t\t\t\t\t{ rootId: ctx.rootId, epoch: ctx.epoch },\n\t\t\t\t\t\t\tcontroller.signal,\n\t\t\t\t\t\t\tthis.host,\n\t\t\t\t\t\t);\n\t\tconst result =\n\t\t\troot === undefined\n\t\t\t\t? this.host.root(run, options)\n\t\t\t\t: this.host.joinRoot(root.rootId, root.epoch, run, { ...options, from: this });\n\t\tresult\n\t\t\t.then(\n\t\t\t\t(value) => this.send({ t: \"result\", id: frame.id, value }),\n\t\t\t\t(error: unknown) => this.send({ t: \"result\", id: frame.id, error: toWireError(error) }),\n\t\t\t)\n\t\t\t.finally(() => this.incoming.delete(frame.id));\n\t}\n\n\t/**\n\t * A child that connected behind this host runs roots of an epoch this host never had (it was fenced and is being,\n\t * or was, reconciled). Such a root is admitted in this host's current epoch at its first call here, and keeps that\n\t * epoch for its later calls (`superseded` once this host retired it). Other unknown epochs stay `superseded`.\n\t */\n\t#admitRoot(root: RootRef | undefined): RootRef | undefined {\n\t\tif (root === undefined || this.role !== \"downstream\" || !this.fencedEpochs.has(root.epoch)) return root;\n\t\tif (this.host.hasEpoch(root.epoch)) return root;\n\t\tlet epoch = this.#admitted.get(root.rootId);\n\t\tif (epoch === undefined) {\n\t\t\tepoch = this.host.current.id;\n\t\t\tthis.#admitted.set(root.rootId, epoch);\n\t\t}\n\t\treturn { rootId: root.rootId, epoch };\n\t}\n\n\t#onSub(frame: Extract<Frame, { t: \"sub\" }>): void {\n\t\tif (this.feeds.has(frame.id) || this.relaySubs.has(frame.id)) {\n\t\t\tthis.#violation(`duplicate sub id ${frame.id}`);\n\t\t\treturn;\n\t\t}\n\t\tconst served = this.served.get(frame.hold);\n\t\tif (served === undefined) {\n\t\t\tthis.send({ t: \"state\", id: frame.id, error: toWireError(new ChordError(\"gone\", \"unknown hold\")) });\n\t\t\treturn;\n\t\t}\n\t\tif (served.kind === \"relay\") {\n\t\t\tserved.relay.subscribe(frame.id, frame.member);\n\t\t\treturn;\n\t\t}\n\t\tconst readable = served.handle.member(frame.member) as Readable<unknown> | undefined;\n\t\tif (readable === undefined || typeof readable.events !== \"function\") {\n\t\t\tthis.send({\n\t\t\t\tt: \"state\",\n\t\t\t\tid: frame.id,\n\t\t\t\terror: toWireError(new ChordError(\"not_in_variant\", `${frame.member} is not state`)),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tlet stream: Encoder = encoder();\n\t\tconst send = (event: StateEvent<unknown>): void => {\n\t\t\tif (event.type === \"ops\") {\n\t\t\t\tthis.send({ t: \"state\", id: frame.id, ops: stream.encode(event.ops) });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// A loading provider handle has nothing yet: the hydrated value follows as a reset.\n\t\t\tif (event.value === undefined) return;\n\t\t\t// Snapshots are validated against the effective schema once per (re)subscription; ops only in dev mode.\n\t\t\ttry {\n\t\t\t\tvalidateSnapshot(served.handle, frame.member, event.value);\n\t\t\t} catch (error) {\n\t\t\t\tthis.send({ t: \"state\", id: frame.id, error: toWireError(error) });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstream = encoder();\n\t\t\tthis.send(\n\t\t\t\tevent.type === \"snap\"\n\t\t\t\t\t? { t: \"state\", id: frame.id, snap: event.value }\n\t\t\t\t\t: { t: \"state\", id: frame.id, reset: event.value },\n\t\t\t);\n\t\t};\n\t\tconst unsubscribe = readable.events(send);\n\t\tthis.feeds.set(frame.id, unsubscribe);\n\t\tserved.feeds.add(frame.id);\n\t}\n\n\t#onUnsub(id: number): void {\n\t\tconst unsubscribe = this.feeds.get(id);\n\t\tif (unsubscribe !== undefined) {\n\t\t\tthis.feeds.delete(id);\n\t\t\tunsubscribe();\n\t\t}\n\t\tthis.relaySubs.get(id)?.unsubscribe(id);\n\t}\n\n\t#onHoldReply(frame: Extract<Frame, { t: \"shape\" | \"gone\" }>): void {\n\t\tconst relay = this.relayedHolds.get(frame.id);\n\t\tif (relay !== undefined) {\n\t\t\tif (frame.t === \"gone\") relay.close(fromWireError(frame.error), { releaseDown: false, notify: true });\n\t\t\telse if (!relay.closed) relay.origin.send({ ...frame, id: relay.originId });\n\t\t\treturn;\n\t\t}\n\t\tconst handle = this.remotes.get(frame.id);\n\t\tif (handle === undefined) return;\n\t\tif (frame.t === \"gone\") {\n\t\t\tthis.remotes.delete(frame.id);\n\t\t\thandle.gone(fromWireError(frame.error));\n\t\t\treturn;\n\t\t}\n\t\thandle.shaped({ kind: frame.kind, members: frame.members, contract: frame.contract, epoch: frame.epoch });\n\t}\n\n\t#onResult(frame: Extract<Frame, { t: \"result\" }>): void {\n\t\tconst relayed = this.relayedCalls.get(frame.id);\n\t\tif (relayed !== undefined) {\n\t\t\trelayed.finish(frame.error === undefined ? undefined : fromWireError(frame.error), frame.value);\n\t\t\treturn;\n\t\t}\n\t\tconst pending = this.calls.get(frame.id);\n\t\tthis.calls.delete(frame.id);\n\t\tif (frame.error === undefined) pending?.resolve(frame.value);\n\t\telse pending?.reject(fromWireError(frame.error));\n\t}\n\n\t#onState(frame: Extract<Frame, { t: \"state\" }>): void {\n\t\tconst relayed = this.relayedSubs.get(frame.id);\n\t\tif (relayed !== undefined) {\n\t\t\trelayed.relay.origin.send({ ...frame, id: relayed.originSubId });\n\t\t\treturn;\n\t\t}\n\t\tthis.subs.get(frame.id)?.(frame);\n\t}\n\n\t// ─── lifetime ───\n\n\t#closed(reason: string): void {\n\t\tif (this.#pinger !== undefined) clearInterval(this.#pinger);\n\t\tconst error = unavailable(`link to ${this.name ?? \"peer\"} closed: ${reason}`);\n\t\t// As origin: everything the peer held here, relayed or not, is released (downstream calls cancelled).\n\t\tfor (const id of [...this.served.keys()]) this.#dropServed(id, true);\n\t\tfor (const controller of this.incoming.values()) controller.abort(error);\n\t\tthis.incoming.clear();\n\t\tfor (const pending of this.calls.values()) pending.reject(error);\n\t\tthis.calls.clear();\n\t\tthis.subs.clear();\n\t\tfor (const vote of this.votes.values()) vote.reject(error);\n\t\tthis.votes.clear();\n\t\tfor (const waiter of this.#syncWaiters) waiter.reject(error);\n\t\tthis.#syncWaiters.clear();\n\t\t// As downstream of relays: their origins lose the hold.\n\t\tfor (const relay of [...this.relayedHolds.values()]) relay.close(error, { releaseDown: false, notify: true });\n\t\tthis.relayedHolds.clear();\n\t\tthis.relayedCalls.clear();\n\t\tthis.relayedSubs.clear();\n\t\tfor (const handle of this.remotes.values()) {\n\t\t\t// An upstream link may be replaced (reconnect); a downstream host that went away is gone.\n\t\t\tif (this.role === \"upstream\") handle.detached();\n\t\t\telse handle.gone(error);\n\t\t}\n\t\tthis.remotes.clear();\n\t\tthis.host.connectionClosed(this);\n\t}\n}\n\n/**\n * A call through a relay: waits for the route, then forwards with the root it runs in. It settles exactly once; a\n * cancel (or the origin going away) is forwarded downstream and removes both mappings.\n */\nasync function relayCall(\n\trelay: RelayHold,\n\tframe: Extract<Frame, { t: \"call\" }>,\n\troot: RootRef,\n\tsignal: AbortSignal,\n\thost: HostImpl,\n): Promise<unknown> {\n\tconst abortError = (): ChordError => new ChordError(\"aborted\", \"call cancelled\", { cause: signal.reason });\n\tif (signal.aborted) throw abortError();\n\tlet onAbort = (): void => {};\n\tconst aborted = new Promise<never>((_, reject) => {\n\t\tonAbort = () => reject(abortError());\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n\taborted.catch(() => {});\n\ttry {\n\t\tconst down = await Promise.race([relay.ready(), aborted]);\n\t\tif (relay.closed) throw new ChordError(\"gone\", \"relayed hold closed\");\n\t\treturn await new Promise<unknown>((resolve, reject) => {\n\t\t\tconst call = new RelayCall(relay, frame.id, down.nextId(), { resolve, reject });\n\t\t\tsignal.addEventListener(\"abort\", () => call.cancel(abortError(), true), { once: true });\n\t\t\thost.rootSent(root.rootId, down);\n\t\t\tdown.send({ t: \"call\", id: call.downId, hold: relay.downId, member: frame.member, args: frame.args, root });\n\t\t});\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\n/**\n * Validates a snapshot against the schema the consumer is promised: the provider's own schema for a direct binding,\n * the consumer's contract for one through an `accepts` adapter (the adapter's view is what the consumer gets).\n */\nfunction validateSnapshot(handle: HandleImpl, member: string, value: unknown): void {\n\tif (value === undefined) return;\n\tconst installed = handle.record.currentInstalled();\n\tif (installed === undefined) return;\n\tconst view = handle.currentView();\n\tconst kind = view === undefined ? kindOf(installed.behavior) : kindOf(view);\n\tconst description =\n\t\tview !== undefined && view !== installed.behavior\n\t\t\t? handle.contract.description.variants[kind ?? LOCAL_VARIANT]?.[member]\n\t\t\t: installed.service.contract.description.variants[kindOf(installed.behavior) ?? LOCAL_VARIANT]?.[member];\n\tif (description?.kind === \"state\") assertValid(\"state\", `${handle.address}.${member}`, description.schema, value);\n}\n\n/** Clients (browsers) holding an outdated contract are told to reload their code. */\nfunction clientError(error: unknown): unknown {\n\tif (error instanceof ChordError && error.code === \"contract_mismatch\") {\n\t\treturn new ChordError(\"upgrade_required\", error.message, { cause: error });\n\t}\n\treturn error;\n}\n"]}
|
package/dist/context/index.d.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
/** Typed identity for one value carried by a {@link Context}. */
|
|
2
|
+
export interface ContextKey<T> {
|
|
3
|
+
readonly token: symbol;
|
|
4
|
+
/** Type-only marker that prevents keys with different value types from being interchangeable. */
|
|
5
|
+
readonly valueType?: (value: T) => T;
|
|
6
|
+
}
|
|
7
|
+
/** Immutable invocation-scoped values passed explicitly through operations. */
|
|
8
|
+
export interface Context {
|
|
9
|
+
readonly abortSignal: AbortSignal | undefined;
|
|
10
|
+
value<T>(key: ContextKey<T>): T | undefined;
|
|
11
|
+
toString(): string;
|
|
12
|
+
}
|
|
2
13
|
export declare const BACKGROUND_CONTEXT: Context;
|
|
3
14
|
export declare const TODO_CONTEXT: Context;
|
|
4
15
|
export declare function createContextKey<T>(description: string): ContextKey<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iGAAiG;IACjG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CACrC;AAED,+EAA+E;AAC/E,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9C,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC5C,QAAQ,IAAI,MAAM,CAAC;CACnB;AAsDD,eAAO,MAAM,kBAAkB,EAAE,OAA0D,CAAC;AAC5F,eAAO,MAAM,YAAY,EAAE,OAAoD,CAAC;AAEhF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtE;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAE1F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAI9E;AAED,6GAA6G;AAC7G,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAMA;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAkBrF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"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","sourcesContent":["/** Typed identity for one value carried by a {@link Context}. */\nexport interface ContextKey<T> {\n\treadonly token: symbol;\n\t/** Type-only marker that prevents keys with different value types from being interchangeable. */\n\treadonly valueType?: (value: T) => T;\n}\n\n/** Immutable invocation-scoped values passed explicitly through operations. */\nexport interface Context {\n\treadonly abortSignal: AbortSignal | undefined;\n\tvalue<T>(key: ContextKey<T>): T | undefined;\n\ttoString(): string;\n}\n\nconst ABORT_SIGNAL_CONTEXT_KEY: ContextKey<AbortSignal | undefined> = Object.freeze({\n\ttoken: Symbol(\"chord.abortSignal\"),\n});\n\nabstract class BaseContext implements Context {\n\tabstract value<T>(key: ContextKey<T>): T | undefined;\n\tabstract toString(): string;\n\n\tget abortSignal(): AbortSignal | undefined {\n\t\treturn this.value(ABORT_SIGNAL_CONTEXT_KEY);\n\t}\n}\n\nclass EmptyContext extends BaseContext {\n\treadonly #name: string;\n\n\tconstructor(name: string) {\n\t\tsuper();\n\t\tthis.#name = name;\n\t}\n\n\tvalue<T>(_key: ContextKey<T>): T | undefined {\n\t\treturn undefined;\n\t}\n\n\ttoString(): string {\n\t\treturn this.#name;\n\t}\n}\n\nclass ContextValue<T> extends BaseContext {\n\treadonly #parent: Context;\n\treadonly #key: ContextKey<T>;\n\treadonly #value: T;\n\n\tconstructor(parent: Context, key: ContextKey<T>, value: T) {\n\t\tsuper();\n\t\tthis.#parent = parent;\n\t\tthis.#key = key;\n\t\tthis.#value = value;\n\t}\n\n\tvalue<Value>(key: ContextKey<Value>): Value | undefined {\n\t\tif (key.token === this.#key.token) return this.#value as unknown as Value;\n\t\treturn this.#parent.value(key);\n\t}\n\n\ttoString(): string {\n\t\treturn `${this.#parent}.WithValue(${this.#key.token.description ?? \"anonymous\"})`;\n\t}\n}\n\nexport const BACKGROUND_CONTEXT: Context = new EmptyContext(\"[Context BACKGROUND_CONTEXT]\");\nexport const TODO_CONTEXT: Context = new EmptyContext(\"[Context TODO_CONTEXT]\");\n\nexport function createContextKey<T>(description: string): ContextKey<T> {\n\treturn Object.freeze({ token: Symbol(description) });\n}\n\n/** Derive a context containing one additional or replaced value. */\nexport function withContextValue<T>(key: ContextKey<T>, value: T, parent: Context): Context {\n\treturn new ContextValue(parent, key, value);\n}\n\n/**\n * Derive a context cancelled by either the parent signal or the supplied signal.\n * The parent context remains unchanged.\n */\nexport function withAbortSignal(signal: AbortSignal, context: Context): Context {\n\tconst parentSignal = context.abortSignal;\n\tconst combined = parentSignal === undefined ? signal : AbortSignal.any([parentSignal, signal]);\n\treturn withContextValue(ABORT_SIGNAL_CONTEXT_KEY, combined, context);\n}\n\n/** Derive a context retaining all values except caller cancellation. Intended for mandatory cleanup only. */\nexport function withoutAbortSignal(context: Context): Context {\n\treturn withContextValue(ABORT_SIGNAL_CONTEXT_KEY, undefined, context);\n}\n\n/** Derive an independently cancellable child context. */\nexport function withCancel(context: Context): {\n\treadonly context: Context;\n\treadonly cancel: (reason?: unknown) => void;\n} {\n\tconst controller = new AbortController();\n\treturn {\n\t\tcontext: withAbortSignal(controller.signal, context),\n\t\tcancel: (reason?: unknown) => controller.abort(reason),\n\t};\n}\n\n/**\n * Observe a promise until it settles or the invocation is cancelled.\n * Cancellation rejects only this waiter; it does not cancel the underlying promise.\n */\nexport function awaitWithContext<T>(promise: Promise<T>, context: Context): Promise<T> {\n\tconst signal = context.abortSignal;\n\tif (signal === undefined) return promise;\n\tif (signal.aborted) return Promise.reject(abortError(signal));\n\treturn new Promise<T>((resolve, reject) => {\n\t\tconst onAbort = (): void => reject(abortError(signal));\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid promise.then(\n\t\t\t(value) => {\n\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\t\tresolve(value);\n\t\t\t},\n\t\t\t(error: unknown) => {\n\t\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(error);\n\t\t\t},\n\t\t);\n\t});\n}\n\nfunction abortError(signal: AbortSignal): Error {\n\tconst reason: unknown = signal.reason;\n\treturn reason instanceof Error ? reason : new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { Static, TSchema } from "typebox";
|
|
2
|
+
import type { Ctx, Exposed, HandleBase, Readable, StateSource } from "./types.ts";
|
|
3
|
+
declare const MEMBER: unique symbol;
|
|
4
|
+
export interface MethodSpec<A extends TSchema = TSchema, R extends TSchema = TSchema> {
|
|
5
|
+
readonly [MEMBER]: "method";
|
|
6
|
+
readonly args: A;
|
|
7
|
+
readonly result: R;
|
|
8
|
+
}
|
|
9
|
+
export interface OpaqueSpec<T = unknown> {
|
|
10
|
+
readonly [MEMBER]: "opaque";
|
|
11
|
+
readonly id: string;
|
|
12
|
+
/** Type carrier only; never set. */
|
|
13
|
+
readonly type?: T;
|
|
14
|
+
}
|
|
15
|
+
export declare const method: <A extends TSchema, R extends TSchema>(args: A, result: R) => MethodSpec<A, R>;
|
|
16
|
+
/** A native in-process object identified by `name@version` (local contracts only). */
|
|
17
|
+
export declare const opaque: <T = unknown>(id: string) => OpaqueSpec<T>;
|
|
18
|
+
export interface VariantDef {
|
|
19
|
+
readonly state?: Readonly<Record<string, TSchema>>;
|
|
20
|
+
readonly methods?: Readonly<Record<string, MethodSpec>>;
|
|
21
|
+
}
|
|
22
|
+
export interface RemoteDef {
|
|
23
|
+
readonly version: number;
|
|
24
|
+
readonly input: TSchema;
|
|
25
|
+
readonly variants: Readonly<Record<string, VariantDef>>;
|
|
26
|
+
}
|
|
27
|
+
/** A local member: a method, an opaque native object, or a state member described by its schema. */
|
|
28
|
+
export type LocalMember = MethodSpec | OpaqueSpec | TSchema;
|
|
29
|
+
export interface LocalDef {
|
|
30
|
+
readonly version: number;
|
|
31
|
+
readonly input: TSchema;
|
|
32
|
+
readonly members?: Readonly<Record<string, LocalMember>>;
|
|
33
|
+
}
|
|
34
|
+
export type MemberDescription = {
|
|
35
|
+
readonly kind: "method";
|
|
36
|
+
readonly args: TSchema;
|
|
37
|
+
readonly result: TSchema;
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "state";
|
|
40
|
+
readonly schema: TSchema;
|
|
41
|
+
} | {
|
|
42
|
+
readonly kind: "opaque";
|
|
43
|
+
readonly id: string;
|
|
44
|
+
};
|
|
45
|
+
/** Local contracts have one unnamed variant. */
|
|
46
|
+
export declare const LOCAL_VARIANT = "";
|
|
47
|
+
export interface Description {
|
|
48
|
+
readonly name: string;
|
|
49
|
+
readonly scope: "remote" | "local";
|
|
50
|
+
readonly version: number;
|
|
51
|
+
readonly input: TSchema;
|
|
52
|
+
readonly variants: Readonly<Record<string, Readonly<Record<string, MemberDescription>>>>;
|
|
53
|
+
}
|
|
54
|
+
interface ContractBase {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly version: number;
|
|
57
|
+
readonly input: TSchema;
|
|
58
|
+
readonly description: Description;
|
|
59
|
+
readonly fingerprint: string;
|
|
60
|
+
}
|
|
61
|
+
export interface RemoteContract<D extends RemoteDef = RemoteDef> extends ContractBase {
|
|
62
|
+
readonly scope: "remote";
|
|
63
|
+
readonly def: D;
|
|
64
|
+
}
|
|
65
|
+
export interface LocalContract<D extends LocalDef = LocalDef> extends ContractBase {
|
|
66
|
+
readonly scope: "local";
|
|
67
|
+
readonly def: D;
|
|
68
|
+
}
|
|
69
|
+
export type AnyContract = RemoteContract | LocalContract;
|
|
70
|
+
/** Names a handle uses itself; members may not use them. */
|
|
71
|
+
export declare const RESERVED_MEMBERS: ReadonlySet<string>;
|
|
72
|
+
export declare function remote<const D extends RemoteDef>(name: string, def: D): RemoteContract<D>;
|
|
73
|
+
export declare function local<const D extends LocalDef>(name: string, def: D): LocalContract<D>;
|
|
74
|
+
/**
|
|
75
|
+
* A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding
|
|
76
|
+
* and validation, never for TypeScript types.
|
|
77
|
+
*/
|
|
78
|
+
export declare function contractFromDescription(description: Description): AnyContract;
|
|
79
|
+
/** Returns why `provider` does not cover `consumer`, or undefined when it does. */
|
|
80
|
+
export declare function coverage(provider: Description, consumer: Description): string | undefined;
|
|
81
|
+
/** Maps the provider's current behavior to the view a consumer of an older contract version expects. */
|
|
82
|
+
export type Adapter = (current: Record<string, unknown>) => Record<string, unknown>;
|
|
83
|
+
export type Accepts = Readonly<Record<number, Adapter>>;
|
|
84
|
+
/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */
|
|
85
|
+
export declare function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined;
|
|
86
|
+
type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void ? I : never;
|
|
87
|
+
type Empty = Record<never, never>;
|
|
88
|
+
type StateOf<V> = V extends {
|
|
89
|
+
readonly state: infer S extends Readonly<Record<string, TSchema>>;
|
|
90
|
+
} ? S : Empty;
|
|
91
|
+
type StaticOf<S> = S extends TSchema ? Static<S> : never;
|
|
92
|
+
type MethodsOf<V> = V extends {
|
|
93
|
+
readonly methods: infer M extends Readonly<Record<string, MethodSpec>>;
|
|
94
|
+
} ? M : Empty;
|
|
95
|
+
export type Implementation<M> = M extends MethodSpec<infer A, infer R> ? (args: Static<A>, ctx: Ctx) => Static<R> | Promise<Static<R>> : never;
|
|
96
|
+
export type Call<M> = M extends MethodSpec<infer A, infer R> ? (args: Static<A>, ctx?: Ctx) => Promise<Static<R>> : never;
|
|
97
|
+
type VariantBehavior<K, V> = {
|
|
98
|
+
readonly kind: K;
|
|
99
|
+
} & {
|
|
100
|
+
readonly [S in keyof StateOf<V>]: StateSource<StaticOf<StateOf<V>[S]>>;
|
|
101
|
+
} & {
|
|
102
|
+
readonly [M in keyof MethodsOf<V>]: Implementation<MethodsOf<V>[M]>;
|
|
103
|
+
};
|
|
104
|
+
type VariantHandle<V> = {
|
|
105
|
+
readonly [S in keyof StateOf<V>]: Readable<StaticOf<StateOf<V>[S]> | undefined>;
|
|
106
|
+
} & {
|
|
107
|
+
readonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;
|
|
108
|
+
};
|
|
109
|
+
type LocalBehaviorMember<M> = M extends MethodSpec ? Implementation<M> : M extends OpaqueSpec<infer T> ? T | Exposed<T> : M extends TSchema ? StateSource<Static<M>> : never;
|
|
110
|
+
type LocalHandleMember<M> = M extends MethodSpec ? Call<M> : M extends OpaqueSpec<infer T> ? T | undefined : M extends TSchema ? Readable<Static<M> | undefined> : never;
|
|
111
|
+
type LocalMembers<D> = D extends {
|
|
112
|
+
readonly members: infer M extends Readonly<Record<string, LocalMember>>;
|
|
113
|
+
} ? M : Empty;
|
|
114
|
+
export type InputOf<C> = C extends {
|
|
115
|
+
readonly def: {
|
|
116
|
+
readonly input: infer I extends TSchema;
|
|
117
|
+
};
|
|
118
|
+
} ? Static<I> : never;
|
|
119
|
+
/** What a factory returns for contract C. */
|
|
120
|
+
export type BehaviorOf<C> = C extends RemoteContract<infer D> ? {
|
|
121
|
+
[K in keyof D["variants"]]: VariantBehavior<K, D["variants"][K]>;
|
|
122
|
+
}[keyof D["variants"]] : C extends LocalContract<infer D> ? {
|
|
123
|
+
readonly [K in keyof LocalMembers<D>]: LocalBehaviorMember<LocalMembers<D>[K]>;
|
|
124
|
+
} & Record<string, unknown> : never;
|
|
125
|
+
/** Late-bound members a handle exposes for contract C (all variants merged). */
|
|
126
|
+
export type MembersOf<C> = C extends RemoteContract<infer D> ? UnionToIntersection<{
|
|
127
|
+
[K in keyof D["variants"]]: VariantHandle<D["variants"][K]>;
|
|
128
|
+
}[keyof D["variants"]]> : C extends LocalContract<infer D> ? {
|
|
129
|
+
readonly [K in keyof LocalMembers<D>]: LocalHandleMember<LocalMembers<D>[K]>;
|
|
130
|
+
} : never;
|
|
131
|
+
export type Handle<C extends AnyContract = AnyContract> = HandleBase<C> & MembersOf<C>;
|
|
132
|
+
export {};
|
|
133
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.js
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { ChordError } from "./errors.js";
|
|
2
|
+
import { canonicalJson, fits, hash64 } from "./schema.js";
|
|
3
|
+
const MEMBER = Symbol("chord.member");
|
|
4
|
+
export const method = (args, result) => ({
|
|
5
|
+
[MEMBER]: "method",
|
|
6
|
+
args,
|
|
7
|
+
result,
|
|
8
|
+
});
|
|
9
|
+
/** A native in-process object identified by `name@version` (local contracts only). */
|
|
10
|
+
export const opaque = (id) => {
|
|
11
|
+
if (!/^[^@\s]+@\d+$/.test(id))
|
|
12
|
+
throw new TypeError(`opaque id must be name@version: ${id}`);
|
|
13
|
+
return { [MEMBER]: "opaque", id };
|
|
14
|
+
};
|
|
15
|
+
/** Local contracts have one unnamed variant. */
|
|
16
|
+
export const LOCAL_VARIANT = "";
|
|
17
|
+
/** Names a handle uses itself; members may not use them. */
|
|
18
|
+
export const RESERVED_MEMBERS = new Set([
|
|
19
|
+
"kind",
|
|
20
|
+
"status",
|
|
21
|
+
"ready",
|
|
22
|
+
"shape",
|
|
23
|
+
"error",
|
|
24
|
+
"onShape",
|
|
25
|
+
"onStatus",
|
|
26
|
+
"release",
|
|
27
|
+
"then",
|
|
28
|
+
"contract",
|
|
29
|
+
]);
|
|
30
|
+
function describeMember(name, member, scope) {
|
|
31
|
+
if (RESERVED_MEMBERS.has(name))
|
|
32
|
+
throw new TypeError(`member name is reserved: ${name}`);
|
|
33
|
+
const brand = member[MEMBER];
|
|
34
|
+
if (brand === "method") {
|
|
35
|
+
const spec = member;
|
|
36
|
+
return { kind: "method", args: spec.args, result: spec.result };
|
|
37
|
+
}
|
|
38
|
+
if (brand === "opaque") {
|
|
39
|
+
if (scope === "remote")
|
|
40
|
+
throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);
|
|
41
|
+
return { kind: "opaque", id: member.id };
|
|
42
|
+
}
|
|
43
|
+
return { kind: "state", schema: member };
|
|
44
|
+
}
|
|
45
|
+
function finish(contract) {
|
|
46
|
+
return { ...contract, fingerprint: hash64(canonicalJson(contract.description)) };
|
|
47
|
+
}
|
|
48
|
+
function checkHeader(name, version) {
|
|
49
|
+
if (!name)
|
|
50
|
+
throw new TypeError("contract name is empty");
|
|
51
|
+
if (!Number.isInteger(version) || version < 1)
|
|
52
|
+
throw new TypeError(`contract version must be a positive integer`);
|
|
53
|
+
}
|
|
54
|
+
export function remote(name, def) {
|
|
55
|
+
checkHeader(name, def.version);
|
|
56
|
+
const variants = {};
|
|
57
|
+
if (Object.keys(def.variants).length === 0)
|
|
58
|
+
throw new TypeError(`remote contract ${name} has no variants`);
|
|
59
|
+
for (const [kind, variant] of Object.entries(def.variants)) {
|
|
60
|
+
const members = {};
|
|
61
|
+
for (const [key, schema] of Object.entries(variant.state ?? {}))
|
|
62
|
+
members[key] = describeMember(key, schema, "remote");
|
|
63
|
+
for (const [key, spec] of Object.entries(variant.methods ?? {})) {
|
|
64
|
+
if (key in members)
|
|
65
|
+
throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);
|
|
66
|
+
members[key] = describeMember(key, spec, "remote");
|
|
67
|
+
if (members[key].kind !== "method")
|
|
68
|
+
throw new TypeError(`methods.${key} is not a method()`);
|
|
69
|
+
}
|
|
70
|
+
variants[kind] = members;
|
|
71
|
+
}
|
|
72
|
+
const description = { name, scope: "remote", version: def.version, input: def.input, variants };
|
|
73
|
+
return finish({
|
|
74
|
+
scope: "remote",
|
|
75
|
+
name,
|
|
76
|
+
version: def.version,
|
|
77
|
+
input: def.input,
|
|
78
|
+
def,
|
|
79
|
+
description,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export function local(name, def) {
|
|
83
|
+
checkHeader(name, def.version);
|
|
84
|
+
const members = {};
|
|
85
|
+
for (const [key, member] of Object.entries(def.members ?? {}))
|
|
86
|
+
members[key] = describeMember(key, member, "local");
|
|
87
|
+
const description = {
|
|
88
|
+
name,
|
|
89
|
+
scope: "local",
|
|
90
|
+
version: def.version,
|
|
91
|
+
input: def.input,
|
|
92
|
+
variants: { [LOCAL_VARIANT]: members },
|
|
93
|
+
};
|
|
94
|
+
return finish({ scope: "local", name, version: def.version, input: def.input, def, description });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding
|
|
98
|
+
* and validation, never for TypeScript types.
|
|
99
|
+
*/
|
|
100
|
+
export function contractFromDescription(description) {
|
|
101
|
+
const { name, scope, version, input } = description;
|
|
102
|
+
if (typeof name !== "string" || (scope !== "remote" && scope !== "local") || !Number.isInteger(version)) {
|
|
103
|
+
throw new ChordError("invalid", "malformed contract token", { reason: "token" });
|
|
104
|
+
}
|
|
105
|
+
const base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };
|
|
106
|
+
return scope === "remote"
|
|
107
|
+
? { ...base, scope, def: { version, input, variants: {} } }
|
|
108
|
+
: { ...base, scope, def: { version, input } };
|
|
109
|
+
}
|
|
110
|
+
/** Returns why `provider` does not cover `consumer`, or undefined when it does. */
|
|
111
|
+
export function coverage(provider, consumer) {
|
|
112
|
+
if (provider.name !== consumer.name || provider.scope !== consumer.scope)
|
|
113
|
+
return "different type";
|
|
114
|
+
if (!fits(consumer.input, provider.input))
|
|
115
|
+
return "input";
|
|
116
|
+
for (const [kind, consumerMembers] of Object.entries(consumer.variants)) {
|
|
117
|
+
const providerMembers = provider.variants[kind];
|
|
118
|
+
if (providerMembers === undefined)
|
|
119
|
+
return `variant ${kind} missing`;
|
|
120
|
+
for (const [name, wanted] of Object.entries(consumerMembers)) {
|
|
121
|
+
const offered = providerMembers[name];
|
|
122
|
+
if (offered === undefined || offered.kind !== wanted.kind)
|
|
123
|
+
return `${kind}.${name} missing or of another kind`;
|
|
124
|
+
if (offered.kind === "method" && wanted.kind === "method") {
|
|
125
|
+
if (!fits(wanted.args, offered.args))
|
|
126
|
+
return `${kind}.${name} arguments`;
|
|
127
|
+
if (!fits(offered.result, wanted.result))
|
|
128
|
+
return `${kind}.${name} result`;
|
|
129
|
+
}
|
|
130
|
+
else if (offered.kind === "state" && wanted.kind === "state") {
|
|
131
|
+
if (!fits(offered.schema, wanted.schema))
|
|
132
|
+
return `${kind}.${name} state`;
|
|
133
|
+
}
|
|
134
|
+
else if (offered.kind === "opaque" && wanted.kind === "opaque" && offered.id !== wanted.id) {
|
|
135
|
+
return `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */
|
|
142
|
+
export function bind(provider, accepts, consumer) {
|
|
143
|
+
if (provider.fingerprint === consumer.fingerprint)
|
|
144
|
+
return undefined;
|
|
145
|
+
if (provider.version === consumer.version) {
|
|
146
|
+
const reason = coverage(provider.description, consumer.description);
|
|
147
|
+
if (reason === undefined)
|
|
148
|
+
return undefined;
|
|
149
|
+
throw new ChordError("contract_mismatch", `${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`);
|
|
150
|
+
}
|
|
151
|
+
const adapter = accepts?.[consumer.version];
|
|
152
|
+
if (adapter === undefined) {
|
|
153
|
+
throw new ChordError("contract_mismatch", `${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`);
|
|
154
|
+
}
|
|
155
|
+
return adapter;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Static, TSchema } from \"typebox\";\nimport { ChordError } from \"./errors.ts\";\nimport { canonicalJson, fits, hash64 } from \"./schema.ts\";\nimport type { Ctx, Exposed, HandleBase, Readable, StateSource } from \"./types.ts\";\n\nconst MEMBER = Symbol(\"chord.member\");\n\nexport interface MethodSpec<A extends TSchema = TSchema, R extends TSchema = TSchema> {\n\treadonly [MEMBER]: \"method\";\n\treadonly args: A;\n\treadonly result: R;\n}\n\nexport interface OpaqueSpec<T = unknown> {\n\treadonly [MEMBER]: \"opaque\";\n\treadonly id: string;\n\t/** Type carrier only; never set. */\n\treadonly type?: T;\n}\n\nexport const method = <A extends TSchema, R extends TSchema>(args: A, result: R): MethodSpec<A, R> => ({\n\t[MEMBER]: \"method\",\n\targs,\n\tresult,\n});\n\n/** A native in-process object identified by `name@version` (local contracts only). */\nexport const opaque = <T = unknown>(id: string): OpaqueSpec<T> => {\n\tif (!/^[^@\\s]+@\\d+$/.test(id)) throw new TypeError(`opaque id must be name@version: ${id}`);\n\treturn { [MEMBER]: \"opaque\", id };\n};\n\nexport interface VariantDef {\n\treadonly state?: Readonly<Record<string, TSchema>>;\n\treadonly methods?: Readonly<Record<string, MethodSpec>>;\n}\n\nexport interface RemoteDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly variants: Readonly<Record<string, VariantDef>>;\n}\n\n/** A local member: a method, an opaque native object, or a state member described by its schema. */\nexport type LocalMember = MethodSpec | OpaqueSpec | TSchema;\n\nexport interface LocalDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly members?: Readonly<Record<string, LocalMember>>;\n}\n\nexport type MemberDescription =\n\t| { readonly kind: \"method\"; readonly args: TSchema; readonly result: TSchema }\n\t| { readonly kind: \"state\"; readonly schema: TSchema }\n\t| { readonly kind: \"opaque\"; readonly id: string };\n\n/** Local contracts have one unnamed variant. */\nexport const LOCAL_VARIANT = \"\";\n\nexport interface Description {\n\treadonly name: string;\n\treadonly scope: \"remote\" | \"local\";\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly variants: Readonly<Record<string, Readonly<Record<string, MemberDescription>>>>;\n}\n\ninterface ContractBase {\n\treadonly name: string;\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly description: Description;\n\treadonly fingerprint: string;\n}\n\nexport interface RemoteContract<D extends RemoteDef = RemoteDef> extends ContractBase {\n\treadonly scope: \"remote\";\n\treadonly def: D;\n}\n\nexport interface LocalContract<D extends LocalDef = LocalDef> extends ContractBase {\n\treadonly scope: \"local\";\n\treadonly def: D;\n}\n\nexport type AnyContract = RemoteContract | LocalContract;\n\n/** Names a handle uses itself; members may not use them. */\nexport const RESERVED_MEMBERS: ReadonlySet<string> = new Set([\n\t\"kind\",\n\t\"status\",\n\t\"ready\",\n\t\"shape\",\n\t\"error\",\n\t\"onShape\",\n\t\"onStatus\",\n\t\"release\",\n\t\"then\",\n\t\"contract\",\n]);\n\nfunction describeMember(name: string, member: unknown, scope: \"remote\" | \"local\"): MemberDescription {\n\tif (RESERVED_MEMBERS.has(name)) throw new TypeError(`member name is reserved: ${name}`);\n\tconst brand = (member as { [MEMBER]?: string })[MEMBER];\n\tif (brand === \"method\") {\n\t\tconst spec = member as MethodSpec;\n\t\treturn { kind: \"method\", args: spec.args, result: spec.result };\n\t}\n\tif (brand === \"opaque\") {\n\t\tif (scope === \"remote\") throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);\n\t\treturn { kind: \"opaque\", id: (member as OpaqueSpec).id };\n\t}\n\treturn { kind: \"state\", schema: member as TSchema };\n}\n\nfunction finish<C extends AnyContract>(contract: Omit<C, \"fingerprint\">): C {\n\treturn { ...contract, fingerprint: hash64(canonicalJson(contract.description)) } as C;\n}\n\nfunction checkHeader(name: string, version: number): void {\n\tif (!name) throw new TypeError(\"contract name is empty\");\n\tif (!Number.isInteger(version) || version < 1) throw new TypeError(`contract version must be a positive integer`);\n}\n\nexport function remote<const D extends RemoteDef>(name: string, def: D): RemoteContract<D> {\n\tcheckHeader(name, def.version);\n\tconst variants: Record<string, Record<string, MemberDescription>> = {};\n\tif (Object.keys(def.variants).length === 0) throw new TypeError(`remote contract ${name} has no variants`);\n\tfor (const [kind, variant] of Object.entries(def.variants)) {\n\t\tconst members: Record<string, MemberDescription> = {};\n\t\tfor (const [key, schema] of Object.entries(variant.state ?? {}))\n\t\t\tmembers[key] = describeMember(key, schema, \"remote\");\n\t\tfor (const [key, spec] of Object.entries(variant.methods ?? {})) {\n\t\t\tif (key in members) throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);\n\t\t\tmembers[key] = describeMember(key, spec, \"remote\");\n\t\t\tif (members[key].kind !== \"method\") throw new TypeError(`methods.${key} is not a method()`);\n\t\t}\n\t\tvariants[kind] = members;\n\t}\n\tconst description: Description = { name, scope: \"remote\", version: def.version, input: def.input, variants };\n\treturn finish<RemoteContract<D>>({\n\t\tscope: \"remote\",\n\t\tname,\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tdef,\n\t\tdescription,\n\t});\n}\n\nexport function local<const D extends LocalDef>(name: string, def: D): LocalContract<D> {\n\tcheckHeader(name, def.version);\n\tconst members: Record<string, MemberDescription> = {};\n\tfor (const [key, member] of Object.entries(def.members ?? {})) members[key] = describeMember(key, member, \"local\");\n\tconst description: Description = {\n\t\tname,\n\t\tscope: \"local\",\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tvariants: { [LOCAL_VARIANT]: members },\n\t};\n\treturn finish<LocalContract<D>>({ scope: \"local\", name, version: def.version, input: def.input, def, description });\n}\n\n/**\n * A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding\n * and validation, never for TypeScript types.\n */\nexport function contractFromDescription(description: Description): AnyContract {\n\tconst { name, scope, version, input } = description;\n\tif (typeof name !== \"string\" || (scope !== \"remote\" && scope !== \"local\") || !Number.isInteger(version)) {\n\t\tthrow new ChordError(\"invalid\", \"malformed contract token\", { reason: \"token\" });\n\t}\n\tconst base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };\n\treturn scope === \"remote\"\n\t\t? { ...base, scope, def: { version, input, variants: {} } }\n\t\t: { ...base, scope, def: { version, input } };\n}\n\n/** Returns why `provider` does not cover `consumer`, or undefined when it does. */\nexport function coverage(provider: Description, consumer: Description): string | undefined {\n\tif (provider.name !== consumer.name || provider.scope !== consumer.scope) return \"different type\";\n\tif (!fits(consumer.input, provider.input)) return \"input\";\n\tfor (const [kind, consumerMembers] of Object.entries(consumer.variants)) {\n\t\tconst providerMembers = provider.variants[kind];\n\t\tif (providerMembers === undefined) return `variant ${kind} missing`;\n\t\tfor (const [name, wanted] of Object.entries(consumerMembers)) {\n\t\t\tconst offered = providerMembers[name];\n\t\t\tif (offered === undefined || offered.kind !== wanted.kind) return `${kind}.${name} missing or of another kind`;\n\t\t\tif (offered.kind === \"method\" && wanted.kind === \"method\") {\n\t\t\t\tif (!fits(wanted.args, offered.args)) return `${kind}.${name} arguments`;\n\t\t\t\tif (!fits(offered.result, wanted.result)) return `${kind}.${name} result`;\n\t\t\t} else if (offered.kind === \"state\" && wanted.kind === \"state\") {\n\t\t\t\tif (!fits(offered.schema, wanted.schema)) return `${kind}.${name} state`;\n\t\t\t} else if (offered.kind === \"opaque\" && wanted.kind === \"opaque\" && offered.id !== wanted.id) {\n\t\t\t\treturn `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Maps the provider's current behavior to the view a consumer of an older contract version expects. */\nexport type Adapter = (current: Record<string, unknown>) => Record<string, unknown>;\nexport type Accepts = Readonly<Record<number, Adapter>>;\n\n/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */\nexport function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined {\n\tif (provider.fingerprint === consumer.fingerprint) return undefined;\n\tif (provider.version === consumer.version) {\n\t\tconst reason = coverage(provider.description, consumer.description);\n\t\tif (reason === undefined) return undefined;\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`,\n\t\t);\n\t}\n\tconst adapter = accepts?.[consumer.version];\n\tif (adapter === undefined) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`,\n\t\t);\n\t}\n\treturn adapter;\n}\n\n// ─── Static types ────────────────────────────────────────────────────────────\n\ntype UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (value: infer I) => void\n\t? I\n\t: never;\ntype Empty = Record<never, never>;\ntype StateOf<V> = V extends { readonly state: infer S extends Readonly<Record<string, TSchema>> } ? S : Empty;\ntype StaticOf<S> = S extends TSchema ? Static<S> : never;\ntype MethodsOf<V> = V extends { readonly methods: infer M extends Readonly<Record<string, MethodSpec>> } ? M : Empty;\n\nexport type Implementation<M> = M extends MethodSpec<infer A, infer R>\n\t? (args: Static<A>, ctx: Ctx) => Static<R> | Promise<Static<R>>\n\t: never;\nexport type Call<M> = M extends MethodSpec<infer A, infer R>\n\t? (args: Static<A>, ctx?: Ctx) => Promise<Static<R>>\n\t: never;\n\ntype VariantBehavior<K, V> = { readonly kind: K } & {\n\treadonly [S in keyof StateOf<V>]: StateSource<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: Implementation<MethodsOf<V>[M]>;\n};\ntype VariantHandle<V> = { readonly [S in keyof StateOf<V>]: Readable<StaticOf<StateOf<V>[S]> | undefined> } & {\n\treadonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;\n};\n\ntype LocalBehaviorMember<M> = M extends MethodSpec\n\t? Implementation<M>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | Exposed<T>\n\t\t: M extends TSchema\n\t\t\t? StateSource<Static<M>>\n\t\t\t: never;\ntype LocalHandleMember<M> = M extends MethodSpec\n\t? Call<M>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | undefined\n\t\t: M extends TSchema\n\t\t\t? Readable<Static<M> | undefined>\n\t\t\t: never;\ntype LocalMembers<D> = D extends { readonly members: infer M extends Readonly<Record<string, LocalMember>> }\n\t? M\n\t: Empty;\n\nexport type InputOf<C> = C extends { readonly def: { readonly input: infer I extends TSchema } } ? Static<I> : never;\n\n/** What a factory returns for contract C. */\nexport type BehaviorOf<C> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantBehavior<K, D[\"variants\"][K]> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? { readonly [K in keyof LocalMembers<D>]: LocalBehaviorMember<LocalMembers<D>[K]> } & Record<string, unknown>\n\t\t: never;\n\n/** Late-bound members a handle exposes for contract C (all variants merged). */\nexport type MembersOf<C> = C extends RemoteContract<infer D>\n\t? UnionToIntersection<{ [K in keyof D[\"variants\"]]: VariantHandle<D[\"variants\"][K]> }[keyof D[\"variants\"]]>\n\t: C extends LocalContract<infer D>\n\t\t? { readonly [K in keyof LocalMembers<D>]: LocalHandleMember<LocalMembers<D>[K]> }\n\t\t: never;\n\nexport type Handle<C extends AnyContract = AnyContract> = HandleBase<C> & MembersOf<C>;\n"]}
|