@econ-v1/rpc 7.0.42 → 7.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +10 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/message-port-client.d.ts +11 -2
- package/dist/message-port-client.d.ts.map +1 -1
- package/dist/protocol.d.ts +4 -0
- package/dist/protocol.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/client.js +8 -2
- package/src/message-port-client.js +30 -10
- package/src/protocol.js +10 -4
package/dist/client.d.ts
CHANGED
|
@@ -26,9 +26,17 @@ export type PreparedStage = {
|
|
|
26
26
|
readonly manifestSha256: string;
|
|
27
27
|
readonly version: string;
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* The wire-carried shape of a failed live-query run — just enough for a UI to draw an honest
|
|
31
|
+
* failure state. Deliberately narrower than the raw JS error the kernel caught: only a
|
|
32
|
+
* human-readable `message` crosses the port, matching what `live-query.failed` puts on the wire.
|
|
33
|
+
*/
|
|
34
|
+
export type LiveQueryFailure = {
|
|
35
|
+
readonly message: string;
|
|
36
|
+
};
|
|
29
37
|
export type KernelRpcClient = {
|
|
30
38
|
command<T>(name: string, payload: unknown): Promise<T>;
|
|
31
|
-
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void): Unsubscribe;
|
|
39
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: LiveQueryFailure) => void): Unsubscribe;
|
|
32
40
|
openStageSession(appName: string, manifestSha256: string, surfaceId?: string): Promise<StageRpcSession>;
|
|
33
41
|
prepareStage(appName: string): Promise<PreparedStage>;
|
|
34
42
|
publish<T extends KernelEventType>(type: T, payload: import("@econ-v1/domain").KernelEventPayload<T>): Promise<void>;
|
|
@@ -38,7 +46,7 @@ export type KernelRpcClient = {
|
|
|
38
46
|
export type StageRpcSession = {
|
|
39
47
|
close(): void;
|
|
40
48
|
invokeCapability<T>(capability: string, payload: unknown): Promise<T>;
|
|
41
|
-
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void): Unsubscribe;
|
|
49
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: LiveQueryFailure) => void): Unsubscribe;
|
|
42
50
|
publish<T extends KernelEventType>(type: T, payload: import("@econ-v1/domain").KernelEventPayload<T>): Promise<void>;
|
|
43
51
|
query<T>(name: QueryName, params: unknown): Promise<T>;
|
|
44
52
|
subscribe<T extends KernelEventType>(type: T, listener: (event: import("@econ-v1/domain").KernelEventByType<T>) => void): Unsubscribe;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.js"],"names":[],"mappings":"0BAEc,OAAO,iBAAiB,EAAE,WAAW;8BACrC,OAAO,iBAAiB,EAAE,eAAe;wBACzC,OAAO,iBAAiB,EAAE,SAAS;0BACnC,MAAM,IAAI;;;;;;;;;;;;;;;;;;4BAiBX;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.js"],"names":[],"mappings":"0BAEc,OAAO,iBAAiB,EAAE,WAAW;8BACrC,OAAO,iBAAiB,EAAE,eAAe;wBACzC,OAAO,iBAAiB,EAAE,SAAS;0BACnC,MAAM,IAAI;;;;;;;;;;;;;;;;;;4BAiBX;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;;+BAMnJ;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;8BAE3B;IACT,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,OAAO,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,WAAW,CAAC;IAC3K,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,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,OAAO,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAA;CACtI;8BACU;IACT,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,OAAO,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,WAAW,CAAC;IAC3K,OAAO,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,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,OAAO,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,WAAW,CAAA;CACtI"}
|
|
@@ -37,9 +37,12 @@ export class MessagePortKernelRpcClient implements KernelRpcClient {
|
|
|
37
37
|
* @param {QueryName} name
|
|
38
38
|
* @param {unknown} params
|
|
39
39
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
40
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
40
41
|
* @returns {Unsubscribe}
|
|
41
42
|
*/
|
|
42
|
-
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void
|
|
43
|
+
liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: {
|
|
44
|
+
readonly message: string;
|
|
45
|
+
}) => void): Unsubscribe;
|
|
43
46
|
/**
|
|
44
47
|
* @param {string} appName
|
|
45
48
|
* @param {string} manifestSha256
|
|
@@ -89,9 +92,12 @@ export class MessagePortKernelRpcClient implements KernelRpcClient {
|
|
|
89
92
|
* @param {QueryName} name
|
|
90
93
|
* @param {unknown} params
|
|
91
94
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
95
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
92
96
|
* @returns {Unsubscribe}
|
|
93
97
|
*/
|
|
94
|
-
liveQueryStage<T>(sessionId: string, name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void
|
|
98
|
+
liveQueryStage<T>(sessionId: string, name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: {
|
|
99
|
+
readonly message: string;
|
|
100
|
+
}) => void): Unsubscribe;
|
|
95
101
|
/**
|
|
96
102
|
* @template {KernelEventType} T
|
|
97
103
|
* @param {string} sessionId
|
|
@@ -145,6 +151,9 @@ export type EventGroup = {
|
|
|
145
151
|
readonly subscriptionId: string;
|
|
146
152
|
};
|
|
147
153
|
export type LiveQueryGroup = {
|
|
154
|
+
readonly errorListeners: Set<(error: {
|
|
155
|
+
readonly message: string;
|
|
156
|
+
}) => void>;
|
|
148
157
|
readonly listeners: Set<(diff: import("@econ-v1/domain").QueryDiff<JsonValue>) => void>;
|
|
149
158
|
readonly name: QueryName;
|
|
150
159
|
readonly params: JsonValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-port-client.d.ts","sourceRoot":"","sources":["../src/message-port-client.js"],"names":[],"mappings":"AAiDA;;;GAGG;AACH;IAQE;;;;OAIG;IACH,yBAJW,MAAM,iBACN,MAAM,aACN,MAAM,EAQhB;IAlBD,+BAA+B;IAC/B,sBADqB,MAAM,CACf;IACZ,+BAA+B;IAC/B,wBADqB,MAAM,CACb;IACd,+BAA+B;IAC/B,oBADqB,MAAM,CACjB;CAcX;AAqBD,+CAAmE;AAuCnE,oCAAoC;AACpC,mDADiB,eAAe;IA8B9B;;;OAGG;IACH,uBAHW,YAAY,YACZ,iCAAiC,EAU3C;IAED,cAIC;IAED;;;;;OAKG;IACH,QALa,CAAC,QACH,MAAM,WACN,OAAO,GACL,OAAO,CAAC,CAAC,CAAC,CAItB;IAED
|
|
1
|
+
{"version":3,"file":"message-port-client.d.ts","sourceRoot":"","sources":["../src/message-port-client.js"],"names":[],"mappings":"AAiDA;;;GAGG;AACH;IAQE;;;;OAIG;IACH,yBAJW,MAAM,iBACN,MAAM,aACN,MAAM,EAQhB;IAlBD,+BAA+B;IAC/B,sBADqB,MAAM,CACf;IACZ,+BAA+B;IAC/B,wBADqB,MAAM,CACb;IACd,+BAA+B;IAC/B,oBADqB,MAAM,CACjB;CAcX;AAqBD,+CAAmE;AAuCnE,oCAAoC;AACpC,mDADiB,eAAe;IA8B9B;;;OAGG;IACH,uBAHW,YAAY,YACZ,iCAAiC,EAU3C;IAED,cAIC;IAED;;;;;OAKG;IACH,QALa,CAAC,QACH,MAAM,WACN,OAAO,GACL,OAAO,CAAC,CAAC,CAAC,CAItB;IAED;;;;;;;OAOG;IACH,UAPa,CAAC,QACH,SAAS,UACT,OAAO,YACP,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,YACtD,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC3C,WAAW,CAIvB;IAED;;;;;OAKG;IACH,0BALW,MAAM,kBACN,MAAM,cACN,MAAM,GACJ,OAAO,CAAC,eAAe,CAAC,CAapC;IAED;;;OAGG;IACH,sBAHW,MAAM,GACJ,OAAO,CAAC,aAAa,CAAC,CA0BlC;IAED;;;;;OAKG;IACH,QAL+B,CAAC,SAAlB,eAAgB,QACnB,CAAC,WACD,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;;OAKG;IACH,MALa,CAAC,QACH,SAAS,UACT,OAAO,GACL,OAAO,CAAC,CAAC,CAAC,CAItB;IAED;;;;;OAKG;IACH,UAL+B,CAAC,SAAlB,eAAgB,QACnB,CAAC,YACD,CAAC,KAAK,EAAE,OAAO,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7D,WAAW,CAIvB;IAED,gCAAgC;IAChC,6BADY,MAAM,QAUjB;IAED;;;;;;OAMG;IACH,sBANa,CAAC,aACH,MAAM,cACN,MAAM,WACN,OAAO,GACL,OAAO,CAAC,CAAC,CAAC,CAStB;IAED;;;;;;;;OAQG;IACH,eARa,CAAC,aACH,MAAM,QACN,SAAS,UACT,OAAO,YACP,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,YACtD,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAC3C,WAAW,CAIvB;IAED;;;;;;OAMG;IACH,aAN+B,CAAC,SAAlB,eAAgB,aACnB,MAAM,QACN,CAAC,WACD,OAAO,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;;;OAMG;IACH,WANa,CAAC,aACH,MAAM,QACN,SAAS,UACT,OAAO,GACL,OAAO,CAAC,CAAC,CAAC,CAStB;IAED;;;;;;OAMG;IACH,eAN+B,CAAC,SAAlB,eAAgB,aACnB,MAAM,QACN,CAAC,YACD,CAAC,KAAK,EAAE,OAAO,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,GAC7D,WAAW,CAIvB;;CA6RF;0BA1nBa,OAAO,iBAAiB,EAAE,WAAW;wBACrC,OAAO,iBAAiB,EAAE,SAAS;8BACnC,OAAO,iBAAiB,EAAE,eAAe;wBACzC,OAAO,iBAAiB,EAAE,SAAS;8BACnC,OAAO,aAAa,EAAE,eAAe;4BACrC,OAAO,aAAa,EAAE,aAAa;8BACnC,OAAO,aAAa,EAAE,eAAe;0BACrC,OAAO,aAAa,EAAE,WAAW;yBACjC,OAAO,eAAe,EAAE,UAAU;kCAClC,UAAU,SAAS,MAAM,QAAQ,GAAG,QAAQ,SAAS,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK;2BACtG,OAAO,gBAAgB,EAAE,YAAY;6BACrC;IAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;yBACzT;IAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE;6BACvK;IAAE,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE;wCACvS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;gDACjH;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -162,6 +162,10 @@ export type RpcEvent = {
|
|
|
162
162
|
readonly diff: QueryDiff<JsonValue>;
|
|
163
163
|
readonly subscriptionId: string;
|
|
164
164
|
readonly type: "live-query.changed";
|
|
165
|
+
} | {
|
|
166
|
+
readonly message: string;
|
|
167
|
+
readonly subscriptionId: string;
|
|
168
|
+
readonly type: "live-query.failed";
|
|
165
169
|
} | {
|
|
166
170
|
readonly event: ProtocolDomainEvent;
|
|
167
171
|
readonly subscriptionId: string;
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.js"],"names":[],"mappings":"AAeA;;;GAGG;AACH,6CAHW,UAAU,GACR,MAAM,CAqClB;AACD;;;GAGG;AACH,kDAHW,MAAM,GACJ,UAAU,CA6BtB;AAYD;;;GAGG;AACH,+CAHW,WAAW,GACT,MAAM,CAMlB;AACD;;;GAGG;AACH,mDAHW,MAAM,GACJ,WAAW,CAUvB;AACD;;;GAGG;AACH,yCAHW,QAAQ,GACN,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.js"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@econ-v1/rpc",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.47",
|
|
4
4
|
"description": "Typed runtime and contracts for Node client stage-to-kernel RPC",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"author": "Node contributors",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@econ-v1/domain": "7.0.
|
|
60
|
-
"@econ-v1/ports": "7.0.
|
|
59
|
+
"@econ-v1/domain": "7.0.47",
|
|
60
|
+
"@econ-v1/ports": "7.0.47"
|
|
61
61
|
}
|
|
62
62
|
}
|
package/src/client.js
CHANGED
|
@@ -22,9 +22,15 @@
|
|
|
22
22
|
* fall back to a mutable URL.
|
|
23
23
|
* @typedef {{ readonly appName: string, readonly assetRevision?: string, readonly entryUrl: string, readonly manifestSha256: string, readonly version: string }} PreparedStage
|
|
24
24
|
*/
|
|
25
|
+
/**
|
|
26
|
+
* The wire-carried shape of a failed live-query run — just enough for a UI to draw an honest
|
|
27
|
+
* failure state. Deliberately narrower than the raw JS error the kernel caught: only a
|
|
28
|
+
* human-readable `message` crosses the port, matching what `live-query.failed` puts on the wire.
|
|
29
|
+
* @typedef {{ readonly message: string }} LiveQueryFailure
|
|
30
|
+
*/
|
|
25
31
|
/** @typedef {{
|
|
26
32
|
* command<T>(name: string, payload: unknown): Promise<T>,
|
|
27
|
-
* liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void): Unsubscribe,
|
|
33
|
+
* liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: LiveQueryFailure) => void): Unsubscribe,
|
|
28
34
|
* openStageSession(appName: string, manifestSha256: string, surfaceId?: string): Promise<StageRpcSession>,
|
|
29
35
|
* prepareStage(appName: string): Promise<PreparedStage>,
|
|
30
36
|
* publish<T extends KernelEventType>(type: T, payload: import("@econ-v1/domain").KernelEventPayload<T>): Promise<void>,
|
|
@@ -34,7 +40,7 @@
|
|
|
34
40
|
/** @typedef {{
|
|
35
41
|
* close(): void,
|
|
36
42
|
* invokeCapability<T>(capability: string, payload: unknown): Promise<T>,
|
|
37
|
-
* liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void): Unsubscribe,
|
|
43
|
+
* liveQuery<T>(name: QueryName, params: unknown, listener: (diff: import("@econ-v1/domain").QueryDiff<T>) => void, onError?: (error: LiveQueryFailure) => void): Unsubscribe,
|
|
38
44
|
* publish<T extends KernelEventType>(type: T, payload: import("@econ-v1/domain").KernelEventPayload<T>): Promise<void>,
|
|
39
45
|
* query<T>(name: QueryName, params: unknown): Promise<T>,
|
|
40
46
|
* subscribe<T extends KernelEventType>(type: T, listener: (event: import("@econ-v1/domain").KernelEventByType<T>) => void): Unsubscribe
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
/** @typedef {import("./transport.js").RpcTransport} RpcTransport */
|
|
26
26
|
/** @typedef {{ readonly reject: (error: unknown) => void, readonly resolve: (value: JsonValue) => void, readonly sessionId: string | undefined, readonly slowBarId: ReturnType<typeof globalThis.setTimeout>, readonly startedAtMs: number, readonly timeoutId: ReturnType<typeof globalThis.setTimeout>, readonly timeoutMs: number }} PendingRequest */
|
|
27
27
|
/** @typedef {{ readonly eventType: KernelEventType, readonly listeners: Set<(event: DomainEvent) => void>, readonly sessionId: string | undefined, readonly subscriptionId: string }} EventGroup */
|
|
28
|
-
/** @typedef {{ readonly listeners: Set<(diff: import("@econ-v1/domain").QueryDiff<JsonValue>) => void>, readonly name: QueryName, readonly params: JsonValue, readonly sessionId: string | undefined, readonly subscriptionId: string }} LiveQueryGroup */
|
|
28
|
+
/** @typedef {{ readonly errorListeners: Set<(error: { readonly message: string }) => void>, readonly listeners: Set<(diff: import("@econ-v1/domain").QueryDiff<JsonValue>) => void>, readonly name: QueryName, readonly params: JsonValue, readonly sessionId: string | undefined, readonly subscriptionId: string }} LiveQueryGroup */
|
|
29
29
|
/** @typedef {{ markSlow(id: string): void, settle(id: string, elapsedMs: number, answered: boolean, timeoutMs: number): void }} RpcResponsivenessObserver */
|
|
30
30
|
/** @typedef {{ readonly monotonicNow?: () => number, readonly now?: () => string, readonly observer?: RpcResponsivenessObserver, readonly requestTimeoutMs?: number }} MessagePortKernelRpcClientOptions */
|
|
31
31
|
|
|
@@ -196,10 +196,11 @@ export class MessagePortKernelRpcClient {
|
|
|
196
196
|
* @param {QueryName} name
|
|
197
197
|
* @param {unknown} params
|
|
198
198
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
199
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
199
200
|
* @returns {Unsubscribe}
|
|
200
201
|
*/
|
|
201
|
-
liveQuery(name, params, listener) {
|
|
202
|
-
return this.#subscribeLiveQuery(undefined, name, jsonValue(params, "live-query params"), listener);
|
|
202
|
+
liveQuery(name, params, listener, onError) {
|
|
203
|
+
return this.#subscribeLiveQuery(undefined, name, jsonValue(params, "live-query params"), listener, onError);
|
|
203
204
|
}
|
|
204
205
|
|
|
205
206
|
/**
|
|
@@ -316,10 +317,11 @@ export class MessagePortKernelRpcClient {
|
|
|
316
317
|
* @param {QueryName} name
|
|
317
318
|
* @param {unknown} params
|
|
318
319
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
320
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
319
321
|
* @returns {Unsubscribe}
|
|
320
322
|
*/
|
|
321
|
-
liveQueryStage(sessionId, name, params, listener) {
|
|
322
|
-
return this.#subscribeLiveQuery(sessionId, name, jsonValue(params, "live-query params"), listener);
|
|
323
|
+
liveQueryStage(sessionId, name, params, listener, onError) {
|
|
324
|
+
return this.#subscribeLiveQuery(sessionId, name, jsonValue(params, "live-query params"), listener, onError);
|
|
323
325
|
}
|
|
324
326
|
|
|
325
327
|
/**
|
|
@@ -420,6 +422,13 @@ export class MessagePortKernelRpcClient {
|
|
|
420
422
|
}
|
|
421
423
|
return;
|
|
422
424
|
}
|
|
425
|
+
if (event.type === "live-query.failed") {
|
|
426
|
+
const group = this.#liveGroupsBySubscription.get(event.subscriptionId);
|
|
427
|
+
if (group === undefined) return;
|
|
428
|
+
const failureMessage = event.message;
|
|
429
|
+
for (const listener of [...group.errorListeners]) this.#notify(() => listener({ message: failureMessage }));
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
423
432
|
const group = this.#liveGroupsBySubscription.get(event.subscriptionId);
|
|
424
433
|
if (group === undefined) return;
|
|
425
434
|
for (const listener of [...group.listeners]) this.#notify(() => listener(event.diff));
|
|
@@ -568,31 +577,41 @@ export class MessagePortKernelRpcClient {
|
|
|
568
577
|
* @param {QueryName} name
|
|
569
578
|
* @param {JsonValue} params
|
|
570
579
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
580
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
571
581
|
* @returns {Unsubscribe}
|
|
572
582
|
*/
|
|
573
|
-
#subscribeLiveQuery(sessionId, name, params, listener) {
|
|
583
|
+
#subscribeLiveQuery(sessionId, name, params, listener, onError) {
|
|
574
584
|
const key = `${sessionId ?? "host"}:live:${name}:${JSON.stringify(params)}`;
|
|
575
585
|
let group = this.#liveGroupsByKey.get(key);
|
|
576
586
|
if (group === undefined) {
|
|
577
587
|
const subscriptionId = this.#newSubscriptionId();
|
|
578
|
-
group = { listeners: new Set(), name, params, sessionId, subscriptionId };
|
|
588
|
+
group = { errorListeners: new Set(), listeners: new Set(), name, params, sessionId, subscriptionId };
|
|
579
589
|
this.#liveGroupsByKey.set(key, group);
|
|
580
590
|
this.#liveGroupsBySubscription.set(subscriptionId, group);
|
|
581
591
|
const request = sessionId === undefined
|
|
582
592
|
? /** @type {const} */ ({ name, params, subscriptionId, type: "live-query.subscribe" })
|
|
583
593
|
: /** @type {const} */ ({ name, params, sessionId, subscriptionId, type: "stage.live-query.subscribe" });
|
|
584
594
|
void this.#request(request).catch((error) => {
|
|
585
|
-
|
|
595
|
+
const rejectedGroup = /** @type {LiveQueryGroup} */ (group);
|
|
596
|
+
this.#dropLiveGroup(key, rejectedGroup);
|
|
586
597
|
warnSubscriptionRejected("live-query", name, sessionId, error);
|
|
598
|
+
// A rejected (or timed-out) subscribe request never produces a "live-query.failed"
|
|
599
|
+
// event — the kernel has nothing to key it against, since no subscription was ever
|
|
600
|
+
// established. Without this, a caller stuck on #request's 30s timeout would sit in
|
|
601
|
+
// its loading state forever: the group is dropped above, but nobody is told why.
|
|
602
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
603
|
+
for (const listener of [...rejectedGroup.errorListeners]) this.#notify(() => listener({ message }));
|
|
587
604
|
});
|
|
588
605
|
}
|
|
589
606
|
const storedListener = /** @type {(diff: import("@econ-v1/domain").QueryDiff<JsonValue>) => void} */ (listener);
|
|
590
607
|
group.listeners.add(storedListener);
|
|
608
|
+
if (onError !== undefined) group.errorListeners.add(onError);
|
|
591
609
|
let active = true;
|
|
592
610
|
return () => {
|
|
593
611
|
if (!active) return;
|
|
594
612
|
active = false;
|
|
595
613
|
group?.listeners.delete(storedListener);
|
|
614
|
+
if (onError !== undefined) group?.errorListeners.delete(onError);
|
|
596
615
|
if (group !== undefined && group.listeners.size === 0) {
|
|
597
616
|
this.#dropLiveGroup(key, group);
|
|
598
617
|
const request = sessionId === undefined
|
|
@@ -668,11 +687,12 @@ class BoundStageRpcSession {
|
|
|
668
687
|
* @param {QueryName} name
|
|
669
688
|
* @param {unknown} params
|
|
670
689
|
* @param {(diff: import("@econ-v1/domain").QueryDiff<T>) => void} listener
|
|
690
|
+
* @param {(error: { readonly message: string }) => void} [onError]
|
|
671
691
|
* @returns {Unsubscribe}
|
|
672
692
|
*/
|
|
673
|
-
liveQuery(name, params, listener) {
|
|
693
|
+
liveQuery(name, params, listener, onError) {
|
|
674
694
|
this.#assertOpen();
|
|
675
|
-
return this.#client.liveQueryStage(this.#sessionId, name, params, listener);
|
|
695
|
+
return this.#client.liveQueryStage(this.#sessionId, name, params, listener, onError);
|
|
676
696
|
}
|
|
677
697
|
|
|
678
698
|
/**
|
package/src/protocol.js
CHANGED
|
@@ -123,9 +123,11 @@ export function deserializeRpcResponse(serialized) {
|
|
|
123
123
|
* @returns {string}
|
|
124
124
|
*/
|
|
125
125
|
export function serializeRpcEvent(event) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
if (event.type === "live-query.changed")
|
|
127
|
+
return stringify({ diff: projectQueryDiff(event.diff), subscriptionId: event.subscriptionId, type: event.type });
|
|
128
|
+
if (event.type === "live-query.failed")
|
|
129
|
+
return stringify({ message: event.message, subscriptionId: event.subscriptionId, type: event.type });
|
|
130
|
+
return stringify({ event: projectDomainEvent(event.event), subscriptionId: event.subscriptionId, type: event.type });
|
|
129
131
|
}
|
|
130
132
|
/**
|
|
131
133
|
* @param {string} serialized
|
|
@@ -136,6 +138,8 @@ export function deserializeRpcEvent(serialized) {
|
|
|
136
138
|
const subscriptionId = stringField(value, "subscriptionId");
|
|
137
139
|
if (value.type === "live-query.changed")
|
|
138
140
|
return { diff: queryDiffField(value), subscriptionId, type: value.type };
|
|
141
|
+
if (value.type === "live-query.failed")
|
|
142
|
+
return { message: stringField(value, "message"), subscriptionId, type: value.type };
|
|
139
143
|
if (value.type === "kernel.event")
|
|
140
144
|
return { event: domainEventField(value), subscriptionId, type: value.type };
|
|
141
145
|
throw new TypeError("Unknown RPC event type");
|
|
@@ -451,7 +455,8 @@ function offlineStageReadinessChangedPayload(event) {
|
|
|
451
455
|
failureCode !== "asset-integrity-failed" && failureCode !== "node-unreachable" &&
|
|
452
456
|
failureCode !== "projection-seed-failed" &&
|
|
453
457
|
failureCode !== "schema-incompatible" && failureCode !== "quota-exceeded" &&
|
|
454
|
-
failureCode !== "identity-mismatch" && failureCode !== "active-resource-corrupt"
|
|
458
|
+
failureCode !== "identity-mismatch" && failureCode !== "active-resource-corrupt" &&
|
|
459
|
+
failureCode !== "active-resource-evicted") {
|
|
455
460
|
throw new TypeError("Expected a known offline readiness failure code");
|
|
456
461
|
}
|
|
457
462
|
const activeManifestSha256 = optionalStringField(readiness, "activeManifestSha256");
|
|
@@ -882,5 +887,6 @@ function entityActionField(value) {
|
|
|
882
887
|
*/
|
|
883
888
|
/**
|
|
884
889
|
* @typedef {| { readonly diff: QueryDiff<JsonValue>; readonly subscriptionId: string; readonly type: "live-query.changed" }
|
|
890
|
+
* | { readonly message: string; readonly subscriptionId: string; readonly type: "live-query.failed" }
|
|
885
891
|
* | { readonly event: ProtocolDomainEvent; readonly subscriptionId: string; readonly type: "kernel.event" }} RpcEvent
|
|
886
892
|
*/
|