@econ-v1/rpc 0.0.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.d.ts +26 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +57 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/message-port-client.d.ts +35 -0
- package/dist/message-port-client.d.ts.map +1 -0
- package/dist/message-port-client.js +365 -0
- package/dist/message-port-client.js.map +1 -0
- package/dist/protocol.d.ts +113 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +295 -0
- package/dist/protocol.js.map +1 -0
- package/dist/stage-context.d.ts +32 -0
- package/dist/stage-context.d.ts.map +1 -0
- package/dist/stage-context.js +2 -0
- package/dist/stage-context.js.map +1 -0
- package/dist/transport.d.ts +9 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +2 -0
- package/dist/transport.js.map +1 -0
- package/package.json +58 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DomainEvent, KernelEventByType, KernelEventPayload, KernelEventType, QueryDiff, QueryName } from "@econ-v1/domain";
|
|
2
|
+
export type Unsubscribe = () => void;
|
|
3
|
+
export interface PreparedStage {
|
|
4
|
+
readonly appName: string;
|
|
5
|
+
readonly entryUrl: string;
|
|
6
|
+
readonly manifestSha256: string;
|
|
7
|
+
readonly version: string;
|
|
8
|
+
}
|
|
9
|
+
export interface KernelRpcClient {
|
|
10
|
+
command<T>(name: string, payload: unknown): Promise<T>;
|
|
11
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: QueryDiff<T>) => void): Unsubscribe;
|
|
12
|
+
openStageSession(appName: string, manifestSha256: string): Promise<StageRpcSession>;
|
|
13
|
+
prepareStage(appName: string): Promise<PreparedStage>;
|
|
14
|
+
query<T>(name: QueryName, params: unknown): Promise<T>;
|
|
15
|
+
subscribe<T extends KernelEventType>(type: T, listener: (event: KernelEventByType<T>) => void): Unsubscribe;
|
|
16
|
+
}
|
|
17
|
+
export interface StageRpcSession {
|
|
18
|
+
close(): void;
|
|
19
|
+
invokeCapability<T>(capability: string, payload: unknown): Promise<T>;
|
|
20
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: QueryDiff<T>) => void): Unsubscribe;
|
|
21
|
+
publish<T extends KernelEventType>(type: T, payload: KernelEventPayload<T>): Promise<void>;
|
|
22
|
+
query<T>(name: QueryName, params: unknown): Promise<T>;
|
|
23
|
+
subscribe<T extends KernelEventType>(type: T, listener: (event: KernelEventByType<T>) => void): Unsubscribe;
|
|
24
|
+
}
|
|
25
|
+
export type { DomainEvent };
|
|
26
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;IACpG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACpF,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;CAC7G;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,IAAI,CAAC;IACd,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;IACpG,OAAO,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;CAC7G;AAED,YAAY,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":""}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ClientError, type JsonObject, type JsonValue, type SerializableClientError } from "@econ-v1/domain";
|
|
2
|
+
export declare function serializeClientError(error: ClientError): SerializableClientError;
|
|
3
|
+
export declare function deserializeClientError(value: unknown): ClientError;
|
|
4
|
+
export declare function isSerializableClientError(value: unknown): value is SerializableClientError;
|
|
5
|
+
export declare function isJsonValue(value: unknown): value is JsonValue;
|
|
6
|
+
export declare function isJsonObject(value: unknown): value is JsonObject;
|
|
7
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,SAAS,EAEd,KAAK,uBAAuB,EAK7B,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,uBAAuB,CAEhF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAWlE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAiB1F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAK9D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { KernelRpcClient, PreparedStage, StageRpcSession, Unsubscribe, } from "./client.js";
|
|
2
|
+
export { DOMAIN_ERROR_CODES, DomainError, SYNC_ERROR_CODES, SyncError, TRANSPORT_ERROR_CODES, TransportError, } from "@econ-v1/domain";
|
|
3
|
+
export type { ClientError, DomainEvent, DomainErrorCode, KernelEventByType, KernelEventPayload, KernelEventType, OutboxIntent, QueryDiff, QueryName, SerializableClientError, SyncErrorCode, TransportState, TransportErrorCode, } from "@econ-v1/domain";
|
|
4
|
+
export type { EncryptedStorageDiagnostic, MediaPreferencesPort, StageCatalogEntry, StorageRecoveryCode, StorageRecoveryState, ThemeEnvironmentPort, ThemePreference, } from "@econ-v1/ports";
|
|
5
|
+
export { deserializeClientError, isJsonValue, isSerializableClientError, serializeClientError, } from "./errors.js";
|
|
6
|
+
export { KernelRpcTimeoutError, MessagePortKernelRpcClient } from "./message-port-client.js";
|
|
7
|
+
export type { MessagePortKernelRpcClientOptions } from "./message-port-client.js";
|
|
8
|
+
export type { RpcEvent, RpcRequest, RpcResponse } from "./protocol.js";
|
|
9
|
+
export { deserializeRpcEvent, deserializeRpcRequest, deserializeRpcResponse, serializeRpcEvent, serializeRpcRequest, serializeRpcResponse, } from "./protocol.js";
|
|
10
|
+
export type { MountedStage, StageContext, StageModule } from "./stage-context.js";
|
|
11
|
+
export type { RpcTransport, RpcTransportState } from "./transport.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,WAAW,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC7F,YAAY,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClF,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
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 { deserializeRpcEvent, deserializeRpcRequest, deserializeRpcResponse, serializeRpcEvent, serializeRpcRequest, serializeRpcResponse, } from "./protocol.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AAyBzB,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAG7F,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type KernelEventByType, type KernelEventPayload, type KernelEventType, type QueryDiff, type QueryName } from "@econ-v1/domain";
|
|
2
|
+
import type { KernelRpcClient, PreparedStage, StageRpcSession, Unsubscribe } from "./client.js";
|
|
3
|
+
import type { RpcTransport } from "./transport.js";
|
|
4
|
+
export interface MessagePortKernelRpcClientOptions {
|
|
5
|
+
readonly now?: () => string;
|
|
6
|
+
readonly requestTimeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A single kernel RPC request exceeded its local response deadline. This is deliberately
|
|
10
|
+
* distinct from connection loss: the transport remains usable and callers may retry.
|
|
11
|
+
*/
|
|
12
|
+
export declare class KernelRpcTimeoutError extends Error {
|
|
13
|
+
readonly commandName: string;
|
|
14
|
+
readonly correlationId: string;
|
|
15
|
+
readonly timeoutMs: number;
|
|
16
|
+
constructor(commandName: string, correlationId: string, timeoutMs: number);
|
|
17
|
+
}
|
|
18
|
+
export declare class MessagePortKernelRpcClient implements KernelRpcClient {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(transport: RpcTransport, options?: MessagePortKernelRpcClientOptions);
|
|
21
|
+
close(): void;
|
|
22
|
+
command<T>(name: string, payload: unknown): Promise<T>;
|
|
23
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: QueryDiff<T>) => void): Unsubscribe;
|
|
24
|
+
openStageSession(appName: string, manifestSha256: string): Promise<StageRpcSession>;
|
|
25
|
+
prepareStage(appName: string): Promise<PreparedStage>;
|
|
26
|
+
query<T>(name: QueryName, params: unknown): Promise<T>;
|
|
27
|
+
subscribe<T extends KernelEventType>(type: T, listener: (event: KernelEventByType<T>) => void): Unsubscribe;
|
|
28
|
+
closeStageSession(sessionId: string): void;
|
|
29
|
+
invokeStageCapability<T>(sessionId: string, capability: string, payload: unknown): Promise<T>;
|
|
30
|
+
liveQueryStage<T>(sessionId: string, name: QueryName, params: unknown, listener: (diff: QueryDiff<T>) => void): Unsubscribe;
|
|
31
|
+
publishStage<T extends KernelEventType>(sessionId: string, type: T, payload: KernelEventPayload<T>): Promise<void>;
|
|
32
|
+
queryStage<T>(sessionId: string, name: QueryName, params: unknown): Promise<T>;
|
|
33
|
+
subscribeStage<T extends KernelEventType>(sessionId: string, type: T, listener: (event: KernelEventByType<T>) => void): Unsubscribe;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=message-port-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-port-client.d.ts","sourceRoot":"","sources":["../src/message-port-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA8BnD,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAO1E;AAMD,qBAAa,0BAA2B,YAAW,eAAe;;gBAepD,SAAS,EAAE,YAAY,EAAE,OAAO,GAAE,iCAAsC;IAQpF,KAAK,IAAI,IAAI;IAMP,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW;IAI7F,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQnF,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAmBrD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,SAAS,CAAC,CAAC,SAAS,eAAe,EACjC,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAC9C,WAAW;IAId,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAW1C,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAS7F,cAAc,CAAC,CAAC,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,WAAW;IAId,YAAY,CAAC,CAAC,SAAS,eAAe,EACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAKhB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAS9E,cAAc,CAAC,CAAC,SAAS,eAAe,EACtC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAC9C,WAAW;CA0Mf"}
|
|
@@ -0,0 +1,365 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-port-client.js","sourceRoot":"","sources":["../src/message-port-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { type ClientError, type DomainEvent, type JsonValue, type QueryDiff, type QueryName } from "@econ-v1/domain";
|
|
2
|
+
export type RpcRequest = {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly payload: JsonValue;
|
|
6
|
+
readonly type: "command";
|
|
7
|
+
} | {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
readonly name: QueryName;
|
|
10
|
+
readonly params: JsonValue;
|
|
11
|
+
readonly type: "query";
|
|
12
|
+
} | {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly name: QueryName;
|
|
15
|
+
readonly params: JsonValue;
|
|
16
|
+
readonly subscriptionId: string;
|
|
17
|
+
readonly type: "live-query.subscribe";
|
|
18
|
+
} | {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly subscriptionId: string;
|
|
21
|
+
readonly type: "live-query.unsubscribe";
|
|
22
|
+
} | {
|
|
23
|
+
readonly eventType: DomainEvent["type"];
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly subscriptionId: string;
|
|
26
|
+
readonly type: "event.subscribe";
|
|
27
|
+
} | {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly subscriptionId: string;
|
|
30
|
+
readonly type: "event.unsubscribe";
|
|
31
|
+
} | {
|
|
32
|
+
readonly event: DomainEvent;
|
|
33
|
+
readonly id: string;
|
|
34
|
+
readonly type: "event.publish";
|
|
35
|
+
} | {
|
|
36
|
+
readonly appName: string;
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly type: "stage.prepare";
|
|
39
|
+
} | {
|
|
40
|
+
readonly appName: string;
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly manifestSha256: string;
|
|
43
|
+
readonly type: "stage.open-session";
|
|
44
|
+
} | {
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly name: QueryName;
|
|
47
|
+
readonly params: JsonValue;
|
|
48
|
+
readonly sessionId: string;
|
|
49
|
+
readonly type: "stage.query";
|
|
50
|
+
} | {
|
|
51
|
+
readonly id: string;
|
|
52
|
+
readonly name: QueryName;
|
|
53
|
+
readonly params: JsonValue;
|
|
54
|
+
readonly sessionId: string;
|
|
55
|
+
readonly subscriptionId: string;
|
|
56
|
+
readonly type: "stage.live-query.subscribe";
|
|
57
|
+
} | {
|
|
58
|
+
readonly id: string;
|
|
59
|
+
readonly sessionId: string;
|
|
60
|
+
readonly subscriptionId: string;
|
|
61
|
+
readonly type: "stage.live-query.unsubscribe";
|
|
62
|
+
} | {
|
|
63
|
+
readonly eventType: DomainEvent["type"];
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly sessionId: string;
|
|
66
|
+
readonly subscriptionId: string;
|
|
67
|
+
readonly type: "stage.event.subscribe";
|
|
68
|
+
} | {
|
|
69
|
+
readonly id: string;
|
|
70
|
+
readonly sessionId: string;
|
|
71
|
+
readonly subscriptionId: string;
|
|
72
|
+
readonly type: "stage.event.unsubscribe";
|
|
73
|
+
} | {
|
|
74
|
+
readonly event: DomainEvent;
|
|
75
|
+
readonly id: string;
|
|
76
|
+
readonly sessionId: string;
|
|
77
|
+
readonly type: "stage.event.publish";
|
|
78
|
+
} | {
|
|
79
|
+
readonly capability: string;
|
|
80
|
+
readonly id: string;
|
|
81
|
+
readonly payload: JsonValue;
|
|
82
|
+
readonly sessionId: string;
|
|
83
|
+
readonly type: "stage.capability.invoke";
|
|
84
|
+
} | {
|
|
85
|
+
readonly id: string;
|
|
86
|
+
readonly sessionId: string;
|
|
87
|
+
readonly type: "stage.close-session";
|
|
88
|
+
};
|
|
89
|
+
export type RpcResponse = {
|
|
90
|
+
readonly id: string;
|
|
91
|
+
readonly ok: true;
|
|
92
|
+
readonly value: JsonValue;
|
|
93
|
+
} | {
|
|
94
|
+
readonly error: ClientError;
|
|
95
|
+
readonly id: string;
|
|
96
|
+
readonly ok: false;
|
|
97
|
+
};
|
|
98
|
+
export type RpcEvent = {
|
|
99
|
+
readonly diff: QueryDiff<JsonValue>;
|
|
100
|
+
readonly subscriptionId: string;
|
|
101
|
+
readonly type: "live-query.changed";
|
|
102
|
+
} | {
|
|
103
|
+
readonly event: DomainEvent;
|
|
104
|
+
readonly subscriptionId: string;
|
|
105
|
+
readonly type: "kernel.event";
|
|
106
|
+
};
|
|
107
|
+
export declare function serializeRpcRequest(request: RpcRequest): string;
|
|
108
|
+
export declare function deserializeRpcRequest(serialized: string): RpcRequest;
|
|
109
|
+
export declare function serializeRpcResponse(response: RpcResponse): string;
|
|
110
|
+
export declare function deserializeRpcResponse(serialized: string): RpcResponse;
|
|
111
|
+
export declare function serializeRpcEvent(event: RpcEvent): string;
|
|
112
|
+
export declare function deserializeRpcEvent(serialized: string): RpcEvent;
|
|
113
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAEhB,KAAK,SAAS,EAId,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAC;AASzB,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACrG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACrG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GACrJ;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAA;CAAE,GACjG;IAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GACnI;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GACjF;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GACvH;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GACvI;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAA;CAAE,GACvL;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAA;CAAE,GACnI;IAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACrK;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;CAAE,GAC9H;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAA;CAAE,GACtH;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;CAAE,GACvJ;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAE9F,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAC7G;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAEpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAmC/D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAyBpE;AAQD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAIlE;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAMtE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAIzD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAMhE"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { isKernelEventType, isQueryName, } from "@econ-v1/domain";
|
|
2
|
+
import { deserializeClientError, isJsonObject, isSerializableClientError, serializeClientError, } from "./errors.js";
|
|
3
|
+
export function serializeRpcRequest(request) {
|
|
4
|
+
switch (request.type) {
|
|
5
|
+
case "command":
|
|
6
|
+
return stringify({ id: request.id, name: request.name, payload: request.payload, type: request.type });
|
|
7
|
+
case "query":
|
|
8
|
+
return stringify({ id: request.id, name: request.name, params: request.params, type: request.type });
|
|
9
|
+
case "live-query.subscribe":
|
|
10
|
+
return stringify({ id: request.id, name: request.name, params: request.params, subscriptionId: request.subscriptionId, type: request.type });
|
|
11
|
+
case "live-query.unsubscribe":
|
|
12
|
+
case "event.unsubscribe":
|
|
13
|
+
return stringify({ id: request.id, subscriptionId: request.subscriptionId, type: request.type });
|
|
14
|
+
case "event.subscribe":
|
|
15
|
+
return stringify({ eventType: request.eventType, id: request.id, subscriptionId: request.subscriptionId, type: request.type });
|
|
16
|
+
case "event.publish":
|
|
17
|
+
return stringify({ event: projectDomainEvent(request.event), id: request.id, type: request.type });
|
|
18
|
+
case "stage.prepare":
|
|
19
|
+
return stringify({ appName: request.appName, id: request.id, type: request.type });
|
|
20
|
+
case "stage.open-session":
|
|
21
|
+
return stringify({ appName: request.appName, id: request.id, manifestSha256: request.manifestSha256, type: request.type });
|
|
22
|
+
case "stage.query":
|
|
23
|
+
return stringify({ id: request.id, name: request.name, params: request.params, sessionId: request.sessionId, type: request.type });
|
|
24
|
+
case "stage.live-query.subscribe":
|
|
25
|
+
return stringify({ id: request.id, name: request.name, params: request.params, sessionId: request.sessionId, subscriptionId: request.subscriptionId, type: request.type });
|
|
26
|
+
case "stage.live-query.unsubscribe":
|
|
27
|
+
case "stage.event.unsubscribe":
|
|
28
|
+
return stringify({ id: request.id, sessionId: request.sessionId, subscriptionId: request.subscriptionId, type: request.type });
|
|
29
|
+
case "stage.event.subscribe":
|
|
30
|
+
return stringify({ eventType: request.eventType, id: request.id, sessionId: request.sessionId, subscriptionId: request.subscriptionId, type: request.type });
|
|
31
|
+
case "stage.event.publish":
|
|
32
|
+
return stringify({ event: projectDomainEvent(request.event), id: request.id, sessionId: request.sessionId, type: request.type });
|
|
33
|
+
case "stage.capability.invoke":
|
|
34
|
+
return stringify({ capability: request.capability, id: request.id, payload: request.payload, sessionId: request.sessionId, type: request.type });
|
|
35
|
+
case "stage.close-session":
|
|
36
|
+
return stringify({ id: request.id, sessionId: request.sessionId, type: request.type });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function deserializeRpcRequest(serialized) {
|
|
40
|
+
const value = parseRecord(serialized);
|
|
41
|
+
const type = stringField(value, "type");
|
|
42
|
+
const id = stringField(value, "id");
|
|
43
|
+
switch (type) {
|
|
44
|
+
case "command": return { id, name: versionedNameField(value, "name"), payload: jsonField(value, "payload"), type };
|
|
45
|
+
case "query": return { id, name: queryNameField(value), params: jsonField(value, "params"), type };
|
|
46
|
+
case "live-query.subscribe": return { id, name: queryNameField(value), params: jsonField(value, "params"), subscriptionId: stringField(value, "subscriptionId"), type };
|
|
47
|
+
case "live-query.unsubscribe": return { id, subscriptionId: stringField(value, "subscriptionId"), type };
|
|
48
|
+
case "event.subscribe": return { eventType: eventTypeField(value), id, subscriptionId: stringField(value, "subscriptionId"), type };
|
|
49
|
+
case "event.unsubscribe": return { id, subscriptionId: stringField(value, "subscriptionId"), type };
|
|
50
|
+
case "event.publish": return { event: domainEventField(value), id, type };
|
|
51
|
+
case "stage.prepare": return { appName: stringField(value, "appName"), id, type };
|
|
52
|
+
case "stage.open-session": return { appName: stringField(value, "appName"), id, manifestSha256: stringField(value, "manifestSha256"), type };
|
|
53
|
+
case "stage.query": return { id, name: queryNameField(value), params: jsonField(value, "params"), sessionId: stringField(value, "sessionId"), type };
|
|
54
|
+
case "stage.live-query.subscribe": return { id, name: queryNameField(value), params: jsonField(value, "params"), sessionId: stringField(value, "sessionId"), subscriptionId: stringField(value, "subscriptionId"), type };
|
|
55
|
+
case "stage.live-query.unsubscribe": return { id, sessionId: stringField(value, "sessionId"), subscriptionId: stringField(value, "subscriptionId"), type };
|
|
56
|
+
case "stage.event.subscribe": return { eventType: eventTypeField(value), id, sessionId: stringField(value, "sessionId"), subscriptionId: stringField(value, "subscriptionId"), type };
|
|
57
|
+
case "stage.event.unsubscribe": return { id, sessionId: stringField(value, "sessionId"), subscriptionId: stringField(value, "subscriptionId"), type };
|
|
58
|
+
case "stage.event.publish": return { event: domainEventField(value), id, sessionId: stringField(value, "sessionId"), type };
|
|
59
|
+
case "stage.capability.invoke": return { capability: stringField(value, "capability"), id, payload: jsonField(value, "payload"), sessionId: stringField(value, "sessionId"), type };
|
|
60
|
+
case "stage.close-session": return { id, sessionId: stringField(value, "sessionId"), type };
|
|
61
|
+
default: throw new TypeError("Unknown RPC request type");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function versionedNameField(value, field) {
|
|
65
|
+
const name = stringField(value, field);
|
|
66
|
+
if (!/^[-a-z0-9.]+\.v[1-9][0-9]*$/u.test(name))
|
|
67
|
+
throw new TypeError(`Expected ${field} to be versioned`);
|
|
68
|
+
return name;
|
|
69
|
+
}
|
|
70
|
+
export function serializeRpcResponse(response) {
|
|
71
|
+
return response.ok
|
|
72
|
+
? stringify({ id: response.id, ok: true, value: response.value })
|
|
73
|
+
: stringify({ error: serializeClientError(response.error), id: response.id, ok: false });
|
|
74
|
+
}
|
|
75
|
+
export function deserializeRpcResponse(serialized) {
|
|
76
|
+
const value = parseRecord(serialized);
|
|
77
|
+
const id = stringField(value, "id");
|
|
78
|
+
if (value.ok === true)
|
|
79
|
+
return { id, ok: true, value: jsonField(value, "value") };
|
|
80
|
+
if (value.ok === false && isSerializableClientError(value.error))
|
|
81
|
+
return { error: deserializeClientError(value.error), id, ok: false };
|
|
82
|
+
throw new TypeError("Invalid RPC response");
|
|
83
|
+
}
|
|
84
|
+
export function serializeRpcEvent(event) {
|
|
85
|
+
return event.type === "live-query.changed"
|
|
86
|
+
? stringify({ diff: projectQueryDiff(event.diff), subscriptionId: event.subscriptionId, type: event.type })
|
|
87
|
+
: stringify({ event: projectDomainEvent(event.event), subscriptionId: event.subscriptionId, type: event.type });
|
|
88
|
+
}
|
|
89
|
+
export function deserializeRpcEvent(serialized) {
|
|
90
|
+
const value = parseRecord(serialized);
|
|
91
|
+
const subscriptionId = stringField(value, "subscriptionId");
|
|
92
|
+
if (value.type === "live-query.changed")
|
|
93
|
+
return { diff: queryDiffField(value), subscriptionId, type: value.type };
|
|
94
|
+
if (value.type === "kernel.event")
|
|
95
|
+
return { event: domainEventField(value), subscriptionId, type: value.type };
|
|
96
|
+
throw new TypeError("Unknown RPC event type");
|
|
97
|
+
}
|
|
98
|
+
function stringify(value) {
|
|
99
|
+
return JSON.stringify(value);
|
|
100
|
+
}
|
|
101
|
+
function parseRecord(serialized) {
|
|
102
|
+
const value = JSON.parse(serialized);
|
|
103
|
+
if (!isJsonObject(value))
|
|
104
|
+
throw new TypeError("Expected an RPC object");
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
function stringField(value, field) {
|
|
108
|
+
const candidate = value[field];
|
|
109
|
+
if (typeof candidate !== "string")
|
|
110
|
+
throw new TypeError(`Expected ${field} to be a string`);
|
|
111
|
+
return candidate;
|
|
112
|
+
}
|
|
113
|
+
function jsonField(value, field) {
|
|
114
|
+
const candidate = value[field];
|
|
115
|
+
if (candidate === undefined)
|
|
116
|
+
throw new TypeError(`Expected ${field}`);
|
|
117
|
+
return candidate;
|
|
118
|
+
}
|
|
119
|
+
function queryNameField(value) {
|
|
120
|
+
const name = stringField(value, "name");
|
|
121
|
+
if (!isQueryName(name))
|
|
122
|
+
throw new TypeError("Expected a versioned query name");
|
|
123
|
+
return name;
|
|
124
|
+
}
|
|
125
|
+
function eventTypeField(value) {
|
|
126
|
+
const type = stringField(value, "eventType");
|
|
127
|
+
if (!isKernelEventType(type))
|
|
128
|
+
throw new TypeError("Expected a known domain event type");
|
|
129
|
+
return type;
|
|
130
|
+
}
|
|
131
|
+
function domainEventField(value) {
|
|
132
|
+
const event = objectField(value, "event", "Expected a domain event");
|
|
133
|
+
const occurredAt = timestampField(event, "occurredAt");
|
|
134
|
+
const type = eventTypeField({ eventType: stringField(event, "type") });
|
|
135
|
+
switch (type) {
|
|
136
|
+
case "transport.state-changed":
|
|
137
|
+
return { occurredAt, payload: transportStateChangedPayload(event), type };
|
|
138
|
+
case "stage.catalog-invalidated":
|
|
139
|
+
return { occurredAt, payload: stageCatalogInvalidatedPayload(event), type };
|
|
140
|
+
case "stage.registry-changed":
|
|
141
|
+
return { occurredAt, payload: stageRegistryChangedPayload(event), type };
|
|
142
|
+
case "query.invalidated":
|
|
143
|
+
return { occurredAt, payload: queryInvalidatedPayload(event), type };
|
|
144
|
+
case "outbox.state-changed":
|
|
145
|
+
return { occurredAt, payload: outboxStateChangedPayload(event), type };
|
|
146
|
+
case "domain.entity-changed":
|
|
147
|
+
return { occurredAt, payload: domainEntityChangedPayload(event), type };
|
|
148
|
+
case "sync.delta-applied":
|
|
149
|
+
return { occurredAt, payload: syncDeltaAppliedPayload(event), type };
|
|
150
|
+
case "client-storage.state-changed":
|
|
151
|
+
return { occurredAt, payload: clientStorageStateChangedPayload(event), type };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function clientStorageStateChangedPayload(event) {
|
|
155
|
+
const payload = objectField(event, "payload");
|
|
156
|
+
const status = stringField(payload, "status");
|
|
157
|
+
if (status !== "ready" && status !== "recovery-required" && status !== "starting") {
|
|
158
|
+
throw new TypeError("Expected a known client-storage status");
|
|
159
|
+
}
|
|
160
|
+
// `code`/`message` accompany "recovery-required" only; a wire frame that omits them for
|
|
161
|
+
// the other two states is well-formed, so they are decoded as optional rather than
|
|
162
|
+
// required-and-empty (which would erase the distinction the shell renders on).
|
|
163
|
+
const code = payload["code"];
|
|
164
|
+
const message = payload["message"];
|
|
165
|
+
if (code !== undefined && typeof code !== "string")
|
|
166
|
+
throw new TypeError("Expected code to be a string");
|
|
167
|
+
if (message !== undefined && typeof message !== "string") {
|
|
168
|
+
throw new TypeError("Expected message to be a string");
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
...(code === undefined ? {} : { code }),
|
|
172
|
+
...(message === undefined ? {} : { message }),
|
|
173
|
+
status,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function stageCatalogInvalidatedPayload(event) {
|
|
177
|
+
const payload = objectField(event, "payload");
|
|
178
|
+
return { reason: stringField(payload, "reason") };
|
|
179
|
+
}
|
|
180
|
+
function queryDiffField(value) {
|
|
181
|
+
const record = objectField(value, "diff", "Expected a query diff");
|
|
182
|
+
return {
|
|
183
|
+
added: arrayField(record, "added"),
|
|
184
|
+
deleted: arrayField(record, "deleted"),
|
|
185
|
+
revision: numberField(record, "revision"),
|
|
186
|
+
updated: arrayField(record, "updated"),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function projectDomainEvent(event) {
|
|
190
|
+
return { occurredAt: event.occurredAt, payload: event.payload, type: event.type };
|
|
191
|
+
}
|
|
192
|
+
function projectQueryDiff(diff) {
|
|
193
|
+
return { added: diff.added, deleted: diff.deleted, revision: diff.revision, updated: diff.updated };
|
|
194
|
+
}
|
|
195
|
+
function arrayField(value, field) {
|
|
196
|
+
const candidate = value[field];
|
|
197
|
+
if (!Array.isArray(candidate))
|
|
198
|
+
throw new TypeError(`Expected ${field} to be an array`);
|
|
199
|
+
return candidate;
|
|
200
|
+
}
|
|
201
|
+
function numberField(value, field) {
|
|
202
|
+
const candidate = value[field];
|
|
203
|
+
if (typeof candidate !== "number" || !Number.isFinite(candidate)) {
|
|
204
|
+
throw new TypeError(`Expected ${field} to be a finite number`);
|
|
205
|
+
}
|
|
206
|
+
return candidate;
|
|
207
|
+
}
|
|
208
|
+
function objectField(value, field, message = `Expected ${field} to be an object`) {
|
|
209
|
+
const candidate = value[field];
|
|
210
|
+
if (!isJsonObject(candidate))
|
|
211
|
+
throw new TypeError(message);
|
|
212
|
+
return candidate;
|
|
213
|
+
}
|
|
214
|
+
function stringArrayField(value, field) {
|
|
215
|
+
const candidate = value[field];
|
|
216
|
+
if (!Array.isArray(candidate) || !candidate.every((item) => typeof item === "string")) {
|
|
217
|
+
throw new TypeError(`Expected ${field} to be an array of strings`);
|
|
218
|
+
}
|
|
219
|
+
return candidate;
|
|
220
|
+
}
|
|
221
|
+
function timestampField(value, field) {
|
|
222
|
+
const candidate = stringField(value, field);
|
|
223
|
+
const timestampPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/u;
|
|
224
|
+
if (!timestampPattern.test(candidate) || !Number.isFinite(Date.parse(candidate))) {
|
|
225
|
+
throw new TypeError(`Expected ${field} to be an RFC 3339 timestamp`);
|
|
226
|
+
}
|
|
227
|
+
return candidate;
|
|
228
|
+
}
|
|
229
|
+
function transportStateChangedPayload(event) {
|
|
230
|
+
const payload = objectField(event, "payload");
|
|
231
|
+
const state = objectField(payload, "state");
|
|
232
|
+
const changedAt = timestampField(state, "changedAt");
|
|
233
|
+
const path = stringField(state, "path");
|
|
234
|
+
const status = stringField(state, "status");
|
|
235
|
+
if (status === "connected" && isConnectedTransportPath(path)) {
|
|
236
|
+
return { state: { changedAt, path, status } };
|
|
237
|
+
}
|
|
238
|
+
if (status === "offline" && path === "offline") {
|
|
239
|
+
return { state: { changedAt, path, status } };
|
|
240
|
+
}
|
|
241
|
+
throw new TypeError("Expected a valid transport state");
|
|
242
|
+
}
|
|
243
|
+
function stageRegistryChangedPayload(event) {
|
|
244
|
+
const payload = objectField(event, "payload");
|
|
245
|
+
return { appNames: stringArrayField(payload, "appNames") };
|
|
246
|
+
}
|
|
247
|
+
function queryInvalidatedPayload(event) {
|
|
248
|
+
const payload = objectField(event, "payload");
|
|
249
|
+
return { name: queryNameField(payload) };
|
|
250
|
+
}
|
|
251
|
+
function outboxStateChangedPayload(event) {
|
|
252
|
+
const payload = objectField(event, "payload");
|
|
253
|
+
const intent = objectField(payload, "intent");
|
|
254
|
+
return {
|
|
255
|
+
intent: {
|
|
256
|
+
domain: stringField(intent, "domain"),
|
|
257
|
+
id: stringField(intent, "id"),
|
|
258
|
+
idempotencyKey: stringField(intent, "idempotencyKey"),
|
|
259
|
+
payload: jsonField(intent, "payload"),
|
|
260
|
+
state: outboxIntentStateField(intent),
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function domainEntityChangedPayload(event) {
|
|
265
|
+
const payload = objectField(event, "payload");
|
|
266
|
+
return {
|
|
267
|
+
action: entityActionField(payload),
|
|
268
|
+
entityId: stringField(payload, "entityId"),
|
|
269
|
+
entityType: stringField(payload, "entityType"),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function syncDeltaAppliedPayload(event) {
|
|
273
|
+
const payload = objectField(event, "payload");
|
|
274
|
+
return {
|
|
275
|
+
cursor: stringField(payload, "cursor"),
|
|
276
|
+
domain: stringField(payload, "domain"),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function isConnectedTransportPath(value) {
|
|
280
|
+
return value === "iroh-relay" || value === "lan-direct" || value === "wan-direct";
|
|
281
|
+
}
|
|
282
|
+
function outboxIntentStateField(value) {
|
|
283
|
+
const state = stringField(value, "state");
|
|
284
|
+
if (state === "acknowledged" || state === "failed" || state === "pending" || state === "replaying") {
|
|
285
|
+
return state;
|
|
286
|
+
}
|
|
287
|
+
throw new TypeError("Expected a known outbox intent state");
|
|
288
|
+
}
|
|
289
|
+
function entityActionField(value) {
|
|
290
|
+
const action = stringField(value, "action");
|
|
291
|
+
if (action === "created" || action === "deleted" || action === "updated")
|
|
292
|
+
return action;
|
|
293
|
+
throw new TypeError("Expected a known entity action");
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { KernelEventByType, KernelEventPayload, KernelEventType, QueryDiff, QueryName } from "@econ-v1/domain";
|
|
2
|
+
import type { Unsubscribe } from "./client.js";
|
|
3
|
+
export interface MountedStage {
|
|
4
|
+
unmount(): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export type StageLoadHandler = (appName: string, slot: Element) => Promise<MountedStage>;
|
|
7
|
+
export interface StageContext {
|
|
8
|
+
readonly app: {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly version: string;
|
|
11
|
+
};
|
|
12
|
+
readonly events: {
|
|
13
|
+
publish<T extends KernelEventType>(type: T, payload: KernelEventPayload<T>): Promise<void>;
|
|
14
|
+
subscribe<T extends KernelEventType>(type: T, listener: (event: KernelEventByType<T>) => void): Unsubscribe;
|
|
15
|
+
};
|
|
16
|
+
readonly host: {
|
|
17
|
+
navigate(path: string): void;
|
|
18
|
+
readonly root: Element;
|
|
19
|
+
readonly uiApi: 1;
|
|
20
|
+
};
|
|
21
|
+
invokeCapability<T>(capability: string, payload: unknown): Promise<T>;
|
|
22
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: QueryDiff<T>) => void): Unsubscribe;
|
|
23
|
+
query<T>(name: QueryName, params: unknown): Promise<T>;
|
|
24
|
+
readonly stage: {
|
|
25
|
+
load: StageLoadHandler;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface StageModule {
|
|
29
|
+
mount(ctx: StageContext): void | Promise<void>;
|
|
30
|
+
unmount(): void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stage-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage-context.d.ts","sourceRoot":"","sources":["../src/stage-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,SAAS,EACT,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEzF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE;QACf,OAAO,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3F,SAAS,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;KAC7G,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;KACnB,CAAC;IACF,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAC;IACpG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage-context.js","sourceRoot":"","sources":["../src/stage-context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type RpcTransportState = "closed" | "open";
|
|
2
|
+
export interface RpcTransport {
|
|
3
|
+
close(): void;
|
|
4
|
+
send(message: string): void;
|
|
5
|
+
subscribe(listener: (message: string) => void): () => void;
|
|
6
|
+
subscribeClose(listener: () => void): () => void;
|
|
7
|
+
readonly state: RpcTransportState;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3D,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@econ-v1/rpc",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Typed runtime and contracts for Node client stage-to-kernel RPC",
|
|
5
|
+
"license": "MIT OR Apache-2.0",
|
|
6
|
+
"author": "Node contributors",
|
|
7
|
+
"homepage": "https://github.com/econ-v1/node",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/econ-v1/node.git",
|
|
11
|
+
"directory": "client/rpc"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/econ-v1/node/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"node-client",
|
|
18
|
+
"rpc",
|
|
19
|
+
"message-port",
|
|
20
|
+
"stage",
|
|
21
|
+
"typescript"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "rm -rf dist && tsc -b --pretty false",
|
|
28
|
+
"lint": "eslint src",
|
|
29
|
+
"prepack": "npm run build",
|
|
30
|
+
"test": "vitest run --passWithNoTests",
|
|
31
|
+
"type-check": "tsc -b --pretty false"
|
|
32
|
+
},
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.js",
|
|
37
|
+
"default": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist/**/*.d.ts",
|
|
42
|
+
"dist/**/*.d.ts.map",
|
|
43
|
+
"dist/**/*.js",
|
|
44
|
+
"dist/**/*.js.map",
|
|
45
|
+
"!dist/**/*.test.*"
|
|
46
|
+
],
|
|
47
|
+
"sideEffects": false,
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@econ-v1/domain": "0.0.0",
|
|
56
|
+
"@econ-v1/ports": "0.0.0"
|
|
57
|
+
}
|
|
58
|
+
}
|