@econ-v1/rpc 6.6.0 → 6.10.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.
Files changed (79) hide show
  1. package/dist/client-device-pending-contract.d.ts +14 -0
  2. package/dist/client-device-pending-contract.d.ts.map +1 -0
  3. package/dist/client.d.ts +15 -13
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/device-boot-contract.d.ts +7 -0
  6. package/dist/device-boot-contract.d.ts.map +1 -0
  7. package/dist/device-cleanup-contract.d.ts +17 -0
  8. package/dist/device-cleanup-contract.d.ts.map +1 -0
  9. package/dist/dialog-contract.d.ts +26 -0
  10. package/dist/dialog-contract.d.ts.map +1 -0
  11. package/dist/errors.d.ts +33 -6
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/index.d.ts +144 -14
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/message-port-client.d.ts +134 -16
  16. package/dist/message-port-client.d.ts.map +1 -1
  17. package/dist/node-app-memory-contract.d.ts +10 -0
  18. package/dist/node-app-memory-contract.d.ts.map +1 -0
  19. package/dist/onboarding/discovery-contract.d.ts +61 -34
  20. package/dist/onboarding/discovery-contract.d.ts.map +1 -1
  21. package/dist/onboarding/onboarding-contract.d.ts +119 -27
  22. package/dist/onboarding/onboarding-contract.d.ts.map +1 -1
  23. package/dist/onboarding/owner-claim-contract.d.ts +50 -0
  24. package/dist/onboarding/owner-claim-contract.d.ts.map +1 -0
  25. package/dist/pairing-status-contract.d.ts +40 -0
  26. package/dist/pairing-status-contract.d.ts.map +1 -0
  27. package/dist/protocol.d.ts +50 -12
  28. package/dist/protocol.d.ts.map +1 -1
  29. package/dist/stage-context.d.ts +31 -16
  30. package/dist/stage-context.d.ts.map +1 -1
  31. package/dist/sync-cursors-contract.d.ts +6 -0
  32. package/dist/sync-cursors-contract.d.ts.map +1 -0
  33. package/dist/system-notice-contract.d.ts +70 -0
  34. package/dist/system-notice-contract.d.ts.map +1 -0
  35. package/dist/transport-contract.d.ts +11 -0
  36. package/dist/transport-contract.d.ts.map +1 -0
  37. package/dist/transport.d.ts +2 -2
  38. package/dist/transport.d.ts.map +1 -1
  39. package/dist/trust-contract.d.ts +23 -0
  40. package/dist/trust-contract.d.ts.map +1 -0
  41. package/package.json +16 -12
  42. package/src/client-device-pending-contract.js +6 -0
  43. package/src/client.js +26 -0
  44. package/src/device-boot-contract.js +4 -0
  45. package/src/device-cleanup-contract.js +9 -0
  46. package/src/dialog-contract.js +6 -0
  47. package/src/errors.js +111 -0
  48. package/src/index.js +194 -0
  49. package/src/message-port-client.js +628 -0
  50. package/src/node-app-memory-contract.js +10 -0
  51. package/src/onboarding/discovery-contract.js +83 -0
  52. package/src/onboarding/onboarding-contract.js +106 -0
  53. package/src/onboarding/owner-claim-contract.js +59 -0
  54. package/src/pairing-status-contract.js +36 -0
  55. package/src/protocol.js +758 -0
  56. package/src/stage-context.js +27 -0
  57. package/src/sync-cursors-contract.js +3 -0
  58. package/src/system-notice-contract.js +64 -0
  59. package/src/transport-contract.js +11 -0
  60. package/src/transport.js +6 -0
  61. package/src/trust-contract.js +36 -0
  62. package/dist/client.js +0 -2
  63. package/dist/client.js.map +0 -1
  64. package/dist/errors.js +0 -57
  65. package/dist/errors.js.map +0 -1
  66. package/dist/index.js +0 -7
  67. package/dist/index.js.map +0 -1
  68. package/dist/message-port-client.js +0 -365
  69. package/dist/message-port-client.js.map +0 -1
  70. package/dist/onboarding/discovery-contract.js +0 -42
  71. package/dist/onboarding/discovery-contract.js.map +0 -1
  72. package/dist/onboarding/onboarding-contract.js +0 -37
  73. package/dist/onboarding/onboarding-contract.js.map +0 -1
  74. package/dist/protocol.js +0 -295
  75. package/dist/protocol.js.map +0 -1
  76. package/dist/stage-context.js +0 -2
  77. package/dist/stage-context.js.map +0 -1
  78. package/dist/transport.js +0 -2
  79. package/dist/transport.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {import("@econ-v1/domain").KernelEventType} KernelEventType */
