@econ-v1/rpc 6.7.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.
- package/dist/client-device-pending-contract.d.ts +14 -0
- package/dist/client-device-pending-contract.d.ts.map +1 -0
- package/dist/client.d.ts +15 -13
- package/dist/client.d.ts.map +1 -1
- package/dist/device-boot-contract.d.ts +7 -0
- package/dist/device-boot-contract.d.ts.map +1 -0
- package/dist/device-cleanup-contract.d.ts +17 -0
- package/dist/device-cleanup-contract.d.ts.map +1 -0
- package/dist/dialog-contract.d.ts +26 -0
- package/dist/dialog-contract.d.ts.map +1 -0
- package/dist/errors.d.ts +33 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.d.ts +144 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/message-port-client.d.ts +134 -16
- package/dist/message-port-client.d.ts.map +1 -1
- package/dist/node-app-memory-contract.d.ts +10 -0
- package/dist/node-app-memory-contract.d.ts.map +1 -0
- package/dist/onboarding/discovery-contract.d.ts +61 -34
- package/dist/onboarding/discovery-contract.d.ts.map +1 -1
- package/dist/onboarding/onboarding-contract.d.ts +119 -27
- package/dist/onboarding/onboarding-contract.d.ts.map +1 -1
- package/dist/onboarding/owner-claim-contract.d.ts +50 -0
- package/dist/onboarding/owner-claim-contract.d.ts.map +1 -0
- package/dist/pairing-status-contract.d.ts +40 -0
- package/dist/pairing-status-contract.d.ts.map +1 -0
- package/dist/protocol.d.ts +50 -12
- package/dist/protocol.d.ts.map +1 -1
- package/dist/stage-context.d.ts +31 -16
- package/dist/stage-context.d.ts.map +1 -1
- package/dist/sync-cursors-contract.d.ts +6 -0
- package/dist/sync-cursors-contract.d.ts.map +1 -0
- package/dist/system-notice-contract.d.ts +70 -0
- package/dist/system-notice-contract.d.ts.map +1 -0
- package/dist/transport-contract.d.ts +11 -0
- package/dist/transport-contract.d.ts.map +1 -0
- package/dist/transport.d.ts +2 -2
- package/dist/transport.d.ts.map +1 -1
- package/dist/trust-contract.d.ts +23 -0
- package/dist/trust-contract.d.ts.map +1 -0
- package/package.json +16 -12
- package/src/client-device-pending-contract.js +6 -0
- package/src/client.js +26 -0
- package/src/device-boot-contract.js +4 -0
- package/src/device-cleanup-contract.js +9 -0
- package/src/dialog-contract.js +6 -0
- package/src/errors.js +111 -0
- package/src/index.js +194 -0
- package/src/message-port-client.js +628 -0
- package/src/node-app-memory-contract.js +10 -0
- package/src/onboarding/discovery-contract.js +83 -0
- package/src/onboarding/onboarding-contract.js +106 -0
- package/src/onboarding/owner-claim-contract.js +59 -0
- package/src/pairing-status-contract.js +36 -0
- package/src/protocol.js +758 -0
- package/src/stage-context.js +27 -0
- package/src/sync-cursors-contract.js +3 -0
- package/src/system-notice-contract.js +64 -0
- package/src/transport-contract.js +11 -0
- package/src/transport.js +6 -0
- package/src/trust-contract.js +36 -0
- package/dist/client.js +0 -2
- package/dist/client.js.map +0 -1
- package/dist/errors.js +0 -57
- package/dist/errors.js.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/message-port-client.js +0 -365
- package/dist/message-port-client.js.map +0 -1
- package/dist/onboarding/discovery-contract.js +0 -42
- package/dist/onboarding/discovery-contract.js.map +0 -1
- package/dist/onboarding/onboarding-contract.js +0 -37
- package/dist/onboarding/onboarding-contract.js.map +0 -1
- package/dist/protocol.js +0 -295
- package/dist/protocol.js.map +0 -1
- package/dist/stage-context.js +0 -2
- package/dist/stage-context.js.map +0 -1
- package/dist/transport.js +0 -2
- 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,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");
|
package/src/transport.js
ADDED
|
@@ -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
package/dist/client.js.map
DELETED
|
@@ -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
|
package/dist/errors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,WAAW,EAOX,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAEhF,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,KAAK,WAAW;YACd,OAAO,IAAI,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAClI,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CACnB,KAAsC;IAEtC,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS;QAChC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;QAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAmC,KAAa,EAAE,KAAa;IAClF,OAAQ,KAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC;AACnI,CAAC"}
|
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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"}
|