@procedures/client 0.2.3 → 0.3.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/CHANGELOG.md +65 -0
- package/README.md +61 -38
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/http/client/transport.d.ts.map +1 -1
- package/dist/adapters/http/client/transport.js +35 -3
- package/dist/adapters/http/client/transport.js.map +1 -1
- package/dist/adapters/http/client/types.d.ts +3 -2
- package/dist/adapters/http/client/types.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.d.ts +2 -2
- package/dist/adapters/http/server/transport.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.js +53 -20
- package/dist/adapters/http/server/transport.js.map +1 -1
- package/dist/adapters/http/shared/headers.d.ts +1 -1
- package/dist/adapters/http/shared/headers.d.ts.map +1 -1
- package/dist/adapters/http/shared/headers.js +7 -6
- package/dist/adapters/http/shared/headers.js.map +1 -1
- package/dist/adapters/local/client/transport.d.ts +3 -0
- package/dist/adapters/local/client/transport.d.ts.map +1 -1
- package/dist/adapters/local/client/transport.js +63 -4
- package/dist/adapters/local/client/transport.js.map +1 -1
- package/dist/adapters/local/client/types.d.ts +15 -0
- package/dist/adapters/local/client/types.d.ts.map +1 -1
- package/dist/adapters/local/client/types.js.map +1 -1
- package/dist/adapters/mock/client/transport.d.ts +3 -2
- package/dist/adapters/mock/client/transport.d.ts.map +1 -1
- package/dist/adapters/mock/client/transport.js +8 -5
- package/dist/adapters/mock/client/transport.js.map +1 -1
- package/dist/adapters/mock/client/types.d.ts +7 -6
- package/dist/adapters/mock/client/types.d.ts.map +1 -1
- package/dist/adapters/port/transport.d.ts +62 -0
- package/dist/adapters/port/transport.d.ts.map +1 -0
- package/dist/adapters/port/transport.js +94 -0
- package/dist/adapters/port/transport.js.map +1 -0
- package/dist/adapters/websocket/client/index.d.ts +1 -1
- package/dist/adapters/websocket/client/index.d.ts.map +1 -1
- package/dist/adapters/websocket/client/index.js.map +1 -1
- package/dist/adapters/websocket/client/transport.d.ts +47 -7
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
- package/dist/adapters/websocket/client/transport.js +213 -67
- package/dist/adapters/websocket/client/transport.js.map +1 -1
- package/dist/adapters/websocket/client/types.d.ts +70 -21
- package/dist/adapters/websocket/client/types.d.ts.map +1 -1
- package/dist/adapters/websocket/client/types.js.map +1 -1
- package/dist/adapters/websocket/server/transport.d.ts +65 -24
- package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
- package/dist/adapters/websocket/server/transport.js +192 -263
- package/dist/adapters/websocket/server/transport.js.map +1 -1
- package/dist/adapters/websocket/server/types.d.ts +20 -1
- package/dist/adapters/websocket/server/types.d.ts.map +1 -1
- package/dist/adapters/websocket/shared/rpc.d.ts +129 -0
- package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -0
- package/dist/adapters/websocket/shared/rpc.js +425 -0
- package/dist/adapters/websocket/shared/rpc.js.map +1 -0
- package/dist/browser.d.ts +29 -7
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +26 -3
- package/dist/browser.js.map +1 -1
- package/dist/client/call-types.d.ts +10 -10
- package/dist/client/call-types.d.ts.map +1 -1
- package/dist/client/call-types.js +1 -6
- package/dist/client/call-types.js.map +1 -1
- package/dist/client/client.d.ts +6 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +23 -9
- package/dist/client/client.js.map +1 -1
- package/dist/client/deadline.d.ts +38 -0
- package/dist/client/deadline.d.ts.map +1 -0
- package/dist/client/deadline.js +60 -0
- package/dist/client/deadline.js.map +1 -0
- package/dist/client/errors/factory.d.ts.map +1 -1
- package/dist/client/errors/factory.js +11 -7
- package/dist/client/errors/factory.js.map +1 -1
- package/dist/client/index.d.ts +9 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +8 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/middleware/cache.d.ts +19 -5
- package/dist/client/middleware/cache.d.ts.map +1 -1
- package/dist/client/middleware/cache.js +106 -18
- package/dist/client/middleware/cache.js.map +1 -1
- package/dist/client/middleware/circuit-breaker.d.ts +28 -10
- package/dist/client/middleware/circuit-breaker.d.ts.map +1 -1
- package/dist/client/middleware/circuit-breaker.js +35 -24
- package/dist/client/middleware/circuit-breaker.js.map +1 -1
- package/dist/client/middleware/contexts.d.ts +16 -10
- package/dist/client/middleware/contexts.d.ts.map +1 -1
- package/dist/client/middleware/contexts.js.map +1 -1
- package/dist/client/middleware/items.d.ts +31 -2
- package/dist/client/middleware/items.d.ts.map +1 -1
- package/dist/client/middleware/items.js +86 -6
- package/dist/client/middleware/items.js.map +1 -1
- package/dist/client/middleware/lru.d.ts +2 -0
- package/dist/client/middleware/lru.d.ts.map +1 -1
- package/dist/client/middleware/lru.js +11 -0
- package/dist/client/middleware/lru.js.map +1 -1
- package/dist/client/middleware/rate-limit.d.ts +7 -6
- package/dist/client/middleware/rate-limit.d.ts.map +1 -1
- package/dist/client/middleware/rate-limit.js +9 -6
- package/dist/client/middleware/rate-limit.js.map +1 -1
- package/dist/client/middleware/resilience.d.ts +61 -0
- package/dist/client/middleware/resilience.d.ts.map +1 -0
- package/dist/client/middleware/resilience.js +59 -0
- package/dist/client/middleware/resilience.js.map +1 -0
- package/dist/client/middleware/retry.d.ts +45 -11
- package/dist/client/middleware/retry.d.ts.map +1 -1
- package/dist/client/middleware/retry.js +102 -22
- package/dist/client/middleware/retry.js.map +1 -1
- package/dist/client/middleware/timeout.d.ts +15 -12
- package/dist/client/middleware/timeout.d.ts.map +1 -1
- package/dist/client/middleware/timeout.js +46 -37
- package/dist/client/middleware/timeout.js.map +1 -1
- package/dist/client/middleware/tracing.d.ts.map +1 -1
- package/dist/client/middleware/tracing.js +11 -3
- package/dist/client/middleware/tracing.js.map +1 -1
- package/dist/client/types.d.ts +9 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/clock.d.ts +19 -0
- package/dist/clock.d.ts.map +1 -0
- package/dist/clock.js +18 -0
- package/dist/clock.js.map +1 -0
- package/dist/duration.d.ts +37 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +44 -0
- package/dist/duration.js.map +1 -0
- package/dist/machines.d.ts +90 -0
- package/dist/machines.d.ts.map +1 -0
- package/dist/machines.js +127 -0
- package/dist/machines.js.map +1 -0
- package/dist/procedures/capability.d.ts +3 -6
- package/dist/procedures/capability.d.ts.map +1 -1
- package/dist/procedures/capability.js +7 -8
- package/dist/procedures/capability.js.map +1 -1
- package/dist/procedures/collection/index.d.ts +3 -3
- package/dist/procedures/collection/index.d.ts.map +1 -1
- package/dist/procedures/collection/index.js +1 -1
- package/dist/procedures/collection/index.js.map +1 -1
- package/dist/procedures/collection/procedures.d.ts.map +1 -1
- package/dist/procedures/collection/procedures.js +49 -1
- package/dist/procedures/collection/procedures.js.map +1 -1
- package/dist/procedures/collection/schemas.d.ts +33 -0
- package/dist/procedures/collection/schemas.d.ts.map +1 -1
- package/dist/procedures/collection/schemas.js +68 -0
- package/dist/procedures/collection/schemas.js.map +1 -1
- package/dist/procedures/collection/storage.d.ts +37 -0
- package/dist/procedures/collection/storage.d.ts.map +1 -1
- package/dist/procedures/core/array.d.ts.map +1 -1
- package/dist/procedures/core/array.js +26 -15
- package/dist/procedures/core/array.js.map +1 -1
- package/dist/procedures/core/index.d.ts.map +1 -1
- package/dist/procedures/core/index.js +8 -0
- package/dist/procedures/core/index.js.map +1 -1
- package/dist/procedures/core/meta.d.ts.map +1 -1
- package/dist/procedures/core/meta.js +2 -1
- package/dist/procedures/core/meta.js.map +1 -1
- package/dist/procedures/core/object.d.ts.map +1 -1
- package/dist/procedures/core/object.js +42 -13
- package/dist/procedures/core/object.js.map +1 -1
- package/dist/procedures/core/operands.d.ts.map +1 -1
- package/dist/procedures/core/operands.js +6 -1
- package/dist/procedures/core/operands.js.map +1 -1
- package/dist/procedures/core/string.d.ts.map +1 -1
- package/dist/procedures/core/string.js +4 -2
- package/dist/procedures/core/string.js.map +1 -1
- package/dist/procedures/define-procedure.d.ts +19 -7
- package/dist/procedures/define-procedure.d.ts.map +1 -1
- package/dist/procedures/define-procedure.js +57 -17
- package/dist/procedures/define-procedure.js.map +1 -1
- package/dist/procedures/effects.d.ts +16 -0
- package/dist/procedures/effects.d.ts.map +1 -1
- package/dist/procedures/effects.js +33 -0
- package/dist/procedures/effects.js.map +1 -1
- package/dist/procedures/idempotency.d.ts +73 -0
- package/dist/procedures/idempotency.d.ts.map +1 -0
- package/dist/procedures/idempotency.js +131 -0
- package/dist/procedures/idempotency.js.map +1 -0
- package/dist/procedures/index.d.ts +7 -3
- package/dist/procedures/index.d.ts.map +1 -1
- package/dist/procedures/index.js +6 -2
- package/dist/procedures/index.js.map +1 -1
- package/dist/procedures/interceptors.d.ts +17 -4
- package/dist/procedures/interceptors.d.ts.map +1 -1
- package/dist/procedures/interceptors.js +18 -7
- package/dist/procedures/interceptors.js.map +1 -1
- package/dist/procedures/invoke.d.ts +15 -3
- package/dist/procedures/invoke.d.ts.map +1 -1
- package/dist/procedures/invoke.js +8 -3
- package/dist/procedures/invoke.js.map +1 -1
- package/dist/procedures/manifest.d.ts +83 -0
- package/dist/procedures/manifest.d.ts.map +1 -0
- package/dist/procedures/manifest.js +90 -0
- package/dist/procedures/manifest.js.map +1 -0
- package/dist/procedures/runtime-programs.d.ts +19 -0
- package/dist/procedures/runtime-programs.d.ts.map +1 -0
- package/dist/procedures/runtime-programs.js +24 -0
- package/dist/procedures/runtime-programs.js.map +1 -0
- package/dist/procedures/types.d.ts +16 -0
- package/dist/procedures/types.d.ts.map +1 -1
- package/dist/procedures/types.js.map +1 -1
- package/dist/protocol.d.ts +40 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +58 -0
- package/dist/protocol.js.map +1 -0
- package/dist/server/host-policy.d.ts +4 -3
- package/dist/server/host-policy.d.ts.map +1 -1
- package/dist/server/host-policy.js +6 -3
- package/dist/server/host-policy.js.map +1 -1
- package/dist/server/host-procedures.d.ts +31 -0
- package/dist/server/host-procedures.d.ts.map +1 -0
- package/dist/server/host-procedures.js +75 -0
- package/dist/server/host-procedures.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/procedure-server.d.ts +110 -4
- package/dist/server/procedure-server.d.ts.map +1 -1
- package/dist/server/procedure-server.js +269 -17
- package/dist/server/procedure-server.js.map +1 -1
- package/dist/server/request-auth.d.ts +19 -0
- package/dist/server/request-auth.d.ts.map +1 -0
- package/dist/server/request-auth.js +32 -0
- package/dist/server/request-auth.js.map +1 -0
- package/dist/server/types.d.ts +32 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js.map +1 -1
- package/dist/timers.d.ts +60 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +33 -0
- package/dist/timers.js.map +1 -0
- package/dist/tracing/traceparent.d.ts +26 -0
- package/dist/tracing/traceparent.d.ts.map +1 -0
- package/dist/tracing/traceparent.js +53 -0
- package/dist/tracing/traceparent.js.map +1 -0
- package/package.json +7 -1
- package/src/adapters/http/client/transport.ts +31 -3
- package/src/adapters/http/client/types.ts +3 -2
- package/src/adapters/http/server/transport.ts +60 -24
- package/src/adapters/http/shared/headers.ts +7 -6
- package/src/adapters/local/client/transport.ts +70 -5
- package/src/adapters/local/client/types.ts +18 -0
- package/src/adapters/mock/client/transport.ts +9 -6
- package/src/adapters/mock/client/types.ts +7 -6
- package/src/adapters/port/transport.ts +124 -0
- package/src/adapters/websocket/client/index.ts +1 -0
- package/src/adapters/websocket/client/transport.ts +232 -73
- package/src/adapters/websocket/client/types.ts +80 -21
- package/src/adapters/websocket/server/transport.ts +199 -301
- package/src/adapters/websocket/server/types.ts +20 -1
- package/src/adapters/websocket/shared/rpc.ts +453 -0
- package/src/browser.ts +51 -3
- package/src/client/call-types.ts +10 -14
- package/src/client/client.ts +28 -9
- package/src/client/deadline.ts +64 -0
- package/src/client/errors/factory.ts +12 -8
- package/src/client/index.ts +21 -3
- package/src/client/middleware/cache.ts +120 -23
- package/src/client/middleware/circuit-breaker.ts +65 -35
- package/src/client/middleware/contexts.ts +17 -10
- package/src/client/middleware/items.ts +101 -6
- package/src/client/middleware/lru.ts +12 -0
- package/src/client/middleware/rate-limit.ts +9 -7
- package/src/client/middleware/resilience.ts +81 -0
- package/src/client/middleware/retry.ts +146 -34
- package/src/client/middleware/timeout.ts +55 -46
- package/src/client/middleware/tracing.ts +13 -4
- package/src/client/types.ts +9 -1
- package/src/clock.ts +21 -0
- package/src/duration.ts +56 -0
- package/src/machines.ts +186 -0
- package/src/procedures/capability.ts +7 -8
- package/src/procedures/collection/index.ts +9 -1
- package/src/procedures/collection/procedures.ts +57 -0
- package/src/procedures/collection/schemas.ts +110 -0
- package/src/procedures/collection/storage.ts +38 -0
- package/src/procedures/core/array.ts +27 -16
- package/src/procedures/core/index.ts +8 -0
- package/src/procedures/core/meta.ts +2 -1
- package/src/procedures/core/object.ts +48 -14
- package/src/procedures/core/operands.ts +7 -0
- package/src/procedures/core/string.ts +4 -2
- package/src/procedures/define-procedure.ts +73 -20
- package/src/procedures/effects.ts +35 -0
- package/src/procedures/idempotency.ts +152 -0
- package/src/procedures/index.ts +18 -2
- package/src/procedures/interceptors.ts +28 -11
- package/src/procedures/invoke.ts +19 -5
- package/src/procedures/manifest.ts +158 -0
- package/src/procedures/runtime-programs.ts +27 -0
- package/src/procedures/types.ts +16 -0
- package/src/protocol.ts +97 -0
- package/src/server/host-policy.ts +8 -5
- package/src/server/host-procedures.ts +102 -0
- package/src/server/index.ts +5 -2
- package/src/server/procedure-server.ts +324 -10
- package/src/server/request-auth.ts +35 -0
- package/src/server/types.ts +37 -0
- package/src/timers.ts +82 -0
- package/src/tracing/traceparent.ts +61 -0
|
@@ -7,6 +7,7 @@ import type { IncomingMessage } from "http";
|
|
|
7
7
|
import type { Server as HttpServer } from "http";
|
|
8
8
|
import type { WebSocket } from "ws";
|
|
9
9
|
import type { BrowserGuardOptions } from "../../../server/browser-guard.js";
|
|
10
|
+
import type { Duration } from "../../../duration.js";
|
|
10
11
|
/**
|
|
11
12
|
* WebSocket authentication handler.
|
|
12
13
|
* Called during WebSocket upgrade to authenticate the connection.
|
|
@@ -62,6 +63,22 @@ export interface WebSocketServerTransportOptions extends Omit<BrowserGuardOption
|
|
|
62
63
|
* @default 1 MiB
|
|
63
64
|
*/
|
|
64
65
|
highWaterMark?: number;
|
|
66
|
+
/**
|
|
67
|
+
* The heartbeat of the server: a WebSocket ping to each connection at each interval. A
|
|
68
|
+
* connection that misses `misses` pongs one after the other is closed, so the server finds a
|
|
69
|
+
* client that went silent (roadmap R3: before, only the client sent pings). Browsers and the
|
|
70
|
+
* `ws` client answer a ping without code. `false` turns it off.
|
|
71
|
+
* @default { interval: seconds(15), misses: 2 } (`TIMER_DEFAULTS.webSocketServer`)
|
|
72
|
+
*/
|
|
73
|
+
heartbeat?: {
|
|
74
|
+
interval?: Duration;
|
|
75
|
+
misses?: number;
|
|
76
|
+
} | false;
|
|
77
|
+
/**
|
|
78
|
+
* The time until the first frame of a call that the server sends to a client (roadmap R24).
|
|
79
|
+
* @default seconds(30)
|
|
80
|
+
*/
|
|
81
|
+
reverseRequestTimeout?: Duration;
|
|
65
82
|
}
|
|
66
83
|
/**
|
|
67
84
|
* WebSocket message format for RPC.
|
|
@@ -70,7 +87,9 @@ export interface WebSocketMessage<TReq = unknown> {
|
|
|
70
87
|
/** Message ID for request/response matching */
|
|
71
88
|
id: string;
|
|
72
89
|
/** Message type */
|
|
73
|
-
type: "request" | "response" | "error" | "stream" | "cancel" | "credit" | "ping" | "pong" | "server-request" | "server-response" | "event";
|
|
90
|
+
type: "hello" | "request" | "response" | "error" | "stream" | "cancel" | "credit" | "ping" | "pong" | "server-request" | "server-response" | "event";
|
|
91
|
+
/** The protocol version of a `hello` frame (roadmap R25). */
|
|
92
|
+
protocol?: number;
|
|
74
93
|
/** RPC method (for requests) */
|
|
75
94
|
method?: {
|
|
76
95
|
service: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/adapters/websocket/server/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/adapters/websocket/server/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The calls over one WebSocket in the two directions (roadmap R24).
|
|
3
|
+
*
|
|
4
|
+
* A WebSocket connection carries the calls of each side to the other side, with the same frames:
|
|
5
|
+
* a `request`, then a `response`, an `error`, or `stream` frames that end with `stream.done`. The
|
|
6
|
+
* reader of a stream gives `credit`, and the caller can `cancel`. `OutgoingCalls` is the side that
|
|
7
|
+
* sends calls. `IncomingCalls` is the side that serves them with a `RequestHandler`, so a call runs
|
|
8
|
+
* through `invokeProcedure` (validation, the expose rule, the capability, the deadline of
|
|
9
|
+
* `procedure-timeout`). The server serves the calls of the client, and the client can serve the
|
|
10
|
+
* calls of the server: before, the reverse calls had frames of their own (`server-request`,
|
|
11
|
+
* `server-response`), with one value, no stream, no cancel and no signal.
|
|
12
|
+
*/
|
|
13
|
+
import type { Message, ResponseItem } from "../../../client/types.js";
|
|
14
|
+
import type { RequestHandler, ServerRequest } from "../../../server/types.js";
|
|
15
|
+
import type { WebSocketMessage } from "../server/types.js";
|
|
16
|
+
/**
|
|
17
|
+
* A queue of response items that one reader takes in order: push, then end or fail. The reader
|
|
18
|
+
* waits for the next item without polling.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ItemQueue<T> {
|
|
21
|
+
private items;
|
|
22
|
+
private ended;
|
|
23
|
+
private failure;
|
|
24
|
+
private wake;
|
|
25
|
+
push(item: T): void;
|
|
26
|
+
end(): void;
|
|
27
|
+
fail(error: Error): void;
|
|
28
|
+
private notify;
|
|
29
|
+
[Symbol.asyncIterator](): AsyncGenerator<T, void, undefined>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The credit of a stream (deep dive TRN-3): the number of items that the reader has room for.
|
|
33
|
+
* The stream takes one for each item that it sends, and waits when it has none.
|
|
34
|
+
*/
|
|
35
|
+
export declare class StreamCredit {
|
|
36
|
+
private credit;
|
|
37
|
+
private wake;
|
|
38
|
+
constructor(credit: number);
|
|
39
|
+
grant(n: number): void;
|
|
40
|
+
/** Take one item of credit. Returns false when the signal aborted the wait. */
|
|
41
|
+
take(signal: AbortSignal): Promise<boolean>;
|
|
42
|
+
}
|
|
43
|
+
/** The error of a failed stream or handler: its code (a string) and its retryable flag. */
|
|
44
|
+
export declare function errorStatus(error: unknown): {
|
|
45
|
+
type: "error";
|
|
46
|
+
code: string;
|
|
47
|
+
message: string;
|
|
48
|
+
retryable: boolean;
|
|
49
|
+
};
|
|
50
|
+
/** The response item of a `response` or an `error` frame, for the caller's message id. */
|
|
51
|
+
export declare function itemOfFrame(frame: WebSocketMessage, messageId: string): ResponseItem<unknown>;
|
|
52
|
+
/** The options of `OutgoingCalls`. */
|
|
53
|
+
export interface OutgoingCallsOptions {
|
|
54
|
+
/** This function sends a frame on the socket. */
|
|
55
|
+
send: (frame: WebSocketMessage) => void;
|
|
56
|
+
/** True while the socket is open. */
|
|
57
|
+
isOpen: () => boolean;
|
|
58
|
+
/** The time until the first frame of a call, in milliseconds. 0 or less: no limit. */
|
|
59
|
+
requestTimeoutMs: number;
|
|
60
|
+
/** The number of stream items that the reader can hold. */
|
|
61
|
+
streamWindow: number;
|
|
62
|
+
/** The start of the wire id of each call: the two sides use different ones. */
|
|
63
|
+
idPrefix: string;
|
|
64
|
+
}
|
|
65
|
+
/** The calls that this side sends on one socket. */
|
|
66
|
+
export declare class OutgoingCalls {
|
|
67
|
+
private readonly options;
|
|
68
|
+
private readonly pending;
|
|
69
|
+
private seq;
|
|
70
|
+
constructor(options: OutgoingCallsOptions);
|
|
71
|
+
/** The number of calls that wait for their frames. */
|
|
72
|
+
get size(): number;
|
|
73
|
+
/** This function sends a call, and gives its response items. */
|
|
74
|
+
call<TReq, TRes>(message: Message<TReq>): AsyncGenerator<ResponseItem<TRes>, void, undefined>;
|
|
75
|
+
/**
|
|
76
|
+
* This function takes a `response`, `error` or `stream` frame of a call that this side sent.
|
|
77
|
+
* It gives false for another frame.
|
|
78
|
+
*/
|
|
79
|
+
receive(frame: WebSocketMessage): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* This function fails each call that waits: the socket closed. The other side can have run
|
|
82
|
+
* them, so their outcome is indeterminate (R1).
|
|
83
|
+
*/
|
|
84
|
+
failAll(reason: string): void;
|
|
85
|
+
private sendCancel;
|
|
86
|
+
private sendCredit;
|
|
87
|
+
}
|
|
88
|
+
/** The options of `IncomingCalls`. */
|
|
89
|
+
export interface IncomingCallsOptions {
|
|
90
|
+
/** The handler that serves each call: a `ProcedureServer`, a `Server`, or a function object. */
|
|
91
|
+
handler: RequestHandler;
|
|
92
|
+
/** This function sends a frame on the socket. */
|
|
93
|
+
send: (frame: WebSocketMessage) => void;
|
|
94
|
+
/** This function sends a frame and waits while the send buffer of the socket is full. */
|
|
95
|
+
sendWithBackpressure?: ((frame: WebSocketMessage, signal: AbortSignal) => Promise<void>) | undefined;
|
|
96
|
+
/** True while the socket is open. */
|
|
97
|
+
isOpen: () => boolean;
|
|
98
|
+
/** This function makes the server request of a `request` frame: the metadata, the credentials. */
|
|
99
|
+
requestOf: (frame: WebSocketMessage, signal: AbortSignal) => ServerRequest;
|
|
100
|
+
}
|
|
101
|
+
/** The calls that the other side sends on one socket, served by a handler. */
|
|
102
|
+
export declare class IncomingCalls {
|
|
103
|
+
private readonly options;
|
|
104
|
+
/** The calls that run, by wire id: a cancel frame or a closed socket aborts them */
|
|
105
|
+
private readonly inflight;
|
|
106
|
+
/** The flow control of the streams that run, by wire id */
|
|
107
|
+
private readonly credits;
|
|
108
|
+
constructor(options: IncomingCallsOptions);
|
|
109
|
+
/** The number of calls that run. */
|
|
110
|
+
get size(): number;
|
|
111
|
+
/**
|
|
112
|
+
* This function takes a `request`, `cancel` or `credit` frame of the other side. It gives false
|
|
113
|
+
* for another frame.
|
|
114
|
+
*/
|
|
115
|
+
receive(frame: WebSocketMessage): boolean;
|
|
116
|
+
/** This function aborts each call that runs: the socket closed, or the side stops. */
|
|
117
|
+
abortAll(): void;
|
|
118
|
+
private serve;
|
|
119
|
+
/**
|
|
120
|
+
* Send a stream (BUGS-2026-07 H5): one `stream` frame for each item, then a frame with
|
|
121
|
+
* `stream.done`. An error of the stream ends it with an `error` frame. When the signal aborts
|
|
122
|
+
* (a cancel frame, a closed socket), the loop stops, and the handler of the stream gets
|
|
123
|
+
* return(). The stream takes its next item only when the reader has credit for it.
|
|
124
|
+
*/
|
|
125
|
+
private sendStream;
|
|
126
|
+
private send;
|
|
127
|
+
private sendError;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../../src/adapters/websocket/shared/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The calls over one WebSocket in the two directions (roadmap R24).
|
|
3
|
+
*
|
|
4
|
+
* A WebSocket connection carries the calls of each side to the other side, with the same frames:
|
|
5
|
+
* a `request`, then a `response`, an `error`, or `stream` frames that end with `stream.done`. The
|
|
6
|
+
* reader of a stream gives `credit`, and the caller can `cancel`. `OutgoingCalls` is the side that
|
|
7
|
+
* sends calls. `IncomingCalls` is the side that serves them with a `RequestHandler`, so a call runs
|
|
8
|
+
* through `invokeProcedure` (validation, the expose rule, the capability, the deadline of
|
|
9
|
+
* `procedure-timeout`). The server serves the calls of the client, and the client can serve the
|
|
10
|
+
* calls of the server: before, the reverse calls had frames of their own (`server-request`,
|
|
11
|
+
* `server-response`), with one value, no stream, no cancel and no signal.
|
|
12
|
+
*/
|
|
13
|
+
import { withoutInternalKeys } from "../../metadata.js";
|
|
14
|
+
import { DELIVERY_METADATA_KEY } from "../../../client/middleware/items.js";
|
|
15
|
+
/**
|
|
16
|
+
* A queue of response items that one reader takes in order: push, then end or fail. The reader
|
|
17
|
+
* waits for the next item without polling.
|
|
18
|
+
*/
|
|
19
|
+
export class ItemQueue {
|
|
20
|
+
items = [];
|
|
21
|
+
ended = false;
|
|
22
|
+
failure;
|
|
23
|
+
wake;
|
|
24
|
+
push(item) {
|
|
25
|
+
this.items.push(item);
|
|
26
|
+
this.notify();
|
|
27
|
+
}
|
|
28
|
+
end() {
|
|
29
|
+
this.ended = true;
|
|
30
|
+
this.notify();
|
|
31
|
+
}
|
|
32
|
+
fail(error) {
|
|
33
|
+
this.failure = { error };
|
|
34
|
+
this.notify();
|
|
35
|
+
}
|
|
36
|
+
notify() {
|
|
37
|
+
const wake = this.wake;
|
|
38
|
+
this.wake = undefined;
|
|
39
|
+
wake?.();
|
|
40
|
+
}
|
|
41
|
+
async *[Symbol.asyncIterator]() {
|
|
42
|
+
for (;;) {
|
|
43
|
+
if (this.items.length > 0) {
|
|
44
|
+
yield this.items.shift();
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (this.failure)
|
|
48
|
+
throw this.failure.error;
|
|
49
|
+
if (this.ended)
|
|
50
|
+
return;
|
|
51
|
+
await new Promise((resolve) => {
|
|
52
|
+
this.wake = resolve;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The credit of a stream (deep dive TRN-3): the number of items that the reader has room for.
|
|
59
|
+
* The stream takes one for each item that it sends, and waits when it has none.
|
|
60
|
+
*/
|
|
61
|
+
export class StreamCredit {
|
|
62
|
+
credit;
|
|
63
|
+
wake;
|
|
64
|
+
constructor(credit) {
|
|
65
|
+
this.credit = credit;
|
|
66
|
+
}
|
|
67
|
+
grant(n) {
|
|
68
|
+
this.credit += n;
|
|
69
|
+
const wake = this.wake;
|
|
70
|
+
this.wake = undefined;
|
|
71
|
+
wake?.();
|
|
72
|
+
}
|
|
73
|
+
/** Take one item of credit. Returns false when the signal aborted the wait. */
|
|
74
|
+
async take(signal) {
|
|
75
|
+
while (this.credit <= 0) {
|
|
76
|
+
if (signal.aborted)
|
|
77
|
+
return false;
|
|
78
|
+
await new Promise((resolve) => {
|
|
79
|
+
const onAbort = () => resolve();
|
|
80
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
81
|
+
this.wake = () => {
|
|
82
|
+
signal.removeEventListener("abort", onAbort);
|
|
83
|
+
resolve();
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (signal.aborted)
|
|
88
|
+
return false;
|
|
89
|
+
this.credit--;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** The error of a failed stream or handler: its code (a string) and its retryable flag. */
|
|
94
|
+
export function errorStatus(error) {
|
|
95
|
+
const code = error?.code;
|
|
96
|
+
const retryable = error?.retryable;
|
|
97
|
+
return {
|
|
98
|
+
type: "error",
|
|
99
|
+
code: typeof code === "string" ? code : "HANDLER_ERROR",
|
|
100
|
+
message: error instanceof Error ? error.message : String(error),
|
|
101
|
+
// Before, every stream error lost its retryable flag (deep dive TRN-7)
|
|
102
|
+
retryable: typeof retryable === "boolean" ? retryable : false,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** A text of an error message of a frame: a string, or the JSON of another value. */
|
|
106
|
+
function textOf(value) {
|
|
107
|
+
if (typeof value === "string")
|
|
108
|
+
return value;
|
|
109
|
+
return value === undefined ? "Unknown error" : JSON.stringify(value);
|
|
110
|
+
}
|
|
111
|
+
/** The response item of a `response` or an `error` frame, for the caller's message id. */
|
|
112
|
+
export function itemOfFrame(frame, messageId) {
|
|
113
|
+
let status;
|
|
114
|
+
if (frame.status && frame.status.type === "error") {
|
|
115
|
+
status = { type: "error", code: String(frame.status.code), message: textOf(frame.status.message), retryable: frame.status.retryable || false };
|
|
116
|
+
}
|
|
117
|
+
else if (frame.status && frame.status.type === "success") {
|
|
118
|
+
status = { type: "success", code: Number(frame.status.code) };
|
|
119
|
+
}
|
|
120
|
+
else if (frame.type === "error") {
|
|
121
|
+
status = {
|
|
122
|
+
type: "error",
|
|
123
|
+
code: String(frame.error?.code || "UNKNOWN_ERROR"),
|
|
124
|
+
message: textOf(frame.error?.message),
|
|
125
|
+
retryable: frame.error?.retryable || false,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
status = { type: "success", code: 200 };
|
|
130
|
+
}
|
|
131
|
+
return { id: messageId, status, payload: frame.payload, metadata: frame.metadata || {} };
|
|
132
|
+
}
|
|
133
|
+
/** The calls that this side sends on one socket. */
|
|
134
|
+
export class OutgoingCalls {
|
|
135
|
+
options;
|
|
136
|
+
pending = new Map();
|
|
137
|
+
seq = 0;
|
|
138
|
+
constructor(options) {
|
|
139
|
+
this.options = options;
|
|
140
|
+
}
|
|
141
|
+
/** The number of calls that wait for their frames. */
|
|
142
|
+
get size() {
|
|
143
|
+
return this.pending.size;
|
|
144
|
+
}
|
|
145
|
+
/** This function sends a call, and gives its response items. */
|
|
146
|
+
async *call(message) {
|
|
147
|
+
if (message.signal?.aborted) {
|
|
148
|
+
yield abortedItem(message.id);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (!this.options.isOpen()) {
|
|
152
|
+
// The call did not leave: a retry can send it
|
|
153
|
+
yield {
|
|
154
|
+
id: message.id,
|
|
155
|
+
status: { type: "error", code: "CONNECTION_CLOSED", message: "The connection is closed", retryable: true },
|
|
156
|
+
payload: null,
|
|
157
|
+
metadata: { [DELIVERY_METADATA_KEY]: "not-sent" },
|
|
158
|
+
};
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const wireId = `${this.options.idPrefix}${message.id}~${++this.seq}`;
|
|
162
|
+
const window = this.options.streamWindow;
|
|
163
|
+
const queue = new ItemQueue();
|
|
164
|
+
const pending = { messageId: message.id, queue };
|
|
165
|
+
const limited = Number.isFinite(this.options.requestTimeoutMs) && this.options.requestTimeoutMs > 0;
|
|
166
|
+
if (limited)
|
|
167
|
+
pending.timeout = setTimeout(() => {
|
|
168
|
+
if (this.pending.get(wireId) !== pending)
|
|
169
|
+
return;
|
|
170
|
+
this.pending.delete(wireId);
|
|
171
|
+
this.sendCancel(wireId);
|
|
172
|
+
queue.push({
|
|
173
|
+
id: message.id,
|
|
174
|
+
status: { type: "error", code: "TIMEOUT", message: `Request timeout after ${this.options.requestTimeoutMs}ms`, retryable: false },
|
|
175
|
+
payload: null,
|
|
176
|
+
metadata: { [DELIVERY_METADATA_KEY]: "indeterminate" },
|
|
177
|
+
});
|
|
178
|
+
queue.end();
|
|
179
|
+
}, this.options.requestTimeoutMs);
|
|
180
|
+
this.pending.set(wireId, pending);
|
|
181
|
+
const onAbort = () => {
|
|
182
|
+
if (this.pending.get(wireId) !== pending)
|
|
183
|
+
return;
|
|
184
|
+
this.pending.delete(wireId);
|
|
185
|
+
if (pending.timeout)
|
|
186
|
+
clearTimeout(pending.timeout);
|
|
187
|
+
this.sendCancel(wireId);
|
|
188
|
+
queue.push(abortedItem(message.id));
|
|
189
|
+
queue.end();
|
|
190
|
+
};
|
|
191
|
+
message.signal?.addEventListener("abort", onAbort, { once: true });
|
|
192
|
+
try {
|
|
193
|
+
this.options.send({
|
|
194
|
+
id: wireId,
|
|
195
|
+
type: "request",
|
|
196
|
+
method: message.method,
|
|
197
|
+
payload: message.payload,
|
|
198
|
+
// The internal metadata keys stay in this process (deep dive TRN-11)
|
|
199
|
+
metadata: withoutInternalKeys(message.metadata),
|
|
200
|
+
credit: window,
|
|
201
|
+
});
|
|
202
|
+
let taken = 0;
|
|
203
|
+
for await (const item of queue) {
|
|
204
|
+
yield item;
|
|
205
|
+
// The reader took the item: give the other side credit, in batches of half the window
|
|
206
|
+
if (++taken >= window / 2 && this.pending.get(wireId) === pending) {
|
|
207
|
+
this.sendCredit(wireId, taken);
|
|
208
|
+
taken = 0;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
message.signal?.removeEventListener("abort", onAbort);
|
|
214
|
+
if (pending.timeout)
|
|
215
|
+
clearTimeout(pending.timeout);
|
|
216
|
+
if (this.pending.get(wireId) === pending) {
|
|
217
|
+
// The reader stopped before the end: the other side stops the stream
|
|
218
|
+
this.pending.delete(wireId);
|
|
219
|
+
this.sendCancel(wireId);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* This function takes a `response`, `error` or `stream` frame of a call that this side sent.
|
|
225
|
+
* It gives false for another frame.
|
|
226
|
+
*/
|
|
227
|
+
receive(frame) {
|
|
228
|
+
if (frame.type !== "response" && frame.type !== "error" && frame.type !== "stream")
|
|
229
|
+
return false;
|
|
230
|
+
const pending = this.pending.get(frame.id);
|
|
231
|
+
if (!pending)
|
|
232
|
+
return false;
|
|
233
|
+
// The first frame arrived: the time limit ends. A stream can stay open longer.
|
|
234
|
+
if (pending.timeout) {
|
|
235
|
+
clearTimeout(pending.timeout);
|
|
236
|
+
pending.timeout = undefined;
|
|
237
|
+
}
|
|
238
|
+
if (frame.type === "stream" && !frame.status) {
|
|
239
|
+
if (frame.stream?.done) {
|
|
240
|
+
this.pending.delete(frame.id);
|
|
241
|
+
pending.queue.end();
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
pending.queue.push({ id: pending.messageId, status: { type: "success", code: 200 }, payload: frame.payload, metadata: frame.metadata || {} });
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
this.pending.delete(frame.id);
|
|
248
|
+
pending.queue.push(itemOfFrame(frame, pending.messageId));
|
|
249
|
+
pending.queue.end();
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* This function fails each call that waits: the socket closed. The other side can have run
|
|
254
|
+
* them, so their outcome is indeterminate (R1).
|
|
255
|
+
*/
|
|
256
|
+
failAll(reason) {
|
|
257
|
+
for (const pending of this.pending.values()) {
|
|
258
|
+
if (pending.timeout)
|
|
259
|
+
clearTimeout(pending.timeout);
|
|
260
|
+
pending.queue.fail(new Error(reason));
|
|
261
|
+
}
|
|
262
|
+
this.pending.clear();
|
|
263
|
+
}
|
|
264
|
+
sendCancel(id) {
|
|
265
|
+
if (this.options.isOpen())
|
|
266
|
+
this.options.send({ id, type: "cancel" });
|
|
267
|
+
}
|
|
268
|
+
sendCredit(id, credit) {
|
|
269
|
+
if (this.options.isOpen())
|
|
270
|
+
this.options.send({ id, type: "credit", credit });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/** The calls that the other side sends on one socket, served by a handler. */
|
|
274
|
+
export class IncomingCalls {
|
|
275
|
+
options;
|
|
276
|
+
/** The calls that run, by wire id: a cancel frame or a closed socket aborts them */
|
|
277
|
+
inflight = new Map();
|
|
278
|
+
/** The flow control of the streams that run, by wire id */
|
|
279
|
+
credits = new Map();
|
|
280
|
+
constructor(options) {
|
|
281
|
+
this.options = options;
|
|
282
|
+
}
|
|
283
|
+
/** The number of calls that run. */
|
|
284
|
+
get size() {
|
|
285
|
+
return this.inflight.size;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* This function takes a `request`, `cancel` or `credit` frame of the other side. It gives false
|
|
289
|
+
* for another frame.
|
|
290
|
+
*/
|
|
291
|
+
receive(frame) {
|
|
292
|
+
if (frame.type === "cancel") {
|
|
293
|
+
this.inflight.get(frame.id)?.abort();
|
|
294
|
+
this.inflight.delete(frame.id);
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
if (frame.type === "credit") {
|
|
298
|
+
if (typeof frame.credit === "number" && frame.credit > 0)
|
|
299
|
+
this.credits.get(frame.id)?.grant(frame.credit);
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
if (frame.type !== "request")
|
|
303
|
+
return false;
|
|
304
|
+
if (!frame.id || !frame.method) {
|
|
305
|
+
this.sendError(frame.id || "unknown", "Invalid message format", "INVALID_REQUEST");
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
// A request id names one request while it runs. A second request with the id would take the
|
|
309
|
+
// first one's controller: its stream could not be cancelled (deep dive TRN-9).
|
|
310
|
+
if (this.inflight.has(frame.id)) {
|
|
311
|
+
this.sendError(frame.id, "A request with this id is still running", "DUPLICATE_REQUEST");
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
void this.serve(frame);
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
/** This function aborts each call that runs: the socket closed, or the side stops. */
|
|
318
|
+
abortAll() {
|
|
319
|
+
for (const controller of this.inflight.values())
|
|
320
|
+
controller.abort();
|
|
321
|
+
this.inflight.clear();
|
|
322
|
+
this.credits.clear();
|
|
323
|
+
}
|
|
324
|
+
async serve(frame) {
|
|
325
|
+
const controller = new AbortController();
|
|
326
|
+
this.inflight.set(frame.id, controller);
|
|
327
|
+
try {
|
|
328
|
+
const response = await this.options.handler.handle(this.options.requestOf(frame, controller.signal));
|
|
329
|
+
if (response.stream) {
|
|
330
|
+
const credit = typeof frame.credit === "number" && frame.credit > 0 ? new StreamCredit(frame.credit) : undefined;
|
|
331
|
+
if (credit)
|
|
332
|
+
this.credits.set(frame.id, credit);
|
|
333
|
+
await this.sendStream(frame.id, response.stream, controller.signal, credit);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
const out = {
|
|
337
|
+
id: frame.id,
|
|
338
|
+
type: response.status.type === "success" ? "response" : "error",
|
|
339
|
+
payload: response.payload,
|
|
340
|
+
metadata: response.metadata,
|
|
341
|
+
status: response.status,
|
|
342
|
+
};
|
|
343
|
+
if (response.status.type === "error") {
|
|
344
|
+
out.error = { code: response.status.code, message: response.status.message || "Unknown error", retryable: response.status.retryable };
|
|
345
|
+
}
|
|
346
|
+
this.send(out);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
this.sendError(frame.id, error instanceof Error ? error.message : "Internal server error", "INTERNAL_ERROR");
|
|
351
|
+
}
|
|
352
|
+
finally {
|
|
353
|
+
// Delete only this request's entries (deep dive TRN-9)
|
|
354
|
+
if (this.inflight.get(frame.id) === controller)
|
|
355
|
+
this.inflight.delete(frame.id);
|
|
356
|
+
this.credits.delete(frame.id);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Send a stream (BUGS-2026-07 H5): one `stream` frame for each item, then a frame with
|
|
361
|
+
* `stream.done`. An error of the stream ends it with an `error` frame. When the signal aborts
|
|
362
|
+
* (a cancel frame, a closed socket), the loop stops, and the handler of the stream gets
|
|
363
|
+
* return(). The stream takes its next item only when the reader has credit for it.
|
|
364
|
+
*/
|
|
365
|
+
async sendStream(id, stream, signal, credit) {
|
|
366
|
+
const iterator = stream[Symbol.asyncIterator]();
|
|
367
|
+
let done = false;
|
|
368
|
+
try {
|
|
369
|
+
for (;;) {
|
|
370
|
+
if (credit && !(await credit.take(signal)))
|
|
371
|
+
return;
|
|
372
|
+
if (signal.aborted || !this.options.isOpen())
|
|
373
|
+
return;
|
|
374
|
+
const result = await iterator.next();
|
|
375
|
+
if (result.done) {
|
|
376
|
+
done = true;
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
if (signal.aborted || !this.options.isOpen())
|
|
380
|
+
return;
|
|
381
|
+
const item = { id, type: "stream", payload: result.value, stream: { done: false } };
|
|
382
|
+
if (this.options.sendWithBackpressure)
|
|
383
|
+
await this.options.sendWithBackpressure(item, signal);
|
|
384
|
+
else
|
|
385
|
+
this.send(item);
|
|
386
|
+
}
|
|
387
|
+
this.send({ id, type: "stream", stream: { done: true } });
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
done = true;
|
|
391
|
+
if (signal.aborted)
|
|
392
|
+
return;
|
|
393
|
+
const status = errorStatus(error);
|
|
394
|
+
this.send({
|
|
395
|
+
id,
|
|
396
|
+
type: "error",
|
|
397
|
+
status,
|
|
398
|
+
error: { code: status.code, message: status.message, retryable: status.retryable },
|
|
399
|
+
stream: { done: true },
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
finally {
|
|
403
|
+
// The loop stopped before the end: the handler gets return()
|
|
404
|
+
if (!done)
|
|
405
|
+
await iterator.return?.();
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
send(frame) {
|
|
409
|
+
if (this.options.isOpen())
|
|
410
|
+
this.options.send(frame);
|
|
411
|
+
}
|
|
412
|
+
sendError(id, message, code) {
|
|
413
|
+
this.send({
|
|
414
|
+
id,
|
|
415
|
+
type: "error",
|
|
416
|
+
status: { type: "error", code, message, retryable: false },
|
|
417
|
+
error: { code, message, retryable: false },
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/** The error item of a call that its caller aborted. A retry does not repeat it. */
|
|
422
|
+
function abortedItem(id) {
|
|
423
|
+
return { id, status: { type: "error", code: "ABORTED", message: "Request was aborted", retryable: false }, payload: null, metadata: {} };
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../src/adapters/websocket/shared/rpc.ts"],"names":[],"mappings":"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"}
|