4
+ /** @typedef {import("@econ-v1/domain").QueryName} QueryName */
5
+ /** @typedef {import("./client.js").Unsubscribe} Unsubscribe */
6
+ /** @typedef {import("./dialog-contract.js").DialogCenter} DialogCenter */
7
+ /** @typedef {import("./system-notice-contract.js").SystemNoticeCenter} SystemNoticeCenter */
8
+ /** @typedef {{ unmount(): Promise<void> }} MountedStage */
9
+ /** @typedef {(appName: string, slot: Element) => Promise<MountedStage>} StageLoadHandler */
10
+ /** @typedef {{
11
+ * readonly app: { readonly name: string, readonly version: string },
12
+ * readonly events: {
13
+ * publish<T extends KernelEventType>(type: T, payload: import("@econ-v1/domain").KernelEventPayload<T>): Promise<void>,
14
+ * subscribe<T extends KernelEventType>(type: T, listener: (event: import("@econ-v1/domain").KernelEventByType<T>) => void): Unsubscribe
15
+ * },
16
+ * invokeCapability<T>(capability: string, payload: unknown): Promise<T>,
17
+ * liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void): Unsubscribe,
18
+ * query<T>(name: QueryName, params: unknown): Promise<T>,
19
+ * readonly stage: { load: StageLoadHandler }
20
+ * }} StageContextShared */
21
+ /** @typedef {{ navigate(path: string): void, readonly root: Element }} StageHostShared */
22
+ /** @typedef {StageContextShared & { readonly host: StageHostShared & { readonly uiApi: 1 } }} StageContextV1 */
23
+ /** @typedef {StageContextShared & { readonly host: StageHostShared & { readonly dialogs: DialogCenter, readonly systemNotices: SystemNoticeCenter, readonly uiApi: 2 } }} StageContextV2 */
24
+ /** @typedef {StageContextV1 | StageContextV2} StageContext */
25
+ /** @typedef {{ mount(ctx: StageContext): void | Promise<void>, unmount(): void | Promise<void> }} StageModule */
26
+
27
+ export {};
@@ -0,0 +1,3 @@
1
+ // @ts-check
2
+ export const SYNC_CURSORS_QUERY = "sync.cursors.v1";
3
+ /** @typedef {{ readonly domain: string, readonly updatedAt: string }} SyncCursorView */
@@ -0,0 +1,64 @@
1
+ // @ts-check
2
+
3
+ export {};
4
+ /** @typedef {"error" | "info" | "security" | "success" | "warning"} SystemNoticeSeverity */
5
+ /** @typedef {"primary" | "secondary"} SystemNoticeActionKind */
6
+ /** @typedef {"shell" | "stage"} SystemNoticeBlockScope */
7
+ /** @typedef {"busy" | "failed" | "idle" | "resolved"} SystemNoticeState */
8
+ /** @typedef {SystemNoticeInput} SystemNotice */
9
+ /** @typedef {(notices: readonly SystemNotice[]) => void} SystemNoticeListener */
10
+ /**
11
+ * @typedef {object} SystemNoticeAction
12
+ * @property {string} [id] Stable action identity, rendered as `data-action` on the button.
13
+ * `kind` only says how an action LOOKS ("primary"/"secondary"), so two actions of the same
14
+ * kind on one notice are otherwise distinguishable only by slot position — publishers that
15
+ * need to style or target one specific action set an `id` instead of relying on order.
16
+ * @property {SystemNoticeActionKind} kind
17
+ * @property {string} label
18
+ * @property {() => void | Promise<void>} onSelect
19
+ */
20
+ /** @typedef {{ readonly label: string, readonly value: string }} SystemNoticeDetail */
21
+ /** @typedef {{ readonly body: string, readonly summary: string }} SystemNoticeDisclosure */
22
+ /** @typedef {{ readonly details?: readonly SystemNoticeDetail[], readonly disclosure?: SystemNoticeDisclosure, readonly steps?: readonly string[] }} SystemNoticeBody */
23
+ /**
24
+ * @typedef {object} SystemNoticeInput
25
+ * @property {readonly SystemNoticeAction[]} [actions]
26
+ * @property {SystemNoticeBlockScope} [blocking]
27
+ * @property {SystemNoticeBody} [body]
28
+ * @property {boolean} dismissible
29
+ * @property {string} id
30
+ * @property {string} message
31
+ * @property {boolean} persistent
32
+ * @property {number} [priority]
33
+ * @property {SystemNoticeSeverity} severity
34
+ * @property {string} source
35
+ * @property {SystemNoticeState} [state]
36
+ * @property {string} title
37
+ */
38
+ /**
39
+ * @typedef {object} SystemNoticePatch
40
+ * @property {readonly SystemNoticeAction[] | undefined} [actions]
41
+ * @property {SystemNoticeBlockScope | undefined} [blocking]
42
+ * @property {SystemNoticeBody | undefined} [body]
43
+ * @property {boolean | undefined} [dismissible]
44
+ * @property {string | undefined} [message]
45
+ * @property {boolean | undefined} [persistent]
46
+ * @property {number | undefined} [priority]
47
+ * @property {SystemNoticeSeverity | undefined} [severity]
48
+ * @property {string | undefined} [source]
49
+ * @property {SystemNoticeState | undefined} [state]
50
+ * @property {string | undefined} [title]
51
+ */
52
+ /**
53
+ * @typedef {object} SystemNoticeHandle
54
+ * @property {() => void} dismiss
55
+ * @property {(patch: SystemNoticePatch) => void} update
56
+ */
57
+ /**
58
+ * @typedef {object} SystemNoticeCenter
59
+ * @property {(id: string) => void} dismiss
60
+ * @property {() => readonly SystemNotice[]} getAll
61
+ * @property {(input: SystemNoticeInput) => SystemNoticeHandle} publish
62
+ * @property {(listener: SystemNoticeListener) => () => void} subscribe
63
+ * @property {(id: string, patch: SystemNoticePatch) => void} update
64
+ */
@@ -0,0 +1,11 @@
1
+ // @ts-check
2
+ /**
3
+ * Query names for the kernel's transport state.
4
+ *
5
+ * `v1` is a compatibility shim: it collapses the transitional `connecting` and
6
+ * `reconnecting` states down to plain `offline` so pre-state-machine consumers
7
+ * keep seeing the binary connected/offline world they were written against.
8
+ * `v2` serves the state verbatim. Delete `v1` with its last consumer.
9
+ */
10
+ export const TRANSPORT_STATE_QUERY = /** @type {const} */ ("transport.state.v1");
11
+ export const TRANSPORT_STATE_QUERY_V2 = /** @type {const} */ ("transport.state.v2");
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {"closed" | "open"} RpcTransportState */
4
+ /** @typedef {{ close(): void, send(message: string): void, subscribe(listener: (message: string) => void): () => void, subscribeClose(listener: () => void): () => void, readonly state: RpcTransportState }} RpcTransport */
5
+
6
+ export {};
@@ -0,0 +1,36 @@
1
+ // @ts-check
2
+
3
+ /** @typedef {import("@econ-v1/domain").CertificateTrustSnapshot} CertificateTrustSnapshot */
4
+ export const TRUST_STATUS_QUERY = "trust.status.v1";
5
+ export const TRUST_INSTALL_RESTART_COMMAND = "trust.install.restart.v1";
6
+ export const TRUST_VERIFY_COMMAND = "trust.verify.v1";
7
+ export const TRUST_SKIP_COMMAND = "trust.skip.v1";
8
+ /**
9
+ * @param {unknown} value
10
+ * @returns {value is Record<string, never>}
11
+ */
12
+ export function isTrustInstallRestartPayload(value) {
13
+ return isPlainObject(value) && Object.keys(value).length === 0;
14
+ }
15
+ /**
16
+ * @param {unknown} value
17
+ * @returns {value is Record<string, never>}
18
+ */
19
+ export function isTrustVerifyPayload(value) {
20
+ return isTrustInstallRestartPayload(value);
21
+ }
22
+ /**
23
+ * @param {unknown} value
24
+ * @returns {value is Record<string, never>}
25
+ */
26
+ export function isTrustSkipPayload(value) {
27
+ return isTrustInstallRestartPayload(value);
28
+ }
29
+ /**
30
+ * @param {unknown} value
31
+ * @returns {value is Record<string, unknown>}
32
+ */
33
+ function isPlainObject(value) {
34
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35
+ }
36
+ /** @typedef {CertificateTrustSnapshot} TrustStatusView */
package/dist/client.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":""}
package/dist/errors.js DELETED
@@ -1,57 +0,0 @@
1
- import { DOMAIN_ERROR_CODES, DomainError, SYNC_ERROR_CODES, SyncError, TRANSPORT_ERROR_CODES, TransportError, } from "@econ-v1/domain";
2
- export function serializeClientError(error) {
3
- return error.toJSON();
4
- }
5
- export function deserializeClientError(value) {
6
- if (!isSerializableClientError(value))
7
- throw new TypeError("Invalid RPC error");
8
- switch (value.kind) {
9
- case "domain":
10
- return new DomainError(errorOptions(value));
11
- case "sync":
12
- return new SyncError(errorOptions(value));
13
- case "transport":
14
- return new TransportError(errorOptions(value));
15
- }
16
- }
17
- export function isSerializableClientError(value) {
18
- if (!isJsonObject(value) || typeof value.code !== "string" || typeof value.kind !== "string" || typeof value.message !== "string") {
19
- return false;
20
- }
21
- if (value.details !== undefined && !isJsonObject(value.details))
22
- return false;
23
- switch (value.kind) {
24
- case "domain":
25
- return includesCode(DOMAIN_ERROR_CODES, value.code);
26
- case "sync":
27
- return includesCode(SYNC_ERROR_CODES, value.code);
28
- case "transport":
29
- return includesCode(TRANSPORT_ERROR_CODES, value.code);
30
- default:
31
- return false;
32
- }
33
- }
34
- export function isJsonValue(value) {
35
- if (value === null || typeof value === "boolean" || typeof value === "string")
36
- return true;
37
- if (typeof value === "number")
38
- return Number.isFinite(value);
39
- if (Array.isArray(value))
40
- return value.every(isJsonValue);
41
- return isJsonObject(value);
42
- }
43
- export function isJsonObject(value) {
44
- return isPlainObject(value) && Object.values(value).every(isJsonValue);
45
- }
46
- function errorOptions(value) {
47
- return value.details === undefined
48
- ? { code: value.code, message: value.message }
49
- : { code: value.code, details: value.details, message: value.message };
50
- }
51
- function includesCode(codes, value) {
52
- return codes.includes(value);
53
- }
54
- function isPlainObject(value) {
55
- return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
56
- }
57
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/index.js DELETED
@@ -1,7 +0,0 @@
1
- export { DOMAIN_ERROR_CODES, DomainError, SYNC_ERROR_CODES, SyncError, TRANSPORT_ERROR_CODES, TransportError, } from "@econ-v1/domain";
2
- export { deserializeClientError, isJsonValue, isSerializableClientError, serializeClientError, } from "./errors.js";
3
- export { KernelRpcTimeoutError, MessagePortKernelRpcClient } from "./message-port-client.js";
4
- export { isOnboardingCommand, ONBOARDING_COMMAND, ONBOARDING_EVENTS, ONBOARDING_STATUS_QUERY, } from "./onboarding/onboarding-contract.js";
5
- export { DISCOVER_NODE_COMMAND, DISCOVERY_PROBE_COMMAND, DISCOVERY_PROMOTE_COMMAND, DISCOVERY_QUERY, isDiscoverNodePayload, isProbeCandidatesPayload, isPromoteCandidatePayload, } from "./onboarding/discovery-contract.js";
6
- export { deserializeRpcEvent, deserializeRpcRequest, deserializeRpcResponse, serializeRpcEvent, serializeRpcRequest, serializeRpcResponse, } from "./protocol.js";
7
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AA2BzB,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAE7F,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qCAAqC,CAAC;AAa7C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAY5C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
@@ -1,365 +0,0 @@
1
- import { DomainError, TransportError, } from "@econ-v1/domain";
2
- import { isJsonValue } from "./errors.js";
3
- import { deserializeRpcEvent, deserializeRpcResponse, serializeRpcRequest, } from "./protocol.js";
4
- /**
5
- * A single kernel RPC request exceeded its local response deadline. This is deliberately
6
- * distinct from connection loss: the transport remains usable and callers may retry.
7
- */
8
- export class KernelRpcTimeoutError extends Error {
9
- commandName;
10
- correlationId;
11
- timeoutMs;
12
- constructor(commandName, correlationId, timeoutMs) {
13
- super(`Kernel RPC "${commandName}" (${correlationId}) timed out after ${timeoutMs}ms; the request may be retried`);
14
- this.name = "KernelRpcTimeoutError";
15
- this.commandName = commandName;
16
- this.correlationId = correlationId;
17
- this.timeoutMs = timeoutMs;
18
- }
19
- }
20
- // Kernel RPC is local, but stage work can cross browser/worker scheduling boundaries.
21
- // Thirty seconds bounds dropped fire-and-forget messages without penalizing slow devices.
22
- const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
23
- export class MessagePortKernelRpcClient {
24
- #eventGroupsByKey = new Map();
25
- #eventGroupsBySubscription = new Map();
26
- #liveGroupsByKey = new Map();
27
- #liveGroupsBySubscription = new Map();
28
- #now;
29
- #pending = new Map();
30
- #requestTimeoutMs;
31
- #transport;
32
- #unsubscribeClose;
33
- #unsubscribeMessages;
34
- #closed = false;
35
- #nextRequestId = 1;
36
- #nextSubscriptionId = 1;
37
- constructor(transport, options = {}) {
38
- this.#transport = transport;
39
- this.#now = options.now ?? (() => new Date().toISOString());
40
- this.#requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
41
- this.#unsubscribeMessages = transport.subscribe((message) => this.#handleMessage(message));
42
- this.#unsubscribeClose = transport.subscribeClose(() => this.#handleClose());
43
- }
44
- close() {
45
- if (this.#closed)
46
- return;
47
- this.#transport.close();
48
- this.#handleClose();
49
- }
50
- async command(name, payload) {
51
- return await this.#request({ name, payload: jsonValue(payload, "command payload"), type: "command" });
52
- }
53
- liveQuery(name, params, listener) {
54
- return this.#subscribeLiveQuery(undefined, name, jsonValue(params, "live-query params"), listener);
55
- }
56
- async openStageSession(appName, manifestSha256) {
57
- const value = await this.#request({ appName, manifestSha256, type: "stage.open-session" });
58
- if (!isRecord(value) || typeof value.sessionId !== "string") {
59
- throw new DomainError({ code: "invalid_request", message: "Invalid stage session response" });
60
- }
61
- return new BoundStageRpcSession(this, value.sessionId);
62
- }
63
- async prepareStage(appName) {
64
- const value = await this.#request({ appName, type: "stage.prepare" });
65
- if (!isRecord(value) ||
66
- typeof value.appName !== "string" ||
67
- typeof value.entryUrl !== "string" ||
68
- typeof value.manifestSha256 !== "string" ||
69
- typeof value.version !== "string") {
70
- throw new DomainError({ code: "invalid_request", message: "Invalid prepared stage response" });
71
- }
72
- return {
73
- appName: value.appName,
74
- entryUrl: value.entryUrl,
75
- manifestSha256: value.manifestSha256,
76
- version: value.version,
77
- };
78
- }
79
- async query(name, params) {
80
- return await this.#request({ name, params: jsonValue(params, "query params"), type: "query" });
81
- }
82
- subscribe(type, listener) {
83
- return this.#subscribeEvent(undefined, type, listener);
84
- }
85
- closeStageSession(sessionId) {
86
- const error = new TransportError({ code: "connection_lost", message: "Stage RPC session closed" });
87
- for (const [requestId, pending] of [...this.#pending]) {
88
- if (pending.sessionId === sessionId) {
89
- this.#takePending(requestId)?.reject(error);
90
- }
91
- }
92
- this.#removeSessionSubscriptions(sessionId);
93
- void this.#request({ sessionId, type: "stage.close-session" }).catch(() => undefined);
94
- }
95
- invokeStageCapability(sessionId, capability, payload) {
96
- return this.#request({
97
- capability,
98
- payload: jsonValue(payload, "capability payload"),
99
- sessionId,
100
- type: "stage.capability.invoke",
101
- });
102
- }
103
- liveQueryStage(sessionId, name, params, listener) {
104
- return this.#subscribeLiveQuery(sessionId, name, jsonValue(params, "live-query params"), listener);
105
- }
106
- publishStage(sessionId, type, payload) {
107
- const event = jsonValue({ occurredAt: this.#now(), payload, type }, "domain event");
108
- return this.#request({ event, sessionId, type: "stage.event.publish" }).then(() => undefined);
109
- }
110
- queryStage(sessionId, name, params) {
111
- return this.#request({
112
- name,
113
- params: jsonValue(params, "query params"),
114
- sessionId,
115
- type: "stage.query",
116
- });
117
- }
118
- subscribeStage(sessionId, type, listener) {
119
- return this.#subscribeEvent(sessionId, type, listener);
120
- }
121
- #handleClose() {
122
- if (this.#closed)
123
- return;
124
- this.#closed = true;
125
- this.#unsubscribeMessages();
126
- this.#unsubscribeClose();
127
- const error = new TransportError({ code: "connection_lost", message: "Kernel RPC port closed" });
128
- for (const requestId of [...this.#pending.keys()])
129
- this.#takePending(requestId)?.reject(error);
130
- this.#eventGroupsByKey.clear();
131
- this.#eventGroupsBySubscription.clear();
132
- this.#liveGroupsByKey.clear();
133
- this.#liveGroupsBySubscription.clear();
134
- }
135
- #handleMessage(message) {
136
- let envelope;
137
- try {
138
- envelope = JSON.parse(message);
139
- }
140
- catch {
141
- return;
142
- }
143
- if (isRecord(envelope) && "id" in envelope) {
144
- const responseId = typeof envelope.id === "string" ? envelope.id : undefined;
145
- try {
146
- const response = deserializeRpcResponse(message);
147
- const pending = this.#takePending(response.id);
148
- if (pending === undefined)
149
- return;
150
- if (response.ok)
151
- pending.resolve(response.value);
152
- else
153
- pending.reject(response.error);
154
- return;
155
- }
156
- catch {
157
- if (responseId !== undefined) {
158
- const pending = this.#takePending(responseId);
159
- if (pending !== undefined) {
160
- pending.reject(new DomainError({ code: "invalid_request", message: "Malformed kernel RPC response" }));
161
- }
162
- }
163
- return;
164
- }
165
- }
166
- try {
167
- const event = deserializeRpcEvent(message);
168
- if (event.type === "kernel.event") {
169
- const group = this.#eventGroupsBySubscription.get(event.subscriptionId);
170
- if (group === undefined || group.eventType !== event.event.type)
171
- return;
172
- for (const listener of [...group.listeners])
173
- this.#notify(() => listener(event.event));
174
- return;
175
- }
176
- const group = this.#liveGroupsBySubscription.get(event.subscriptionId);
177
- if (group === undefined)
178
- return;
179
- for (const listener of [...group.listeners])
180
- this.#notify(() => listener(event.diff));
181
- }
182
- catch {
183
- // Malformed or stale port messages are isolated from valid pending requests.
184
- }
185
- }
186
- #notify(listener) {
187
- try {
188
- listener();
189
- }
190
- catch {
191
- // One UI listener must not suppress later listeners on the same RPC subscription.
192
- }
193
- }
194
- #takePending(requestId) {
195
- const pending = this.#pending.get(requestId);
196
- if (pending === undefined)
197
- return undefined;
198
- this.#pending.delete(requestId);
199
- globalThis.clearTimeout(pending.timeoutId);
200
- return pending;
201
- }
202
- #removeSessionSubscriptions(sessionId) {
203
- for (const [key, group] of [...this.#eventGroupsByKey]) {
204
- if (group.sessionId === sessionId) {
205
- this.#eventGroupsByKey.delete(key);
206
- this.#eventGroupsBySubscription.delete(group.subscriptionId);
207
- }
208
- }
209
- for (const [key, group] of [...this.#liveGroupsByKey]) {
210
- if (group.sessionId === sessionId) {
211
- this.#liveGroupsByKey.delete(key);
212
- this.#liveGroupsBySubscription.delete(group.subscriptionId);
213
- }
214
- }
215
- }
216
- #request(request) {
217
- if (this.#closed || this.#transport.state !== "open") {
218
- return Promise.reject(new TransportError({ code: "connection_lost", message: "Kernel RPC port is closed" }));
219
- }
220
- const id = `request-${this.#nextRequestId}`;
221
- this.#nextRequestId += 1;
222
- return new Promise((resolve, reject) => {
223
- const sessionId = "sessionId" in request ? request.sessionId : undefined;
224
- const commandName = "name" in request
225
- ? request.name
226
- : "capability" in request ? request.capability : request.type;
227
- const timeoutId = globalThis.setTimeout(() => {
228
- this.#takePending(id)?.reject(new KernelRpcTimeoutError(commandName, id, this.#requestTimeoutMs));
229
- }, this.#requestTimeoutMs);
230
- this.#pending.set(id, { reject, resolve, sessionId, timeoutId });
231
- try {
232
- this.#transport.send(serializeRpcRequest({ ...request, id }));
233
- }
234
- catch (error) {
235
- const sendError = error instanceof TransportError
236
- ? error
237
- : new TransportError({ code: "connection_lost", message: "Kernel RPC send failed" });
238
- this.#takePending(id)?.reject(sendError);
239
- }
240
- });
241
- }
242
- #subscribeEvent(sessionId, eventType, listener) {
243
- const key = `${sessionId ?? "host"}:event:${eventType}`;
244
- let group = this.#eventGroupsByKey.get(key);
245
- if (group === undefined) {
246
- const subscriptionId = this.#newSubscriptionId();
247
- group = { eventType, listeners: new Set(), sessionId, subscriptionId };
248
- this.#eventGroupsByKey.set(key, group);
249
- this.#eventGroupsBySubscription.set(subscriptionId, group);
250
- const request = sessionId === undefined
251
- ? { eventType, subscriptionId, type: "event.subscribe" }
252
- : { eventType, sessionId, subscriptionId, type: "stage.event.subscribe" };
253
- void this.#request(request).catch(() => this.#dropEventGroup(key, group));
254
- }
255
- const storedListener = listener;
256
- group.listeners.add(storedListener);
257
- let active = true;
258
- return () => {
259
- if (!active)
260
- return;
261
- active = false;
262
- group?.listeners.delete(storedListener);
263
- if (group !== undefined && group.listeners.size === 0) {
264
- this.#dropEventGroup(key, group);
265
- const request = sessionId === undefined
266
- ? { subscriptionId: group.subscriptionId, type: "event.unsubscribe" }
267
- : { sessionId, subscriptionId: group.subscriptionId, type: "stage.event.unsubscribe" };
268
- void this.#request(request).catch(() => undefined);
269
- }
270
- };
271
- }
272
- #subscribeLiveQuery(sessionId, name, params, listener) {
273
- const key = `${sessionId ?? "host"}:live:${name}:${JSON.stringify(params)}`;
274
- let group = this.#liveGroupsByKey.get(key);
275
- if (group === undefined) {
276
- const subscriptionId = this.#newSubscriptionId();
277
- group = { listeners: new Set(), name, params, sessionId, subscriptionId };
278
- this.#liveGroupsByKey.set(key, group);
279
- this.#liveGroupsBySubscription.set(subscriptionId, group);
280
- const request = sessionId === undefined
281
- ? { name, params, subscriptionId, type: "live-query.subscribe" }
282
- : { name, params, sessionId, subscriptionId, type: "stage.live-query.subscribe" };
283
- void this.#request(request).catch(() => this.#dropLiveGroup(key, group));
284
- }
285
- const storedListener = listener;
286
- group.listeners.add(storedListener);
287
- let active = true;
288
- return () => {
289
- if (!active)
290
- return;
291
- active = false;
292
- group?.listeners.delete(storedListener);
293
- if (group !== undefined && group.listeners.size === 0) {
294
- this.#dropLiveGroup(key, group);
295
- const request = sessionId === undefined
296
- ? { subscriptionId: group.subscriptionId, type: "live-query.unsubscribe" }
297
- : { sessionId, subscriptionId: group.subscriptionId, type: "stage.live-query.unsubscribe" };
298
- void this.#request(request).catch(() => undefined);
299
- }
300
- };
301
- }
302
- #dropEventGroup(key, group) {
303
- if (this.#eventGroupsByKey.get(key) === group)
304
- this.#eventGroupsByKey.delete(key);
305
- this.#eventGroupsBySubscription.delete(group.subscriptionId);
306
- }
307
- #dropLiveGroup(key, group) {
308
- if (this.#liveGroupsByKey.get(key) === group)
309
- this.#liveGroupsByKey.delete(key);
310
- this.#liveGroupsBySubscription.delete(group.subscriptionId);
311
- }
312
- #newSubscriptionId() {
313
- const id = `subscription-${this.#nextSubscriptionId}`;
314
- this.#nextSubscriptionId += 1;
315
- return id;
316
- }
317
- }
318
- class BoundStageRpcSession {
319
- #client;
320
- #sessionId;
321
- #closed = false;
322
- constructor(client, sessionId) {
323
- this.#client = client;
324
- this.#sessionId = sessionId;
325
- }
326
- close() {
327
- if (this.#closed)
328
- return;
329
- this.#closed = true;
330
- this.#client.closeStageSession(this.#sessionId);
331
- }
332
- invokeCapability(capability, payload) {
333
- this.#assertOpen();
334
- return this.#client.invokeStageCapability(this.#sessionId, capability, payload);
335
- }
336
- liveQuery(name, params, listener) {
337
- this.#assertOpen();
338
- return this.#client.liveQueryStage(this.#sessionId, name, params, listener);
339
- }
340
- publish(type, payload) {
341
- this.#assertOpen();
342
- return this.#client.publishStage(this.#sessionId, type, payload);
343
- }
344
- query(name, params) {
345
- this.#assertOpen();
346
- return this.#client.queryStage(this.#sessionId, name, params);
347
- }
348
- subscribe(type, listener) {
349
- this.#assertOpen();
350
- return this.#client.subscribeStage(this.#sessionId, type, listener);
351
- }
352
- #assertOpen() {
353
- if (this.#closed)
354
- throw new TransportError({ code: "connection_lost", message: "Stage RPC session is closed" });
355
- }
356
- }
357
- function jsonValue(value, label) {
358
- if (isJsonValue(value))
359
- return value;
360
- throw new DomainError({ code: "validation_failed", message: `${label} must be JSON-serializable` });
361
- }
362
- function isRecord(value) {
363
- return typeof value === "object" && value !== null && !Array.isArray(value);
364
- }
365
- //# sourceMappingURL=message-port-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-port-client.js","sourceRoot":"","sources":["../src/message-port-client.ts"],"names":[],"mappings":"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"}