@powerhousedao/reactor 6.2.3-dev.45 → 6.2.3-dev.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rpc.d.ts +16 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -1
- package/dist/rpc.js.map +1 -1
- package/package.json +3 -3
package/dist/rpc.d.ts
CHANGED
|
@@ -60,7 +60,19 @@ type RpcNextPage = {
|
|
|
60
60
|
id: CorrelationId;
|
|
61
61
|
token: string;
|
|
62
62
|
};
|
|
63
|
-
export declare const RPC_PROTOCOL_VERSION =
|
|
63
|
+
export declare const RPC_PROTOCOL_VERSION = 3;
|
|
64
|
+
/**
|
|
65
|
+
* A package the worker loads by URL rather than by registry spec: local
|
|
66
|
+
* project packages, whose models the registry does not serve. The URL must be
|
|
67
|
+
* a worker-importable models entry - the dev server's transformed
|
|
68
|
+
* `document-models/index.js` in dev, a prebuilt bundle under
|
|
69
|
+
* `__reactor_worker__/packages/` in production.
|
|
70
|
+
*/
|
|
71
|
+
type WorkerPackageSource = {
|
|
72
|
+
name: string;
|
|
73
|
+
version?: string;
|
|
74
|
+
url: string;
|
|
75
|
+
};
|
|
64
76
|
type VersionFingerprint = {
|
|
65
77
|
appBuildId: string;
|
|
66
78
|
rpcProtocolVersion: number;
|
|
@@ -81,6 +93,8 @@ type RpcRegisterPackages = {
|
|
|
81
93
|
k: "register-packages";
|
|
82
94
|
id: CorrelationId;
|
|
83
95
|
specs: string[];
|
|
96
|
+
/** URL-addressed packages; the worker REPLACES a source it already loaded. */
|
|
97
|
+
sources?: WorkerPackageSource[];
|
|
84
98
|
};
|
|
85
99
|
type RpcUnregisterPackages = {
|
|
86
100
|
k: "unregister-packages";
|
|
@@ -313,6 +327,6 @@ interface CorrelatedConfig<Sub, EK extends OwnerMessage["k"], ErrK extends Owner
|
|
|
313
327
|
}
|
|
314
328
|
export declare function createCorrelatedSubscriptions<Sub, EK extends OwnerMessage["k"], ErrK extends OwnerMessage["k"]>(router: MessageRouter, config: CorrelatedConfig<Sub, EK, ErrK>): ICorrelatedSubscriptions<Sub>;
|
|
315
329
|
//#endregion
|
|
316
|
-
export type { ClientMessage, CorrelationId, ErrorInfo, ICorrelatedSubscriptions, IHostResponder, IRpcTransport, MethodCallMessage, OpKind, OwnerMessage, ReactorIdentity, RpcAbort, RpcAdmin, RpcBusEvent, RpcDbOp, RpcError, RpcEvent, RpcHello, RpcIdentity, RpcInspectorOp, RpcLiveError, RpcLiveEvent, RpcLiveSubscribe, RpcLiveUnsub, RpcMessage, RpcMigration, RpcNextPage, RpcPing, RpcPong, RpcPoster, RpcRegisterPackages, RpcReload, RpcRequest, RpcRequestOptions, RpcResponse, RpcSubError, RpcSubscribe, RpcSyncOp, RpcUnregisterPackages, RpcUnsub, VersionFingerprint, WorkerInspectorInfo, WorkerMigrationState };
|
|
330
|
+
export type { ClientMessage, CorrelationId, ErrorInfo, ICorrelatedSubscriptions, IHostResponder, IRpcTransport, MethodCallMessage, OpKind, OwnerMessage, ReactorIdentity, RpcAbort, RpcAdmin, RpcBusEvent, RpcDbOp, RpcError, RpcEvent, RpcHello, RpcIdentity, RpcInspectorOp, RpcLiveError, RpcLiveEvent, RpcLiveSubscribe, RpcLiveUnsub, RpcMessage, RpcMigration, RpcNextPage, RpcPing, RpcPong, RpcPoster, RpcRegisterPackages, RpcReload, RpcRequest, RpcRequestOptions, RpcResponse, RpcSubError, RpcSubscribe, RpcSyncOp, RpcUnregisterPackages, RpcUnsub, VersionFingerprint, WorkerInspectorInfo, WorkerMigrationState, WorkerPackageSource };
|
|
317
331
|
export {};
|
|
318
332
|
//# sourceMappingURL=rpc.d.ts.map
|
package/dist/rpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","names":[],"sources":["../src/rpc/protocol.ts","../src/rpc/rpc-correlator.ts","../src/rpc/transport.ts","../src/rpc/message-router.ts","../src/rpc/client-proxy.ts","../src/rpc/error-info.ts","../src/rpc/host-reply.ts","../src/rpc/host-server.ts","../src/rpc/listeners.ts","../src/rpc/subscription.ts"],"mappings":";;KAAY;KAEA;EACV;EACA;EACA;EACA,QAAQ;;KAGE;EACV;EACA,IAAI;EACJ;EACA;EACA;;KAGU;EAAgB;EAAU,IAAI;EAAe;;KAE7C;EAAa;EAAU,IAAI;EAAe,OAAO;;;KAGjD;EAAgB;EAAc,IAAI;EAAe,OAAO;;;KAGxD;EACV;EACA,IAAI;EACJ,OAAO;;KAGG;EAAa;EAAY,UAAU;;KAEnC;EACV;EACA,IAAI;EACJ;EACA;;KAGU;EAAa;EAAY,IAAI;EAAe;;KAE5C;EAAa;EAAY,IAAI;;KAE7B;EAAgB;EAAW,IAAI;EAAe;;qBAI7C;
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","names":[],"sources":["../src/rpc/protocol.ts","../src/rpc/rpc-correlator.ts","../src/rpc/transport.ts","../src/rpc/message-router.ts","../src/rpc/client-proxy.ts","../src/rpc/error-info.ts","../src/rpc/host-reply.ts","../src/rpc/host-server.ts","../src/rpc/listeners.ts","../src/rpc/subscription.ts"],"mappings":"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"}
|
package/dist/rpc.js
CHANGED
|
@@ -230,7 +230,7 @@ function createReactorClientProxy(router, options = {}) {
|
|
|
230
230
|
}
|
|
231
231
|
//#endregion
|
|
232
232
|
//#region src/rpc/protocol.ts
|
|
233
|
-
const RPC_PROTOCOL_VERSION =
|
|
233
|
+
const RPC_PROTOCOL_VERSION = 3;
|
|
234
234
|
/** Error reply kind for a client message kind, so it reaches the right registry. */
|
|
235
235
|
function responseErrorKind(k) {
|
|
236
236
|
if (k === "sub") return "sub-err";
|
package/dist/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","names":[],"sources":["../src/rpc/error-info.ts","../src/rpc/paging.ts","../src/rpc/subscription.ts","../src/rpc/client-proxy.ts","../src/rpc/protocol.ts","../src/rpc/host-reply.ts","../src/rpc/host-server.ts","../src/rpc/listeners.ts","../src/rpc/rpc-correlator.ts","../src/rpc/message-router.ts","../src/rpc/transport.ts"],"sourcesContent":["import type { ErrorInfo } from \"./protocol.js\";\n\nconst MAX_STACK_LENGTH = 8 * 1024;\nconst MAX_CAUSE_DEPTH = 8;\n\nexport function toErrorInfo(err: unknown, depth = 0): ErrorInfo {\n if (depth > MAX_CAUSE_DEPTH) {\n return { name: \"Error\", message: \"cause chain truncated\" };\n }\n if (err instanceof Error) {\n const info: ErrorInfo = { name: err.name || \"Error\", message: err.message };\n if (typeof err.stack === \"string\") {\n info.stack =\n err.stack.length > MAX_STACK_LENGTH\n ? err.stack.slice(0, MAX_STACK_LENGTH)\n : err.stack;\n }\n if (err.cause !== undefined) {\n info.cause = toErrorInfo(err.cause, depth + 1);\n }\n return info;\n }\n if (typeof err === \"string\") {\n return { name: \"Error\", message: err };\n }\n if (err && typeof err === \"object\") {\n const record = err as { name?: unknown; message?: unknown };\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : safeStringify(err),\n };\n }\n return { name: \"Error\", message: safeStringify(err) };\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\nexport function fromErrorInfo(info: ErrorInfo): Error {\n const err = new Error(info.message);\n Object.defineProperty(err, \"name\", {\n value: info.name,\n configurable: true,\n writable: true,\n });\n if (info.stack !== undefined) {\n err.stack = info.stack;\n }\n if (info.cause !== undefined) {\n Object.defineProperty(err, \"cause\", {\n value: fromErrorInfo(info.cause),\n configurable: true,\n writable: true,\n });\n }\n return err;\n}\n","export type PageableResult = Record<string, unknown> & {\n next: () => Promise<unknown>;\n};\n\nexport type TokenizedPage = Record<string, unknown> & { nextToken: string };\n\nexport function isPageableResult(value: unknown): value is PageableResult {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { next?: unknown }).next === \"function\"\n );\n}\n\nexport function hasNextToken(value: unknown): value is TokenizedPage {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { nextToken?: unknown }).nextToken === \"string\"\n );\n}\n\nexport function dehydratePage(\n value: unknown,\n registerCursor: (next: () => Promise<unknown>) => string,\n): unknown {\n if (!isPageableResult(value)) {\n return value;\n }\n const { next, ...rest } = value;\n return { ...rest, nextToken: registerCursor(next) };\n}\n\nexport function rehydratePage(\n value: unknown,\n fetchPage: (token: string) => Promise<unknown>,\n): unknown {\n if (!hasNextToken(value)) {\n return value;\n }\n const { nextToken, ...rest } = value;\n return { ...rest, next: () => fetchPage(nextToken) };\n}\n","import type { MessageRouter } from \"./message-router.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\n\nexport class SubscriptionStore {\n private readonly map = new Map<CorrelationId, () => void>();\n\n set(id: CorrelationId, unsubscribe: () => void): void {\n this.map.set(id, unsubscribe);\n }\n\n get(id: CorrelationId): (() => void) | undefined {\n return this.map.get(id);\n }\n\n delete(id: CorrelationId): void {\n this.map.delete(id);\n }\n\n end(id: CorrelationId): void {\n const unsubscribe = this.map.get(id);\n if (unsubscribe) {\n this.map.delete(id);\n unsubscribe();\n }\n }\n\n drain(): void {\n for (const unsubscribe of this.map.values()) {\n unsubscribe();\n }\n this.map.clear();\n }\n}\n\nexport interface ICorrelatedSubscriptions<Sub> {\n subscribe(sub: Sub, open: (id: CorrelationId) => ClientMessage): () => void;\n}\n\nexport interface CorrelatedConfig<\n Sub,\n EK extends OwnerMessage[\"k\"],\n ErrK extends OwnerMessage[\"k\"],\n> {\n idPrefix: string;\n eventKind: EK;\n errKind: ErrK;\n onEvent: (sub: Sub, message: Extract<OwnerMessage, { k: EK }>) => void;\n onError: (sub: Sub, message: Extract<OwnerMessage, { k: ErrK }>) => void;\n close: (id: CorrelationId) => ClientMessage;\n}\n\nexport function createCorrelatedSubscriptions<\n Sub,\n EK extends OwnerMessage[\"k\"],\n ErrK extends OwnerMessage[\"k\"],\n>(\n router: MessageRouter,\n config: CorrelatedConfig<Sub, EK, ErrK>,\n): ICorrelatedSubscriptions<Sub> {\n let counter = 0;\n const subs = new Map<CorrelationId, Sub>();\n\n router.on(config.eventKind, (message) => {\n const sub = subs.get((message as { id: CorrelationId }).id);\n if (sub) {\n config.onEvent(sub, message);\n }\n });\n router.on(config.errKind, (message) => {\n const id = (message as { id: CorrelationId }).id;\n const sub = subs.get(id);\n if (sub) {\n subs.delete(id);\n router.post(config.close(id));\n config.onError(sub, message);\n }\n });\n\n return {\n subscribe(sub, open) {\n const id: CorrelationId = `${config.idPrefix}${++counter}`;\n subs.set(id, sub);\n router.post(open(id));\n return () => {\n subs.delete(id);\n router.post(config.close(id));\n };\n },\n };\n}\n","import type { DocumentChangeEvent, IReactorClient } from \"../client/types.js\";\nimport type { IDocumentModelRegistry } from \"../registry/index.js\";\nimport type {\n PagingOptions,\n SearchFilter,\n ViewFilter,\n} from \"../shared/types.js\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { normalizeDocumentModelVersion } from \"@powerhousedao/shared/document-model\";\nimport { fromErrorInfo } from \"./error-info.js\";\nimport type { MessageRouter } from \"./message-router.js\";\nimport { rehydratePage } from \"./paging.js\";\nimport { createCorrelatedSubscriptions } from \"./subscription.js\";\n\ntype Forwarder = (...args: unknown[]) => Promise<unknown>;\n\ntype ChangeCallback = (event: DocumentChangeEvent) => void;\n\nfunction isAbortSignal(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as AbortSignal).aborted === \"boolean\" &&\n typeof (value as { addEventListener?: unknown }).addEventListener ===\n \"function\" &&\n // also require removeEventListener — call() attaches a listener it later detaches\n typeof (value as { removeEventListener?: unknown }).removeEventListener ===\n \"function\"\n );\n}\n\nexport type ReactorClientProxyOptions = {\n onReload?: (reason: string, workerGen?: string) => void;\n /** Tab-local registry for module lookups (reducers/editors can't cross the worker boundary). */\n registry?: IDocumentModelRegistry;\n};\n\nexport function createReactorClientProxy(\n router: MessageRouter,\n options: ReactorClientProxyOptions = {},\n): IReactorClient {\n const registry = options.registry;\n\n function fetchPage(token: string): Promise<unknown> {\n return router.request((id) => ({ k: \"page\", id, token }), {\n transform: rehydrate,\n });\n }\n\n function rehydrate(value: unknown): unknown {\n return rehydratePage(value, fetchPage);\n }\n\n const changeSubs = createCorrelatedSubscriptions<\n ChangeCallback,\n \"event\",\n \"sub-err\"\n >(router, {\n idPrefix: \"sub\",\n eventKind: \"event\",\n errKind: \"sub-err\",\n onEvent: (callback, msg) => callback(msg.change as DocumentChangeEvent),\n onError: (_callback, msg) =>\n console.error(\"Reactor subscription failed:\", fromErrorInfo(msg.error)),\n close: (id) => ({ k: \"unsub\", id }),\n });\n router.on(\"reload\", (msg) => {\n options.onReload?.(msg.reason, msg.workerGen);\n });\n\n const call = (method: string, args: unknown[]): Promise<unknown> => {\n let abortAt: number | undefined;\n for (let i = 0; i < args.length; i++) {\n if (isAbortSignal(args[i])) {\n abortAt = i;\n }\n }\n let wire = args;\n if (abortAt !== undefined) {\n wire = args.slice();\n wire[abortAt] = undefined;\n }\n return router.request(\n (id) => ({ k: \"req\", id, method, args: wire, abortAt }),\n {\n transform: rehydrate,\n setup: (id) => {\n if (abortAt === undefined) {\n return;\n }\n const signal = args[abortAt] as AbortSignal;\n const sendAbort = () => router.post({ k: \"abort\", targetId: id });\n if (signal.aborted) {\n sendAbort();\n return;\n }\n signal.addEventListener(\"abort\", sendAbort, { once: true });\n return () => signal.removeEventListener(\"abort\", sendAbort);\n },\n },\n );\n };\n\n const subscribe = (\n search: SearchFilter,\n callback: ChangeCallback,\n view?: ViewFilter,\n ): (() => void) =>\n changeSubs.subscribe(callback, (id) => ({ k: \"sub\", id, search, view }));\n\n const forwarders = new Map<string, Forwarder>();\n const forwarder = (method: string): Forwarder => {\n let fn = forwarders.get(method);\n if (!fn) {\n fn = (...args: unknown[]) => call(method, args);\n forwarders.set(method, fn);\n }\n return fn;\n };\n\n const drives = new Proxy(\n {},\n {\n get: (_target, prop) =>\n typeof prop === \"string\" ? forwarder(`drives.${prop}`) : undefined,\n },\n );\n\n const handler: ProxyHandler<Record<string, unknown>> = {\n get(_target, prop) {\n if (typeof prop !== \"string\" || prop === \"then\") {\n return undefined;\n }\n if (prop === \"drives\") {\n return drives;\n }\n if (prop === \"subscribe\") {\n return subscribe;\n }\n if (registry) {\n if (prop === \"getDocumentModelModule\") {\n return (documentType: string) =>\n Promise.resolve().then(() => registry.getModule(documentType));\n }\n if (prop === \"getDocumentModelModuleForDocument\") {\n return (document: PHDocument) =>\n Promise.resolve().then(() =>\n registry.getModule(\n document.header.documentType,\n normalizeDocumentModelVersion(\n (document.state as Partial<typeof document.state>).document\n ?.version,\n ),\n ),\n );\n }\n if (prop === \"getDocumentModelModules\") {\n return (_namespace?: string, paging?: PagingOptions) =>\n Promise.resolve({\n results: registry.getAllModules(),\n options: paging ?? { cursor: \"\", limit: Number.MAX_SAFE_INTEGER },\n });\n }\n }\n return forwarder(prop);\n },\n };\n\n return new Proxy({}, handler) as unknown as IReactorClient;\n}\n","export type CorrelationId = string;\n\nexport type ErrorInfo = {\n name: string;\n message: string;\n stack?: string;\n cause?: ErrorInfo;\n};\n\nexport type RpcRequest = {\n k: \"req\";\n id: CorrelationId;\n method: string;\n args: unknown[];\n abortAt?: number;\n};\n\nexport type RpcResponse = { k: \"res\"; id: CorrelationId; value: unknown };\n\nexport type RpcError = { k: \"err\"; id: CorrelationId; error: ErrorInfo };\n\n/** Failed document subscribe; routed to the change-subscription registry. */\nexport type RpcSubError = { k: \"sub-err\"; id: CorrelationId; error: ErrorInfo };\n\n/** Failed live query; routed to the live-query registry. */\nexport type RpcLiveError = {\n k: \"live-err\";\n id: CorrelationId;\n error: ErrorInfo;\n};\n\nexport type RpcAbort = { k: \"abort\"; targetId: CorrelationId };\n\nexport type RpcSubscribe = {\n k: \"sub\";\n id: CorrelationId;\n search: unknown;\n view?: unknown;\n};\n\nexport type RpcEvent = { k: \"event\"; id: CorrelationId; change: unknown };\n\nexport type RpcUnsub = { k: \"unsub\"; id: CorrelationId };\n\nexport type RpcNextPage = { k: \"page\"; id: CorrelationId; token: string };\n\n// Bumped when the tab<->owner wire protocol changes incompatibly; a tab whose\n// version differs from the owner's baseline is told to reload.\nexport const RPC_PROTOCOL_VERSION = 2;\n\nexport type VersionFingerprint = {\n appBuildId: string;\n rpcProtocolVersion: number;\n models: { id: string; version: number }[];\n // Enabled enforcement flags, sorted and joined. In the fingerprint so a\n // worker cannot keep enforcing the set it booted with after a config change.\n featureFlags?: string;\n};\n\nexport type RpcHello = {\n k: \"hello\";\n id: CorrelationId;\n version: VersionFingerprint;\n construct?: unknown;\n packages?: string[];\n};\n\nexport type RpcRegisterPackages = {\n k: \"register-packages\";\n id: CorrelationId;\n specs: string[];\n};\n\nexport type RpcUnregisterPackages = {\n k: \"unregister-packages\";\n id: CorrelationId;\n names: string[];\n};\n\n// `workerGen` (present on restart-driven reloads) is the new SharedWorker name\n// suffix every tab should adopt so they converge on one fresh worker.\nexport type RpcReload = { k: \"reload\"; reason: string; workerGen?: string };\n\n// Worker lifecycle/admin channel, separate from the IReactorClient RPC surface.\nexport type RpcAdmin = {\n k: \"admin\";\n id: CorrelationId;\n method: \"info\" | \"restart\" | \"clearStorage\" | \"migrate\";\n};\n\nexport type WorkerMigrationState = {\n status: \"idle\" | \"needed\" | \"migrating\" | \"failed\";\n legacyMajor?: number;\n phase?: \"clone\" | \"dump\" | \"restore\";\n error?: string;\n};\n\n// Owner -> tab push of the worker's migration state (initial seed on connect +\n// on every change), so tabs can drive the migration banner from one flag.\nexport type RpcMigration = { k: \"migration\"; state: WorkerMigrationState };\n\nexport type WorkerInspectorInfo = {\n namespace: string;\n ownerId: string;\n bootedAtMs: number;\n connectedClients: number;\n appBuildId: string;\n rpcProtocolVersion: number;\n /** Flags this worker is enforcing, from the fingerprint that built it. */\n featureFlags?: string;\n};\n\n// Cloneable subset of renown's user (matches UserActionSigner); token minting + attribution.\nexport type ReactorIdentity = {\n address: string;\n chainId: number;\n networkId: string;\n};\n\nexport type RpcIdentity = { k: \"identity\"; user: ReactorIdentity | null };\n\n// Distributed EventBus: worker -> all tabs, fire-and-forget. `eventType` is a\n// reactor IEventBus numeric type; `event` is the (cloneable) payload.\nexport type RpcBusEvent = { k: \"bus-event\"; eventType: number; event: unknown };\n\nexport type OpKind = \"sync-op\" | \"db-op\" | \"inspector-op\";\n\nexport type MethodCallMessage<K extends OpKind> = {\n k: K;\n id: CorrelationId;\n method: string;\n args: unknown[];\n};\n\n// syncManager commands (add/remove/triggerPull/list); the reply value is the\n// reactor's RemoteMeta (its DriveCollectionId degrades to plain\n// {driveId,branch} over postMessage and is rehydrated tab-side).\nexport type RpcSyncOp = MethodCallMessage<\"sync-op\">;\n\nexport type RpcDbOp = MethodCallMessage<\"db-op\">;\n\nexport type RpcInspectorOp = MethodCallMessage<\"inspector-op\">;\n\nexport type RpcLiveSubscribe = {\n k: \"sub-live\";\n id: CorrelationId;\n sql: string;\n params: unknown[];\n};\n\nexport type RpcLiveEvent = {\n k: \"event-live\";\n id: CorrelationId;\n results: unknown;\n};\n\nexport type RpcLiveUnsub = { k: \"unsub-live\"; id: CorrelationId };\n\n// Liveness heartbeat. The tab pings; the owner answers synchronously (even\n// mid-build/mid-migration) so a silently-evicted worker is detectable. The pong\n// echoes ownerId/bootedAtMs so a respawned (different) instance is identifiable.\nexport type RpcPing = { k: \"ping\"; id: CorrelationId };\n\nexport type RpcPong = {\n k: \"pong\";\n id: CorrelationId;\n ownerId: string;\n bootedAtMs: number;\n};\n\nexport type ClientMessage =\n | RpcRequest\n | RpcAbort\n | RpcSubscribe\n | RpcUnsub\n | RpcNextPage\n | RpcHello\n | RpcRegisterPackages\n | RpcUnregisterPackages\n | RpcIdentity\n | RpcAdmin\n | RpcSyncOp\n | RpcDbOp\n | RpcInspectorOp\n | RpcLiveSubscribe\n | RpcLiveUnsub\n | RpcPing;\n\nexport type OwnerMessage =\n | RpcResponse\n | RpcError\n | RpcSubError\n | RpcLiveError\n | RpcEvent\n | RpcReload\n | RpcBusEvent\n | RpcLiveEvent\n | RpcMigration\n | RpcPong;\n\nexport type RpcMessage = ClientMessage | OwnerMessage;\n\n/** Error reply kind for a client message kind, so it reaches the right registry. */\nexport function responseErrorKind(\n k: ClientMessage[\"k\"],\n): \"err\" | \"sub-err\" | \"live-err\" {\n if (k === \"sub\") {\n return \"sub-err\";\n }\n if (k === \"sub-live\") {\n return \"live-err\";\n }\n return \"err\";\n}\n","import { toErrorInfo } from \"./error-info.js\";\nimport { responseErrorKind } from \"./protocol.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\nexport interface IHostResponder {\n ok(id: CorrelationId, value?: unknown): void;\n err(id: CorrelationId, error: unknown): void;\n errForKind(message: ClientMessage, error: unknown): void;\n run(\n id: CorrelationId,\n body: () => Promise<unknown>,\n mapOk?: (value: unknown) => unknown,\n ): Promise<void>;\n}\n\nconst defaultOk = (): unknown => ({ ok: true });\n\nexport function hostResponder(transport: IRpcTransport): IHostResponder {\n const ok = (id: CorrelationId, value: unknown = { ok: true }): void => {\n transport.post({ k: \"res\", id, value });\n };\n const err = (id: CorrelationId, error: unknown): void => {\n transport.post({ k: \"err\", id, error: toErrorInfo(error) });\n };\n return {\n ok,\n err,\n errForKind(message, error) {\n if (!(\"id\" in message)) {\n return;\n }\n transport.post({\n k: responseErrorKind(message.k),\n id: message.id,\n error: toErrorInfo(error),\n } as OwnerMessage);\n },\n async run(id, body, mapOk = defaultOk) {\n try {\n ok(id, mapOk(await body()));\n } catch (error) {\n err(id, error);\n }\n },\n };\n}\n","import type { DocumentChangeEvent, IReactorClient } from \"../client/types.js\";\nimport type { SearchFilter, ViewFilter } from \"../shared/types.js\";\nimport { hostResponder, type IHostResponder } from \"./host-reply.js\";\nimport { dehydratePage } from \"./paging.js\";\nimport { SubscriptionStore } from \"./subscription.js\";\nimport type {\n ClientMessage,\n RpcNextPage,\n RpcRequest,\n RpcSubscribe,\n} from \"./protocol.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\ntype AnyMethod = (...args: unknown[]) => unknown;\ntype NextPage = () => Promise<unknown>;\n\n// Bound the page-continuation cache; an evicted token falls back to the \"expired cursor\" error.\nconst MAX_PENDING_PAGES = 1000;\n\nexport class ReactorHostServer {\n private readonly client: IReactorClient;\n private readonly transport: IRpcTransport;\n private readonly reply: IHostResponder;\n private readonly aborters = new Map<string, AbortController>();\n private readonly subscriptions = new SubscriptionStore();\n private readonly pages = new Map<string, NextPage>();\n private pageCounter = 0;\n private detach: () => void = () => {};\n\n constructor(client: IReactorClient, transport: IRpcTransport) {\n this.client = client;\n this.transport = transport;\n this.reply = hostResponder(transport);\n }\n\n start(): void {\n this.detach = this.transport.onMessage((message) => {\n void this.handleMessage(message as ClientMessage);\n });\n }\n\n stop(): void {\n this.detach();\n this.subscriptions.drain();\n this.aborters.clear();\n this.pages.clear();\n }\n\n async handleMessage(message: ClientMessage): Promise<void> {\n try {\n switch (message.k) {\n case \"req\":\n await this.handleRequest(message);\n return;\n case \"page\":\n await this.handlePage(message);\n return;\n case \"abort\":\n this.aborters.get(message.targetId)?.abort();\n return;\n case \"sub\":\n this.handleSubscribe(message);\n return;\n case \"unsub\":\n this.subscriptions.end(message.id);\n return;\n }\n } catch (error) {\n this.reply.errForKind(message, error);\n }\n }\n\n private async handleRequest(message: RpcRequest): Promise<void> {\n let args = message.args;\n let controller: AbortController | undefined;\n if (message.abortAt !== undefined) {\n controller = new AbortController();\n this.aborters.set(message.id, controller);\n args = message.args.slice();\n args[message.abortAt] = controller.signal;\n }\n try {\n const method = this.resolveMethod(message.method);\n const value = await method(...args);\n this.reply.ok(message.id, this.prepareResult(value));\n } catch (error) {\n this.reply.err(message.id, error);\n } finally {\n if (controller) {\n this.aborters.delete(message.id);\n }\n }\n }\n\n private async handlePage(message: RpcNextPage): Promise<void> {\n const next = this.pages.get(message.token);\n this.pages.delete(message.token);\n if (!next) {\n this.reply.err(\n message.id,\n new Error(\"Paged cursor already consumed or expired\"),\n );\n return;\n }\n try {\n const value = await next();\n this.reply.ok(message.id, this.prepareResult(value));\n } catch (error) {\n this.reply.err(message.id, error);\n }\n }\n\n private handleSubscribe(message: RpcSubscribe): void {\n const unsubscribe = this.client.subscribe(\n message.search as SearchFilter,\n (change: DocumentChangeEvent) =>\n this.transport.post({ k: \"event\", id: message.id, change }),\n message.view as ViewFilter | undefined,\n );\n this.subscriptions.set(message.id, unsubscribe);\n }\n\n private prepareResult(value: unknown): unknown {\n return dehydratePage(value, (next) => {\n const token = `p${++this.pageCounter}`;\n this.pages.set(token, next);\n if (this.pages.size > MAX_PENDING_PAGES) {\n const oldest = this.pages.keys().next().value;\n if (oldest !== undefined) {\n this.pages.delete(oldest);\n }\n }\n return token;\n });\n }\n\n private resolveMethod(path: string): AnyMethod {\n if (path.startsWith(\"drives.\")) {\n const name = path.slice(\"drives.\".length);\n const drives = this.client.drives as unknown as Record<string, AnyMethod>;\n const fn = drives[name];\n if (typeof fn !== \"function\") {\n throw new Error(`Unknown drive method: ${name}`);\n }\n return fn.bind(this.client.drives);\n }\n const client = this.client as unknown as Record<string, AnyMethod>;\n const fn = client[path];\n if (typeof fn !== \"function\") {\n throw new Error(`Unknown reactor method: ${path}`);\n }\n return fn.bind(this.client);\n }\n}\n","export class KeyedListeners<K, A extends unknown[] = []> {\n private readonly map = new Map<K, Set<(...a: A) => void>>();\n\n add(key: K, fn: (...a: A) => void): () => void {\n let set = this.map.get(key);\n if (!set) {\n set = new Set();\n this.map.set(key, set);\n }\n set.add(fn);\n return () => {\n const current = this.map.get(key);\n if (!current) {\n return;\n }\n current.delete(fn);\n if (current.size === 0) {\n this.map.delete(key);\n }\n };\n }\n\n emit(key: K, ...a: A): void {\n const set = this.map.get(key);\n if (!set) {\n return;\n }\n for (const fn of [...set]) {\n fn(...a);\n }\n }\n\n emitAll(...a: A): void {\n for (const set of [...this.map.values()]) {\n for (const fn of [...set]) {\n fn(...a);\n }\n }\n }\n}\n\nexport class Listeners<A extends unknown[] = []> {\n private readonly keyed = new KeyedListeners<null, A>();\n\n add(fn: (...a: A) => void): () => void {\n return this.keyed.add(null, fn);\n }\n\n emit(...a: A): void {\n this.keyed.emit(null, ...a);\n }\n}\n","import { fromErrorInfo } from \"./error-info.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n cleanup?: () => void;\n transform?: (value: unknown) => unknown;\n};\n\nexport type RpcRequestOptions = {\n /** Reject if no response arrives within this many ms; omit for no timeout. */\n timeoutMs?: number;\n /** Maps a successful response value (e.g. paged-result rehydration). */\n transform?: (value: unknown) => unknown;\n /** Runs after the post; may return a cleanup invoked when the request settles. */\n setup?: (id: CorrelationId) => (() => void) | void;\n};\n\n/** Anything that can send a client message (the router). */\nexport type RpcPoster = { post(message: ClientMessage): void };\n\n/**\n * Request/response correlation shared by every RPC proxy: one pending map,\n * res/err settlement, and per-request timeout/transform/cleanup.\n */\nexport class RpcCorrelator {\n private counter = 0;\n private readonly pending = new Map<CorrelationId, Pending>();\n\n constructor(\n private readonly poster: RpcPoster,\n private readonly prefix = \"r\",\n ) {}\n\n nextId(): CorrelationId {\n return `${this.prefix}${++this.counter}`;\n }\n\n /** Settle the pending request a res/err refers to; a missing id is a no-op. */\n handleMessage(message: OwnerMessage): void {\n if (message.k !== \"res\" && message.k !== \"err\") {\n return;\n }\n const entry = this.pending.get(message.id);\n if (!entry) {\n return;\n }\n this.pending.delete(message.id);\n if (entry.timer) {\n clearTimeout(entry.timer);\n }\n entry.cleanup?.();\n if (message.k === \"res\") {\n entry.resolve(\n entry.transform ? entry.transform(message.value) : message.value,\n );\n } else {\n entry.reject(fromErrorInfo(message.error));\n }\n }\n\n /** Send a request, resolving on its res/err. `build` stamps the generated id. */\n request(\n build: (id: CorrelationId) => ClientMessage,\n options: RpcRequestOptions = {},\n ): Promise<unknown> {\n const id = this.nextId();\n const message = build(id);\n const method = (message as { method?: unknown }).method;\n const label =\n typeof method === \"string\" ? `${message.k} \"${method}\"` : message.k;\n const promise = new Promise<unknown>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeoutMs !== undefined) {\n const timeoutMs = options.timeoutMs;\n timer = setTimeout(() => {\n const entry = this.pending.get(id);\n if (entry) {\n this.pending.delete(id);\n entry.cleanup?.();\n reject(\n new Error(\n `Reactor worker did not respond to ${label} within ${timeoutMs}ms; the worker may have failed to load`,\n ),\n );\n }\n }, timeoutMs);\n }\n this.pending.set(id, {\n resolve,\n reject,\n timer,\n transform: options.transform,\n });\n });\n this.poster.post(message);\n const cleanup = options.setup?.(id);\n if (cleanup) {\n const entry = this.pending.get(id);\n if (entry) {\n entry.cleanup = cleanup;\n } else {\n cleanup();\n }\n }\n return promise;\n }\n}\n","import type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\nimport { RpcCorrelator, type RpcRequestOptions } from \"./rpc-correlator.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\ntype OwnerKind = OwnerMessage[\"k\"];\ntype RouteHandler = (message: OwnerMessage) => void;\n\n/**\n * Owns the single transport.onMessage and dispatches each message to the one\n * consumer that owns its kind. Composes the shared RpcCorrelator (res/err) and\n * exposes request/nextId; attach/detach swap the transport for reconnect.\n */\nexport class MessageRouter {\n private readonly handlers = new Map<OwnerKind, RouteHandler>();\n private readonly correlator: RpcCorrelator;\n private transport: IRpcTransport | null = null;\n private detachTransport: () => void = () => {};\n\n constructor(prefix = \"r\") {\n this.correlator = new RpcCorrelator(this, prefix);\n const settle: RouteHandler = (message) =>\n this.correlator.handleMessage(message);\n this.handlers.set(\"res\", settle);\n this.handlers.set(\"err\", settle);\n }\n\n attach(transport: IRpcTransport): void {\n this.detachTransport();\n this.transport = transport;\n this.detachTransport = transport.onMessage((message) => {\n const msg = message as OwnerMessage;\n this.handlers.get(msg.k)?.(msg);\n });\n }\n\n detach(): void {\n this.detachTransport();\n this.detachTransport = () => {};\n this.transport = null;\n }\n\n post(message: ClientMessage): void {\n if (!this.transport) {\n throw new Error(\"MessageRouter.post called before attach\");\n }\n this.transport.post(message);\n }\n\n /** Register the sole owner of a message kind; throws on a duplicate. */\n on<K extends OwnerKind>(\n kind: K,\n handler: (message: Extract<OwnerMessage, { k: K }>) => void,\n ): () => void {\n if (this.handlers.has(kind)) {\n throw new Error(`MessageRouter already has a handler for \"${kind}\"`);\n }\n const route = handler as RouteHandler;\n this.handlers.set(kind, route);\n return () => {\n if (this.handlers.get(kind) === route) {\n this.handlers.delete(kind);\n }\n };\n }\n\n request(\n build: (id: CorrelationId) => ClientMessage,\n options?: RpcRequestOptions,\n ): Promise<unknown> {\n return this.correlator.request(build, options);\n }\n\n nextId(): CorrelationId {\n return this.correlator.nextId();\n }\n}\n","import type { RpcMessage } from \"./protocol.js\";\n\nexport interface IRpcTransport {\n post(message: RpcMessage): void;\n onMessage(listener: (message: RpcMessage) => void): () => void;\n close(): void;\n}\n\nexport function createPortTransport(port: MessagePort): IRpcTransport {\n port.start();\n port.addEventListener(\"messageerror\", (event) => {\n console.error(\"[rpc transport] failed to deserialize message\", event);\n });\n return {\n post(message) {\n port.postMessage(message);\n },\n onMessage(listener) {\n const handler = (event: MessageEvent) => {\n listener(event.data as RpcMessage);\n };\n port.addEventListener(\"message\", handler);\n return () => port.removeEventListener(\"message\", handler);\n },\n close() {\n port.close();\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rpc.js","names":[],"sources":["../src/rpc/error-info.ts","../src/rpc/paging.ts","../src/rpc/subscription.ts","../src/rpc/client-proxy.ts","../src/rpc/protocol.ts","../src/rpc/host-reply.ts","../src/rpc/host-server.ts","../src/rpc/listeners.ts","../src/rpc/rpc-correlator.ts","../src/rpc/message-router.ts","../src/rpc/transport.ts"],"sourcesContent":["import type { ErrorInfo } from \"./protocol.js\";\n\nconst MAX_STACK_LENGTH = 8 * 1024;\nconst MAX_CAUSE_DEPTH = 8;\n\nexport function toErrorInfo(err: unknown, depth = 0): ErrorInfo {\n if (depth > MAX_CAUSE_DEPTH) {\n return { name: \"Error\", message: \"cause chain truncated\" };\n }\n if (err instanceof Error) {\n const info: ErrorInfo = { name: err.name || \"Error\", message: err.message };\n if (typeof err.stack === \"string\") {\n info.stack =\n err.stack.length > MAX_STACK_LENGTH\n ? err.stack.slice(0, MAX_STACK_LENGTH)\n : err.stack;\n }\n if (err.cause !== undefined) {\n info.cause = toErrorInfo(err.cause, depth + 1);\n }\n return info;\n }\n if (typeof err === \"string\") {\n return { name: \"Error\", message: err };\n }\n if (err && typeof err === \"object\") {\n const record = err as { name?: unknown; message?: unknown };\n return {\n name: typeof record.name === \"string\" ? record.name : \"Error\",\n message:\n typeof record.message === \"string\"\n ? record.message\n : safeStringify(err),\n };\n }\n return { name: \"Error\", message: safeStringify(err) };\n}\n\nfunction safeStringify(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\nexport function fromErrorInfo(info: ErrorInfo): Error {\n const err = new Error(info.message);\n Object.defineProperty(err, \"name\", {\n value: info.name,\n configurable: true,\n writable: true,\n });\n if (info.stack !== undefined) {\n err.stack = info.stack;\n }\n if (info.cause !== undefined) {\n Object.defineProperty(err, \"cause\", {\n value: fromErrorInfo(info.cause),\n configurable: true,\n writable: true,\n });\n }\n return err;\n}\n","export type PageableResult = Record<string, unknown> & {\n next: () => Promise<unknown>;\n};\n\nexport type TokenizedPage = Record<string, unknown> & { nextToken: string };\n\nexport function isPageableResult(value: unknown): value is PageableResult {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { next?: unknown }).next === \"function\"\n );\n}\n\nexport function hasNextToken(value: unknown): value is TokenizedPage {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as { nextToken?: unknown }).nextToken === \"string\"\n );\n}\n\nexport function dehydratePage(\n value: unknown,\n registerCursor: (next: () => Promise<unknown>) => string,\n): unknown {\n if (!isPageableResult(value)) {\n return value;\n }\n const { next, ...rest } = value;\n return { ...rest, nextToken: registerCursor(next) };\n}\n\nexport function rehydratePage(\n value: unknown,\n fetchPage: (token: string) => Promise<unknown>,\n): unknown {\n if (!hasNextToken(value)) {\n return value;\n }\n const { nextToken, ...rest } = value;\n return { ...rest, next: () => fetchPage(nextToken) };\n}\n","import type { MessageRouter } from \"./message-router.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\n\nexport class SubscriptionStore {\n private readonly map = new Map<CorrelationId, () => void>();\n\n set(id: CorrelationId, unsubscribe: () => void): void {\n this.map.set(id, unsubscribe);\n }\n\n get(id: CorrelationId): (() => void) | undefined {\n return this.map.get(id);\n }\n\n delete(id: CorrelationId): void {\n this.map.delete(id);\n }\n\n end(id: CorrelationId): void {\n const unsubscribe = this.map.get(id);\n if (unsubscribe) {\n this.map.delete(id);\n unsubscribe();\n }\n }\n\n drain(): void {\n for (const unsubscribe of this.map.values()) {\n unsubscribe();\n }\n this.map.clear();\n }\n}\n\nexport interface ICorrelatedSubscriptions<Sub> {\n subscribe(sub: Sub, open: (id: CorrelationId) => ClientMessage): () => void;\n}\n\nexport interface CorrelatedConfig<\n Sub,\n EK extends OwnerMessage[\"k\"],\n ErrK extends OwnerMessage[\"k\"],\n> {\n idPrefix: string;\n eventKind: EK;\n errKind: ErrK;\n onEvent: (sub: Sub, message: Extract<OwnerMessage, { k: EK }>) => void;\n onError: (sub: Sub, message: Extract<OwnerMessage, { k: ErrK }>) => void;\n close: (id: CorrelationId) => ClientMessage;\n}\n\nexport function createCorrelatedSubscriptions<\n Sub,\n EK extends OwnerMessage[\"k\"],\n ErrK extends OwnerMessage[\"k\"],\n>(\n router: MessageRouter,\n config: CorrelatedConfig<Sub, EK, ErrK>,\n): ICorrelatedSubscriptions<Sub> {\n let counter = 0;\n const subs = new Map<CorrelationId, Sub>();\n\n router.on(config.eventKind, (message) => {\n const sub = subs.get((message as { id: CorrelationId }).id);\n if (sub) {\n config.onEvent(sub, message);\n }\n });\n router.on(config.errKind, (message) => {\n const id = (message as { id: CorrelationId }).id;\n const sub = subs.get(id);\n if (sub) {\n subs.delete(id);\n router.post(config.close(id));\n config.onError(sub, message);\n }\n });\n\n return {\n subscribe(sub, open) {\n const id: CorrelationId = `${config.idPrefix}${++counter}`;\n subs.set(id, sub);\n router.post(open(id));\n return () => {\n subs.delete(id);\n router.post(config.close(id));\n };\n },\n };\n}\n","import type { DocumentChangeEvent, IReactorClient } from \"../client/types.js\";\nimport type { IDocumentModelRegistry } from \"../registry/index.js\";\nimport type {\n PagingOptions,\n SearchFilter,\n ViewFilter,\n} from \"../shared/types.js\";\nimport type { PHDocument } from \"@powerhousedao/shared/document-model\";\nimport { normalizeDocumentModelVersion } from \"@powerhousedao/shared/document-model\";\nimport { fromErrorInfo } from \"./error-info.js\";\nimport type { MessageRouter } from \"./message-router.js\";\nimport { rehydratePage } from \"./paging.js\";\nimport { createCorrelatedSubscriptions } from \"./subscription.js\";\n\ntype Forwarder = (...args: unknown[]) => Promise<unknown>;\n\ntype ChangeCallback = (event: DocumentChangeEvent) => void;\n\nfunction isAbortSignal(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as AbortSignal).aborted === \"boolean\" &&\n typeof (value as { addEventListener?: unknown }).addEventListener ===\n \"function\" &&\n // also require removeEventListener — call() attaches a listener it later detaches\n typeof (value as { removeEventListener?: unknown }).removeEventListener ===\n \"function\"\n );\n}\n\nexport type ReactorClientProxyOptions = {\n onReload?: (reason: string, workerGen?: string) => void;\n /** Tab-local registry for module lookups (reducers/editors can't cross the worker boundary). */\n registry?: IDocumentModelRegistry;\n};\n\nexport function createReactorClientProxy(\n router: MessageRouter,\n options: ReactorClientProxyOptions = {},\n): IReactorClient {\n const registry = options.registry;\n\n function fetchPage(token: string): Promise<unknown> {\n return router.request((id) => ({ k: \"page\", id, token }), {\n transform: rehydrate,\n });\n }\n\n function rehydrate(value: unknown): unknown {\n return rehydratePage(value, fetchPage);\n }\n\n const changeSubs = createCorrelatedSubscriptions<\n ChangeCallback,\n \"event\",\n \"sub-err\"\n >(router, {\n idPrefix: \"sub\",\n eventKind: \"event\",\n errKind: \"sub-err\",\n onEvent: (callback, msg) => callback(msg.change as DocumentChangeEvent),\n onError: (_callback, msg) =>\n console.error(\"Reactor subscription failed:\", fromErrorInfo(msg.error)),\n close: (id) => ({ k: \"unsub\", id }),\n });\n router.on(\"reload\", (msg) => {\n options.onReload?.(msg.reason, msg.workerGen);\n });\n\n const call = (method: string, args: unknown[]): Promise<unknown> => {\n let abortAt: number | undefined;\n for (let i = 0; i < args.length; i++) {\n if (isAbortSignal(args[i])) {\n abortAt = i;\n }\n }\n let wire = args;\n if (abortAt !== undefined) {\n wire = args.slice();\n wire[abortAt] = undefined;\n }\n return router.request(\n (id) => ({ k: \"req\", id, method, args: wire, abortAt }),\n {\n transform: rehydrate,\n setup: (id) => {\n if (abortAt === undefined) {\n return;\n }\n const signal = args[abortAt] as AbortSignal;\n const sendAbort = () => router.post({ k: \"abort\", targetId: id });\n if (signal.aborted) {\n sendAbort();\n return;\n }\n signal.addEventListener(\"abort\", sendAbort, { once: true });\n return () => signal.removeEventListener(\"abort\", sendAbort);\n },\n },\n );\n };\n\n const subscribe = (\n search: SearchFilter,\n callback: ChangeCallback,\n view?: ViewFilter,\n ): (() => void) =>\n changeSubs.subscribe(callback, (id) => ({ k: \"sub\", id, search, view }));\n\n const forwarders = new Map<string, Forwarder>();\n const forwarder = (method: string): Forwarder => {\n let fn = forwarders.get(method);\n if (!fn) {\n fn = (...args: unknown[]) => call(method, args);\n forwarders.set(method, fn);\n }\n return fn;\n };\n\n const drives = new Proxy(\n {},\n {\n get: (_target, prop) =>\n typeof prop === \"string\" ? forwarder(`drives.${prop}`) : undefined,\n },\n );\n\n const handler: ProxyHandler<Record<string, unknown>> = {\n get(_target, prop) {\n if (typeof prop !== \"string\" || prop === \"then\") {\n return undefined;\n }\n if (prop === \"drives\") {\n return drives;\n }\n if (prop === \"subscribe\") {\n return subscribe;\n }\n if (registry) {\n if (prop === \"getDocumentModelModule\") {\n return (documentType: string) =>\n Promise.resolve().then(() => registry.getModule(documentType));\n }\n if (prop === \"getDocumentModelModuleForDocument\") {\n return (document: PHDocument) =>\n Promise.resolve().then(() =>\n registry.getModule(\n document.header.documentType,\n normalizeDocumentModelVersion(\n (document.state as Partial<typeof document.state>).document\n ?.version,\n ),\n ),\n );\n }\n if (prop === \"getDocumentModelModules\") {\n return (_namespace?: string, paging?: PagingOptions) =>\n Promise.resolve({\n results: registry.getAllModules(),\n options: paging ?? { cursor: \"\", limit: Number.MAX_SAFE_INTEGER },\n });\n }\n }\n return forwarder(prop);\n },\n };\n\n return new Proxy({}, handler) as unknown as IReactorClient;\n}\n","export type CorrelationId = string;\n\nexport type ErrorInfo = {\n name: string;\n message: string;\n stack?: string;\n cause?: ErrorInfo;\n};\n\nexport type RpcRequest = {\n k: \"req\";\n id: CorrelationId;\n method: string;\n args: unknown[];\n abortAt?: number;\n};\n\nexport type RpcResponse = { k: \"res\"; id: CorrelationId; value: unknown };\n\nexport type RpcError = { k: \"err\"; id: CorrelationId; error: ErrorInfo };\n\n/** Failed document subscribe; routed to the change-subscription registry. */\nexport type RpcSubError = { k: \"sub-err\"; id: CorrelationId; error: ErrorInfo };\n\n/** Failed live query; routed to the live-query registry. */\nexport type RpcLiveError = {\n k: \"live-err\";\n id: CorrelationId;\n error: ErrorInfo;\n};\n\nexport type RpcAbort = { k: \"abort\"; targetId: CorrelationId };\n\nexport type RpcSubscribe = {\n k: \"sub\";\n id: CorrelationId;\n search: unknown;\n view?: unknown;\n};\n\nexport type RpcEvent = { k: \"event\"; id: CorrelationId; change: unknown };\n\nexport type RpcUnsub = { k: \"unsub\"; id: CorrelationId };\n\nexport type RpcNextPage = { k: \"page\"; id: CorrelationId; token: string };\n\n// Bumped when the tab<->owner wire protocol changes incompatibly; a tab whose\n// version differs from the owner's baseline is told to reload.\nexport const RPC_PROTOCOL_VERSION = 3;\n\n/**\n * A package the worker loads by URL rather than by registry spec: local\n * project packages, whose models the registry does not serve. The URL must be\n * a worker-importable models entry - the dev server's transformed\n * `document-models/index.js` in dev, a prebuilt bundle under\n * `__reactor_worker__/packages/` in production.\n */\nexport type WorkerPackageSource = {\n name: string;\n version?: string;\n url: string;\n};\n\nexport type VersionFingerprint = {\n appBuildId: string;\n rpcProtocolVersion: number;\n models: { id: string; version: number }[];\n // Enabled enforcement flags, sorted and joined. In the fingerprint so a\n // worker cannot keep enforcing the set it booted with after a config change.\n featureFlags?: string;\n};\n\nexport type RpcHello = {\n k: \"hello\";\n id: CorrelationId;\n version: VersionFingerprint;\n construct?: unknown;\n packages?: string[];\n};\n\nexport type RpcRegisterPackages = {\n k: \"register-packages\";\n id: CorrelationId;\n specs: string[];\n /** URL-addressed packages; the worker REPLACES a source it already loaded. */\n sources?: WorkerPackageSource[];\n};\n\nexport type RpcUnregisterPackages = {\n k: \"unregister-packages\";\n id: CorrelationId;\n names: string[];\n};\n\n// `workerGen` (present on restart-driven reloads) is the new SharedWorker name\n// suffix every tab should adopt so they converge on one fresh worker.\nexport type RpcReload = { k: \"reload\"; reason: string; workerGen?: string };\n\n// Worker lifecycle/admin channel, separate from the IReactorClient RPC surface.\nexport type RpcAdmin = {\n k: \"admin\";\n id: CorrelationId;\n method: \"info\" | \"restart\" | \"clearStorage\" | \"migrate\";\n};\n\nexport type WorkerMigrationState = {\n status: \"idle\" | \"needed\" | \"migrating\" | \"failed\";\n legacyMajor?: number;\n phase?: \"clone\" | \"dump\" | \"restore\";\n error?: string;\n};\n\n// Owner -> tab push of the worker's migration state (initial seed on connect +\n// on every change), so tabs can drive the migration banner from one flag.\nexport type RpcMigration = { k: \"migration\"; state: WorkerMigrationState };\n\nexport type WorkerInspectorInfo = {\n namespace: string;\n ownerId: string;\n bootedAtMs: number;\n connectedClients: number;\n appBuildId: string;\n rpcProtocolVersion: number;\n /** Flags this worker is enforcing, from the fingerprint that built it. */\n featureFlags?: string;\n};\n\n// Cloneable subset of renown's user (matches UserActionSigner); token minting + attribution.\nexport type ReactorIdentity = {\n address: string;\n chainId: number;\n networkId: string;\n};\n\nexport type RpcIdentity = { k: \"identity\"; user: ReactorIdentity | null };\n\n// Distributed EventBus: worker -> all tabs, fire-and-forget. `eventType` is a\n// reactor IEventBus numeric type; `event` is the (cloneable) payload.\nexport type RpcBusEvent = { k: \"bus-event\"; eventType: number; event: unknown };\n\nexport type OpKind = \"sync-op\" | \"db-op\" | \"inspector-op\";\n\nexport type MethodCallMessage<K extends OpKind> = {\n k: K;\n id: CorrelationId;\n method: string;\n args: unknown[];\n};\n\n// syncManager commands (add/remove/triggerPull/list); the reply value is the\n// reactor's RemoteMeta (its DriveCollectionId degrades to plain\n// {driveId,branch} over postMessage and is rehydrated tab-side).\nexport type RpcSyncOp = MethodCallMessage<\"sync-op\">;\n\nexport type RpcDbOp = MethodCallMessage<\"db-op\">;\n\nexport type RpcInspectorOp = MethodCallMessage<\"inspector-op\">;\n\nexport type RpcLiveSubscribe = {\n k: \"sub-live\";\n id: CorrelationId;\n sql: string;\n params: unknown[];\n};\n\nexport type RpcLiveEvent = {\n k: \"event-live\";\n id: CorrelationId;\n results: unknown;\n};\n\nexport type RpcLiveUnsub = { k: \"unsub-live\"; id: CorrelationId };\n\n// Liveness heartbeat. The tab pings; the owner answers synchronously (even\n// mid-build/mid-migration) so a silently-evicted worker is detectable. The pong\n// echoes ownerId/bootedAtMs so a respawned (different) instance is identifiable.\nexport type RpcPing = { k: \"ping\"; id: CorrelationId };\n\nexport type RpcPong = {\n k: \"pong\";\n id: CorrelationId;\n ownerId: string;\n bootedAtMs: number;\n};\n\nexport type ClientMessage =\n | RpcRequest\n | RpcAbort\n | RpcSubscribe\n | RpcUnsub\n | RpcNextPage\n | RpcHello\n | RpcRegisterPackages\n | RpcUnregisterPackages\n | RpcIdentity\n | RpcAdmin\n | RpcSyncOp\n | RpcDbOp\n | RpcInspectorOp\n | RpcLiveSubscribe\n | RpcLiveUnsub\n | RpcPing;\n\nexport type OwnerMessage =\n | RpcResponse\n | RpcError\n | RpcSubError\n | RpcLiveError\n | RpcEvent\n | RpcReload\n | RpcBusEvent\n | RpcLiveEvent\n | RpcMigration\n | RpcPong;\n\nexport type RpcMessage = ClientMessage | OwnerMessage;\n\n/** Error reply kind for a client message kind, so it reaches the right registry. */\nexport function responseErrorKind(\n k: ClientMessage[\"k\"],\n): \"err\" | \"sub-err\" | \"live-err\" {\n if (k === \"sub\") {\n return \"sub-err\";\n }\n if (k === \"sub-live\") {\n return \"live-err\";\n }\n return \"err\";\n}\n","import { toErrorInfo } from \"./error-info.js\";\nimport { responseErrorKind } from \"./protocol.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\nexport interface IHostResponder {\n ok(id: CorrelationId, value?: unknown): void;\n err(id: CorrelationId, error: unknown): void;\n errForKind(message: ClientMessage, error: unknown): void;\n run(\n id: CorrelationId,\n body: () => Promise<unknown>,\n mapOk?: (value: unknown) => unknown,\n ): Promise<void>;\n}\n\nconst defaultOk = (): unknown => ({ ok: true });\n\nexport function hostResponder(transport: IRpcTransport): IHostResponder {\n const ok = (id: CorrelationId, value: unknown = { ok: true }): void => {\n transport.post({ k: \"res\", id, value });\n };\n const err = (id: CorrelationId, error: unknown): void => {\n transport.post({ k: \"err\", id, error: toErrorInfo(error) });\n };\n return {\n ok,\n err,\n errForKind(message, error) {\n if (!(\"id\" in message)) {\n return;\n }\n transport.post({\n k: responseErrorKind(message.k),\n id: message.id,\n error: toErrorInfo(error),\n } as OwnerMessage);\n },\n async run(id, body, mapOk = defaultOk) {\n try {\n ok(id, mapOk(await body()));\n } catch (error) {\n err(id, error);\n }\n },\n };\n}\n","import type { DocumentChangeEvent, IReactorClient } from \"../client/types.js\";\nimport type { SearchFilter, ViewFilter } from \"../shared/types.js\";\nimport { hostResponder, type IHostResponder } from \"./host-reply.js\";\nimport { dehydratePage } from \"./paging.js\";\nimport { SubscriptionStore } from \"./subscription.js\";\nimport type {\n ClientMessage,\n RpcNextPage,\n RpcRequest,\n RpcSubscribe,\n} from \"./protocol.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\ntype AnyMethod = (...args: unknown[]) => unknown;\ntype NextPage = () => Promise<unknown>;\n\n// Bound the page-continuation cache; an evicted token falls back to the \"expired cursor\" error.\nconst MAX_PENDING_PAGES = 1000;\n\nexport class ReactorHostServer {\n private readonly client: IReactorClient;\n private readonly transport: IRpcTransport;\n private readonly reply: IHostResponder;\n private readonly aborters = new Map<string, AbortController>();\n private readonly subscriptions = new SubscriptionStore();\n private readonly pages = new Map<string, NextPage>();\n private pageCounter = 0;\n private detach: () => void = () => {};\n\n constructor(client: IReactorClient, transport: IRpcTransport) {\n this.client = client;\n this.transport = transport;\n this.reply = hostResponder(transport);\n }\n\n start(): void {\n this.detach = this.transport.onMessage((message) => {\n void this.handleMessage(message as ClientMessage);\n });\n }\n\n stop(): void {\n this.detach();\n this.subscriptions.drain();\n this.aborters.clear();\n this.pages.clear();\n }\n\n async handleMessage(message: ClientMessage): Promise<void> {\n try {\n switch (message.k) {\n case \"req\":\n await this.handleRequest(message);\n return;\n case \"page\":\n await this.handlePage(message);\n return;\n case \"abort\":\n this.aborters.get(message.targetId)?.abort();\n return;\n case \"sub\":\n this.handleSubscribe(message);\n return;\n case \"unsub\":\n this.subscriptions.end(message.id);\n return;\n }\n } catch (error) {\n this.reply.errForKind(message, error);\n }\n }\n\n private async handleRequest(message: RpcRequest): Promise<void> {\n let args = message.args;\n let controller: AbortController | undefined;\n if (message.abortAt !== undefined) {\n controller = new AbortController();\n this.aborters.set(message.id, controller);\n args = message.args.slice();\n args[message.abortAt] = controller.signal;\n }\n try {\n const method = this.resolveMethod(message.method);\n const value = await method(...args);\n this.reply.ok(message.id, this.prepareResult(value));\n } catch (error) {\n this.reply.err(message.id, error);\n } finally {\n if (controller) {\n this.aborters.delete(message.id);\n }\n }\n }\n\n private async handlePage(message: RpcNextPage): Promise<void> {\n const next = this.pages.get(message.token);\n this.pages.delete(message.token);\n if (!next) {\n this.reply.err(\n message.id,\n new Error(\"Paged cursor already consumed or expired\"),\n );\n return;\n }\n try {\n const value = await next();\n this.reply.ok(message.id, this.prepareResult(value));\n } catch (error) {\n this.reply.err(message.id, error);\n }\n }\n\n private handleSubscribe(message: RpcSubscribe): void {\n const unsubscribe = this.client.subscribe(\n message.search as SearchFilter,\n (change: DocumentChangeEvent) =>\n this.transport.post({ k: \"event\", id: message.id, change }),\n message.view as ViewFilter | undefined,\n );\n this.subscriptions.set(message.id, unsubscribe);\n }\n\n private prepareResult(value: unknown): unknown {\n return dehydratePage(value, (next) => {\n const token = `p${++this.pageCounter}`;\n this.pages.set(token, next);\n if (this.pages.size > MAX_PENDING_PAGES) {\n const oldest = this.pages.keys().next().value;\n if (oldest !== undefined) {\n this.pages.delete(oldest);\n }\n }\n return token;\n });\n }\n\n private resolveMethod(path: string): AnyMethod {\n if (path.startsWith(\"drives.\")) {\n const name = path.slice(\"drives.\".length);\n const drives = this.client.drives as unknown as Record<string, AnyMethod>;\n const fn = drives[name];\n if (typeof fn !== \"function\") {\n throw new Error(`Unknown drive method: ${name}`);\n }\n return fn.bind(this.client.drives);\n }\n const client = this.client as unknown as Record<string, AnyMethod>;\n const fn = client[path];\n if (typeof fn !== \"function\") {\n throw new Error(`Unknown reactor method: ${path}`);\n }\n return fn.bind(this.client);\n }\n}\n","export class KeyedListeners<K, A extends unknown[] = []> {\n private readonly map = new Map<K, Set<(...a: A) => void>>();\n\n add(key: K, fn: (...a: A) => void): () => void {\n let set = this.map.get(key);\n if (!set) {\n set = new Set();\n this.map.set(key, set);\n }\n set.add(fn);\n return () => {\n const current = this.map.get(key);\n if (!current) {\n return;\n }\n current.delete(fn);\n if (current.size === 0) {\n this.map.delete(key);\n }\n };\n }\n\n emit(key: K, ...a: A): void {\n const set = this.map.get(key);\n if (!set) {\n return;\n }\n for (const fn of [...set]) {\n fn(...a);\n }\n }\n\n emitAll(...a: A): void {\n for (const set of [...this.map.values()]) {\n for (const fn of [...set]) {\n fn(...a);\n }\n }\n }\n}\n\nexport class Listeners<A extends unknown[] = []> {\n private readonly keyed = new KeyedListeners<null, A>();\n\n add(fn: (...a: A) => void): () => void {\n return this.keyed.add(null, fn);\n }\n\n emit(...a: A): void {\n this.keyed.emit(null, ...a);\n }\n}\n","import { fromErrorInfo } from \"./error-info.js\";\nimport type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n cleanup?: () => void;\n transform?: (value: unknown) => unknown;\n};\n\nexport type RpcRequestOptions = {\n /** Reject if no response arrives within this many ms; omit for no timeout. */\n timeoutMs?: number;\n /** Maps a successful response value (e.g. paged-result rehydration). */\n transform?: (value: unknown) => unknown;\n /** Runs after the post; may return a cleanup invoked when the request settles. */\n setup?: (id: CorrelationId) => (() => void) | void;\n};\n\n/** Anything that can send a client message (the router). */\nexport type RpcPoster = { post(message: ClientMessage): void };\n\n/**\n * Request/response correlation shared by every RPC proxy: one pending map,\n * res/err settlement, and per-request timeout/transform/cleanup.\n */\nexport class RpcCorrelator {\n private counter = 0;\n private readonly pending = new Map<CorrelationId, Pending>();\n\n constructor(\n private readonly poster: RpcPoster,\n private readonly prefix = \"r\",\n ) {}\n\n nextId(): CorrelationId {\n return `${this.prefix}${++this.counter}`;\n }\n\n /** Settle the pending request a res/err refers to; a missing id is a no-op. */\n handleMessage(message: OwnerMessage): void {\n if (message.k !== \"res\" && message.k !== \"err\") {\n return;\n }\n const entry = this.pending.get(message.id);\n if (!entry) {\n return;\n }\n this.pending.delete(message.id);\n if (entry.timer) {\n clearTimeout(entry.timer);\n }\n entry.cleanup?.();\n if (message.k === \"res\") {\n entry.resolve(\n entry.transform ? entry.transform(message.value) : message.value,\n );\n } else {\n entry.reject(fromErrorInfo(message.error));\n }\n }\n\n /** Send a request, resolving on its res/err. `build` stamps the generated id. */\n request(\n build: (id: CorrelationId) => ClientMessage,\n options: RpcRequestOptions = {},\n ): Promise<unknown> {\n const id = this.nextId();\n const message = build(id);\n const method = (message as { method?: unknown }).method;\n const label =\n typeof method === \"string\" ? `${message.k} \"${method}\"` : message.k;\n const promise = new Promise<unknown>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeoutMs !== undefined) {\n const timeoutMs = options.timeoutMs;\n timer = setTimeout(() => {\n const entry = this.pending.get(id);\n if (entry) {\n this.pending.delete(id);\n entry.cleanup?.();\n reject(\n new Error(\n `Reactor worker did not respond to ${label} within ${timeoutMs}ms; the worker may have failed to load`,\n ),\n );\n }\n }, timeoutMs);\n }\n this.pending.set(id, {\n resolve,\n reject,\n timer,\n transform: options.transform,\n });\n });\n this.poster.post(message);\n const cleanup = options.setup?.(id);\n if (cleanup) {\n const entry = this.pending.get(id);\n if (entry) {\n entry.cleanup = cleanup;\n } else {\n cleanup();\n }\n }\n return promise;\n }\n}\n","import type { ClientMessage, CorrelationId, OwnerMessage } from \"./protocol.js\";\nimport { RpcCorrelator, type RpcRequestOptions } from \"./rpc-correlator.js\";\nimport type { IRpcTransport } from \"./transport.js\";\n\ntype OwnerKind = OwnerMessage[\"k\"];\ntype RouteHandler = (message: OwnerMessage) => void;\n\n/**\n * Owns the single transport.onMessage and dispatches each message to the one\n * consumer that owns its kind. Composes the shared RpcCorrelator (res/err) and\n * exposes request/nextId; attach/detach swap the transport for reconnect.\n */\nexport class MessageRouter {\n private readonly handlers = new Map<OwnerKind, RouteHandler>();\n private readonly correlator: RpcCorrelator;\n private transport: IRpcTransport | null = null;\n private detachTransport: () => void = () => {};\n\n constructor(prefix = \"r\") {\n this.correlator = new RpcCorrelator(this, prefix);\n const settle: RouteHandler = (message) =>\n this.correlator.handleMessage(message);\n this.handlers.set(\"res\", settle);\n this.handlers.set(\"err\", settle);\n }\n\n attach(transport: IRpcTransport): void {\n this.detachTransport();\n this.transport = transport;\n this.detachTransport = transport.onMessage((message) => {\n const msg = message as OwnerMessage;\n this.handlers.get(msg.k)?.(msg);\n });\n }\n\n detach(): void {\n this.detachTransport();\n this.detachTransport = () => {};\n this.transport = null;\n }\n\n post(message: ClientMessage): void {\n if (!this.transport) {\n throw new Error(\"MessageRouter.post called before attach\");\n }\n this.transport.post(message);\n }\n\n /** Register the sole owner of a message kind; throws on a duplicate. */\n on<K extends OwnerKind>(\n kind: K,\n handler: (message: Extract<OwnerMessage, { k: K }>) => void,\n ): () => void {\n if (this.handlers.has(kind)) {\n throw new Error(`MessageRouter already has a handler for \"${kind}\"`);\n }\n const route = handler as RouteHandler;\n this.handlers.set(kind, route);\n return () => {\n if (this.handlers.get(kind) === route) {\n this.handlers.delete(kind);\n }\n };\n }\n\n request(\n build: (id: CorrelationId) => ClientMessage,\n options?: RpcRequestOptions,\n ): Promise<unknown> {\n return this.correlator.request(build, options);\n }\n\n nextId(): CorrelationId {\n return this.correlator.nextId();\n }\n}\n","import type { RpcMessage } from \"./protocol.js\";\n\nexport interface IRpcTransport {\n post(message: RpcMessage): void;\n onMessage(listener: (message: RpcMessage) => void): () => void;\n close(): void;\n}\n\nexport function createPortTransport(port: MessagePort): IRpcTransport {\n port.start();\n port.addEventListener(\"messageerror\", (event) => {\n console.error(\"[rpc transport] failed to deserialize message\", event);\n });\n return {\n post(message) {\n port.postMessage(message);\n },\n onMessage(listener) {\n const handler = (event: MessageEvent) => {\n listener(event.data as RpcMessage);\n };\n port.addEventListener(\"message\", handler);\n return () => port.removeEventListener(\"message\", handler);\n },\n close() {\n port.close();\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/reactor",
|
|
3
|
-
"version": "6.2.3-dev.
|
|
3
|
+
"version": "6.2.3-dev.47",
|
|
4
4
|
"description": "Core Powerhouse reactor — stores documents, resolves conflicts, and reprocesses operation histories. Supports local, cloud, and decentralized storage backends.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/powerhouse-inc/powerhouse",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"@electric-sql/pglite": "0.3.15",
|
|
48
48
|
"pg": "8.18.0",
|
|
49
49
|
"@sindresorhus/fnv1a": "3.1.0",
|
|
50
|
-
"@powerhousedao/shared": "6.2.3-dev.
|
|
51
|
-
"document-model": "6.2.3-dev.
|
|
50
|
+
"@powerhousedao/shared": "6.2.3-dev.47",
|
|
51
|
+
"document-model": "6.2.3-dev.47"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@informalsystems/quint": "0.32.0",
|