@procedures/client 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +43 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts +5 -0
  5. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  6. package/dist/adapters/http/client/transport.js +10 -4
  7. package/dist/adapters/http/client/transport.js.map +1 -1
  8. package/dist/adapters/http/server/ndjson.d.ts +73 -0
  9. package/dist/adapters/http/server/ndjson.d.ts.map +1 -0
  10. package/dist/adapters/http/server/ndjson.js +228 -0
  11. package/dist/adapters/http/server/ndjson.js.map +1 -0
  12. package/dist/adapters/http/server/transport.d.ts +9 -4
  13. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  14. package/dist/adapters/http/server/transport.js +19 -68
  15. package/dist/adapters/http/server/transport.js.map +1 -1
  16. package/dist/adapters/http/server/types.d.ts +15 -0
  17. package/dist/adapters/http/server/types.d.ts.map +1 -1
  18. package/dist/adapters/sequence.d.ts +14 -0
  19. package/dist/adapters/sequence.d.ts.map +1 -1
  20. package/dist/adapters/sequence.js +16 -0
  21. package/dist/adapters/sequence.js.map +1 -1
  22. package/dist/browser.d.ts +1 -1
  23. package/dist/browser.d.ts.map +1 -1
  24. package/dist/browser.js +3 -2
  25. package/dist/browser.js.map +1 -1
  26. package/dist/node.d.ts +6 -0
  27. package/dist/node.d.ts.map +1 -1
  28. package/dist/node.js +5 -0
  29. package/dist/node.js.map +1 -1
  30. package/dist/server/procedure-server.d.ts +4 -2
  31. package/dist/server/procedure-server.d.ts.map +1 -1
  32. package/dist/server/procedure-server.js +8 -5
  33. package/dist/server/procedure-server.js.map +1 -1
  34. package/dist/timers.d.ts +4 -0
  35. package/dist/timers.d.ts.map +1 -1
  36. package/dist/timers.js +3 -0
  37. package/dist/timers.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/adapters/http/client/transport.ts +10 -4
  40. package/src/adapters/http/server/ndjson.ts +259 -0
  41. package/src/adapters/http/server/transport.ts +20 -68
  42. package/src/adapters/http/server/types.ts +17 -0
  43. package/src/adapters/sequence.ts +18 -0
  44. package/src/browser.ts +3 -2
  45. package/src/node.ts +6 -0
  46. package/src/server/procedure-server.ts +8 -5
  47. package/src/timers.ts +7 -0
@@ -51,6 +51,11 @@ export declare class HttpTransport implements Transport {
51
51
  * or an `{"type":"error"}` line. A stream that ends without one of the last two is an error
52
52
  * that a retry can repair (the connection broke). An `item` or a `done` line whose `seq` is not
53
53
  * above the last one gives nothing. The item after a gap has `stream-gap` in its metadata.
54
+ *
55
+ * A blank line is a keep-alive line of the server. The reader skips it: it has no `seq`, so the
56
+ * check sees no gap, and the `timeout` of the first item continues. Each item of the stream,
57
+ * also its error item, has the metadata key `stream` with the value `true`
58
+ * (`STREAM_ITEM_METADATA_KEY`).
54
59
  */
55
60
  private readNdjson;
56
61
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/client/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAqBvD,OAAO,EACL,IAAI,EAcL,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,OAAO,EAAE,oBAAoB,EASxC;IAED;;;;;OAKG;IACI,IAAI,CAAC,IAAI,EAAE,IAAI,EACpB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GACrB,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAqHnC;IAED;;;;;OAKG;YACY,UAAU;IAiEzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;YACW,iBAAiB;IA0B/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/client/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAqBvD,OAAO,EACL,IAAI,EAcL,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,OAAO,EAAE,oBAAoB,EASxC;IAED;;;;;OAKG;IACI,IAAI,CAAC,IAAI,EAAE,IAAI,EACpB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GACrB,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAqHnC;IAED;;;;;;;;;;OAUG;YACY,UAAU;IAkEzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;YACW,iBAAiB;IA0B/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
@@ -5,7 +5,7 @@
5
5
  * shared utilities and injectable strategies.
6
6
  */
7
7
  import { DELIVERY_METADATA_KEY, RETRY_AFTER_METADATA_KEY, isNotSentError } from "../../../client/middleware/items.js";
8
- import { StreamSequence, itemMetadata } from "../../sequence.js";
8
+ import { StreamSequence, streamItemMetadata } from "../../sequence.js";
9
9
  /**
10
10
  * The wait that an error response asks for, in milliseconds: `retryAfterMs` of the body of the
11
11
  * server transport, or else the Retry-After header (seconds, or an HTTP date).
@@ -194,6 +194,11 @@ export class HttpTransport {
194
194
  * or an `{"type":"error"}` line. A stream that ends without one of the last two is an error
195
195
  * that a retry can repair (the connection broke). An `item` or a `done` line whose `seq` is not
196
196
  * above the last one gives nothing. The item after a gap has `stream-gap` in its metadata.
197
+ *
198
+ * A blank line is a keep-alive line of the server. The reader skips it: it has no `seq`, so the
199
+ * check sees no gap, and the `timeout` of the first item continues. Each item of the stream,
200
+ * also its error item, has the metadata key `stream` with the value `true`
201
+ * (`STREAM_ITEM_METADATA_KEY`).
197
202
  */
198
203
  async *readNdjson(id, body, metadata, onEnd, onFirstItem) {
199
204
  const reader = body.getReader();
@@ -210,6 +215,7 @@ export class HttpTransport {
210
215
  while ((newline = buffer.indexOf("\n")) >= 0) {
211
216
  const line = buffer.slice(0, newline).trim();
212
217
  buffer = buffer.slice(newline + 1);
218
+ // A keep-alive line of the server (WIRE-PROTOCOL.md)
213
219
  if (!line)
214
220
  continue;
215
221
  const frame = JSON.parse(line);
@@ -219,7 +225,7 @@ export class HttpTransport {
219
225
  if (gap < 0)
220
226
  continue;
221
227
  if (frame.type === "item") {
222
- yield { id, status: { type: "success", code: 200 }, payload: frame.payload, metadata: itemMetadata(metadata, gap) };
228
+ yield { id, status: { type: "success", code: 200 }, payload: frame.payload, metadata: streamItemMetadata(metadata, gap) };
223
229
  }
224
230
  else if (frame.type === "done") {
225
231
  onEnd();
@@ -236,7 +242,7 @@ export class HttpTransport {
236
242
  retryable: frame.error?.retryable ?? false,
237
243
  },
238
244
  payload: null,
239
- metadata,
245
+ metadata: streamItemMetadata(metadata, 0),
240
246
  };
241
247
  return;
242
248
  }
@@ -247,7 +253,7 @@ export class HttpTransport {
247
253
  id,
248
254
  status: { type: "error", code: "STREAM_ENDED", message: "The stream ended without its end line", retryable: true },
249
255
  payload: null,
250
- metadata: { ...metadata, [DELIVERY_METADATA_KEY]: "indeterminate" },
256
+ metadata: { ...streamItemMetadata(metadata, 0), [DELIVERY_METADATA_KEY]: "indeterminate" },
251
257
  };
252
258
  }
253
259
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/adapters/http/client/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/adapters/http/client/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The writer of an NDJSON stream response (wire protocol v1, `documentation/WIRE-PROTOCOL.md`).
3
+ *
4
+ * `HttpServerTransport` writes each NDJSON stream with `writeNdjsonStream`. A server without
5
+ * Express can use the function too: it takes a `ServerResponse` of `node:http`. This module
6
+ * imports only the types of `node:http`, so it loads no Node code at run time.
7
+ */
8
+ import type { ServerResponse } from "node:http";
9
+ import { type Clock } from "../../../clock.js";
10
+ import { type Duration } from "../../../duration.js";
11
+ /** The media type of a stream response: one JSON value on each line. */
12
+ export declare const NDJSON_MEDIA_TYPE = "application/x-ndjson";
13
+ /** The keep-alive line of an NDJSON stream: a blank line. A reader skips it. It has no `seq`. */
14
+ export declare const KEEP_ALIVE_LINE = "\n";
15
+ /** The error of an `error` line: its code, its message and its retryable flag. */
16
+ export interface NdjsonError {
17
+ code: string;
18
+ message: string;
19
+ retryable: boolean;
20
+ }
21
+ /** The options of `writeNdjsonStream`. */
22
+ export interface WriteNdjsonStreamOptions {
23
+ /**
24
+ * The signal of the request. Its abort stops the stream. The iterator of the items gets
25
+ * `return()`, and a response that is still open gets the error line `ABORTED`.
26
+ */
27
+ readonly signal?: AbortSignal | undefined;
28
+ /**
29
+ * The quiet time after which the writer sends a keep-alive line. Each line starts the time again.
30
+ * `false`, or a duration of zero or less, sends no keep-alive line.
31
+ * @default seconds(15) (`TIMER_DEFAULTS.httpServer.keepAliveMs`)
32
+ */
33
+ readonly keepAlive?: Duration | false | undefined;
34
+ /**
35
+ * The function that gives the `error` line of an error of the stream. The default gives the code
36
+ * of the error (`errorCodeOf`), its message and its own retryable flag, or `false`.
37
+ */
38
+ readonly errorOf?: ((error: unknown) => NdjsonError) | undefined;
39
+ /**
40
+ * The clock of the keep-alive timer (roadmap R35). The default is the clock of the platform. A
41
+ * test gives a fake clock.
42
+ */
43
+ readonly clock?: Clock | undefined;
44
+ }
45
+ /**
46
+ * This function gives the `error` line of a thrown error: its code, its message and its retryable
47
+ * flag (deep dive TRN-7). A code that is not a string gives `HANDLER_ERROR`.
48
+ */
49
+ export declare function defaultNdjsonError(error: unknown): NdjsonError;
50
+ /**
51
+ * This function gives the keep-alive time in milliseconds, or 0 for no keep-alive. A value that is
52
+ * not a duration throws a `TypeError`.
53
+ */
54
+ export declare function keepAliveMsOf(keepAlive: Duration | false | undefined): number;
55
+ /**
56
+ * This function writes a stream of items as an NDJSON response of wire protocol v1.
57
+ *
58
+ * - It writes the status 200, the headers `Content-Type: application/x-ndjson`,
59
+ * `Cache-Control: no-cache` and `Procedures-Protocol: 1`, and it sends them at once.
60
+ * - Each item gives the line `{"type":"item","seq":n,"payload":...}`. The `seq` counts from 1.
61
+ * - The end of the items gives `{"type":"done","seq":n}`. An error gives
62
+ * `{"type":"error","error":{"code":...,"message":...,"retryable":...}}`, without `seq`.
63
+ * - After each quiet time of `keepAlive`, it writes a keep-alive line: a blank line. Each line
64
+ * starts the time again. No keep-alive line comes after the last line.
65
+ * - When `write()` gives false, it waits for `drain` before it reads the next item.
66
+ * - A closed connection or an abort of `signal` stops it. The iterator gets `return()`. After an
67
+ * abort, a response that is still open gets the error line `ABORTED`.
68
+ *
69
+ * The promise resolves when the response ends. It does not reject: an error of the items becomes
70
+ * the error line.
71
+ */
72
+ export declare function writeNdjsonStream(res: ServerResponse, items: AsyncIterable<unknown>, options?: WriteNdjsonStreamOptions): Promise<void>;
73
+ //# sourceMappingURL=ndjson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/server/ndjson.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAA0B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAI3D,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,yBAAyB,CAAC;AAExD,iGAAiG;AACjG,eAAO,MAAM,eAAe,OAAO,CAAC;AAKpC,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,WAAW,CAAC,GAAG,SAAS,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAO9D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAK7E;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHjJ"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * The writer of an NDJSON stream response (wire protocol v1, `documentation/WIRE-PROTOCOL.md`).
3
+ *
4
+ * `HttpServerTransport` writes each NDJSON stream with `writeNdjsonStream`. A server without
5
+ * Express can use the function too: it takes a `ServerResponse` of `node:http`. This module
6
+ * imports only the types of `node:http`, so it loads no Node code at run time.
7
+ */
8
+ import { realClock } from "../../../clock.js";
9
+ import { toMs } from "../../../duration.js";
10
+ import { PROTOCOL_HEADER, PROTOCOL_VERSION, errorCodeOf } from "../../../protocol.js";
11
+ import { TIMER_DEFAULTS } from "../../../timers.js";
12
+ /** The media type of a stream response: one JSON value on each line. */
13
+ export const NDJSON_MEDIA_TYPE = "application/x-ndjson";
14
+ /** The keep-alive line of an NDJSON stream: a blank line. A reader skips it. It has no `seq`. */
15
+ export const KEEP_ALIVE_LINE = "\n";
16
+ /** The longest delay of a Node timer. A longer delay starts the timer at once. */
17
+ const MAX_TIMER_DELAY_MS = 2_147_483_647;
18
+ /**
19
+ * This function gives the `error` line of a thrown error: its code, its message and its retryable
20
+ * flag (deep dive TRN-7). A code that is not a string gives `HANDLER_ERROR`.
21
+ */
22
+ export function defaultNdjsonError(error) {
23
+ const retryable = error?.retryable;
24
+ return {
25
+ code: errorCodeOf(error),
26
+ message: error instanceof Error ? error.message : String(error),
27
+ retryable: typeof retryable === "boolean" ? retryable : false,
28
+ };
29
+ }
30
+ /**
31
+ * This function gives the keep-alive time in milliseconds, or 0 for no keep-alive. A value that is
32
+ * not a duration throws a `TypeError`.
33
+ */
34
+ export function keepAliveMsOf(keepAlive) {
35
+ if (keepAlive === false)
36
+ return 0;
37
+ if (keepAlive === undefined)
38
+ return TIMER_DEFAULTS.httpServer.keepAliveMs;
39
+ const value = toMs(keepAlive, "keepAlive");
40
+ return value > 0 ? Math.min(value, MAX_TIMER_DELAY_MS) : 0;
41
+ }
42
+ /** One JSON line of the stream. */
43
+ function lineOf(frame) {
44
+ return `${JSON.stringify(frame)}\n`;
45
+ }
46
+ /**
47
+ * This function gives the next result of the iterator, or `undefined` when the stop signal
48
+ * aborts first. Thus a quiet iterator does not keep a stopped stream open. The listener goes
49
+ * away after each step, so a long stream adds no listener.
50
+ */
51
+ function nextOrStop(iterator, stop) {
52
+ if (stop.aborted)
53
+ return Promise.resolve(undefined);
54
+ return new Promise((resolve, reject) => {
55
+ const onStop = () => resolve(undefined);
56
+ stop.addEventListener("abort", onStop, { once: true });
57
+ Promise.resolve(iterator.next()).then((result) => {
58
+ stop.removeEventListener("abort", onStop);
59
+ resolve(result);
60
+ }, (error) => {
61
+ stop.removeEventListener("abort", onStop);
62
+ reject(error);
63
+ });
64
+ });
65
+ }
66
+ /**
67
+ * This function waits until the response can take more data: the `drain` event. A closed
68
+ * connection or the stop signal also ends the wait (deep dive TRN-3).
69
+ */
70
+ function drained(res, stop) {
71
+ if (stop.aborted)
72
+ return Promise.resolve();
73
+ return new Promise((resolve) => {
74
+ const done = () => {
75
+ res.off("drain", done);
76
+ res.off("close", done);
77
+ stop.removeEventListener("abort", done);
78
+ resolve();
79
+ };
80
+ res.on("drain", done);
81
+ res.on("close", done);
82
+ stop.addEventListener("abort", done, { once: true });
83
+ });
84
+ }
85
+ /**
86
+ * This function writes a stream of items as an NDJSON response of wire protocol v1.
87
+ *
88
+ * - It writes the status 200, the headers `Content-Type: application/x-ndjson`,
89
+ * `Cache-Control: no-cache` and `Procedures-Protocol: 1`, and it sends them at once.
90
+ * - Each item gives the line `{"type":"item","seq":n,"payload":...}`. The `seq` counts from 1.
91
+ * - The end of the items gives `{"type":"done","seq":n}`. An error gives
92
+ * `{"type":"error","error":{"code":...,"message":...,"retryable":...}}`, without `seq`.
93
+ * - After each quiet time of `keepAlive`, it writes a keep-alive line: a blank line. Each line
94
+ * starts the time again. No keep-alive line comes after the last line.
95
+ * - When `write()` gives false, it waits for `drain` before it reads the next item.
96
+ * - A closed connection or an abort of `signal` stops it. The iterator gets `return()`. After an
97
+ * abort, a response that is still open gets the error line `ABORTED`.
98
+ *
99
+ * The promise resolves when the response ends. It does not reject: an error of the items becomes
100
+ * the error line.
101
+ */
102
+ export async function writeNdjsonStream(res, items, options = {}) {
103
+ const interval = keepAliveMsOf(options.keepAlive);
104
+ const clock = options.clock ?? realClock;
105
+ const errorOf = options.errorOf ?? defaultNdjsonError;
106
+ const { signal } = options;
107
+ // One stop for the abort of the caller and for a closed connection
108
+ const stop = new AbortController();
109
+ const onAbort = () => stop.abort();
110
+ const onClose = () => {
111
+ if (!res.writableFinished)
112
+ stop.abort();
113
+ };
114
+ if (signal?.aborted || res.destroyed)
115
+ stop.abort();
116
+ signal?.addEventListener("abort", onAbort, { once: true });
117
+ res.on("close", onClose);
118
+ // The keep-alive timer. Each line starts the quiet time again, but a line does not start a new
119
+ // timer: when the timer comes due, it examines the time of the last line. Thus a fast stream
120
+ // has one timer for each quiet time, not one for each item.
121
+ let timer;
122
+ let lastLine = 0;
123
+ const stopTimer = () => {
124
+ timer?.();
125
+ timer = undefined;
126
+ };
127
+ const arm = (delay) => {
128
+ timer = clock.after(delay, keepAlive);
129
+ timer.unref?.();
130
+ };
131
+ /** This function records a line: the quiet time starts again. */
132
+ const startTimer = () => {
133
+ lastLine = clock.now();
134
+ if (timer === undefined && interval > 0 && !stop.signal.aborted && !res.writableEnded)
135
+ arm(interval);
136
+ };
137
+ function keepAlive() {
138
+ timer = undefined;
139
+ if (stop.signal.aborted || res.writableEnded || res.destroyed)
140
+ return;
141
+ const quiet = clock.now() - lastLine;
142
+ if (quiet < interval) {
143
+ // A line went out after the start of this timer: wait for the rest of the quiet time
144
+ arm(interval - quiet);
145
+ return;
146
+ }
147
+ // A full buffer waits for the reader. One more byte there does not reach the reader sooner.
148
+ if (!res.writableNeedDrain)
149
+ res.write(KEEP_ALIVE_LINE);
150
+ startTimer();
151
+ }
152
+ /** This function ends an open response after an abort: the server stopped the request. */
153
+ const endAborted = () => {
154
+ if (!res.writableEnded && !res.destroyed) {
155
+ res.end(lineOf({ type: "error", error: { code: "ABORTED", message: "The server stopped the request", retryable: true } }));
156
+ }
157
+ };
158
+ const iterator = items[Symbol.asyncIterator]();
159
+ /** True when the iterator ended by itself: at its end, or with an error */
160
+ let ended = false;
161
+ let seq = 0;
162
+ try {
163
+ if (!res.headersSent && !res.destroyed) {
164
+ res.statusCode = 200;
165
+ res.setHeader(PROTOCOL_HEADER, String(PROTOCOL_VERSION));
166
+ res.setHeader("Content-Type", NDJSON_MEDIA_TYPE);
167
+ res.setHeader("Cache-Control", "no-cache");
168
+ res.flushHeaders();
169
+ }
170
+ startTimer();
171
+ for (;;) {
172
+ let next;
173
+ try {
174
+ next = await nextOrStop(iterator, stop.signal);
175
+ }
176
+ catch (error) {
177
+ ended = true;
178
+ throw error;
179
+ }
180
+ if (next === undefined)
181
+ break;
182
+ if (next.done) {
183
+ ended = true;
184
+ break;
185
+ }
186
+ if (stop.signal.aborted)
187
+ break;
188
+ const room = res.write(lineOf({ type: "item", seq: ++seq, payload: next.value }));
189
+ startTimer();
190
+ if (!room)
191
+ await drained(res, stop.signal);
192
+ if (stop.signal.aborted)
193
+ break;
194
+ }
195
+ stopTimer();
196
+ if (stop.signal.aborted) {
197
+ endAborted();
198
+ return;
199
+ }
200
+ res.end(lineOf({ type: "done", seq: ++seq }));
201
+ }
202
+ catch (error) {
203
+ stopTimer();
204
+ if (stop.signal.aborted) {
205
+ endAborted();
206
+ return;
207
+ }
208
+ let info;
209
+ try {
210
+ info = errorOf(error);
211
+ }
212
+ catch {
213
+ // A failed errorOf does not leave the response open
214
+ info = defaultNdjsonError(error);
215
+ }
216
+ res.end(lineOf({ type: "error", error: info }));
217
+ }
218
+ finally {
219
+ stopTimer();
220
+ signal?.removeEventListener("abort", onAbort);
221
+ res.off("close", onClose);
222
+ // A stream that stopped early: its producer stops too. A pending next() keeps the return()
223
+ // waiting, so the writer does not wait for it.
224
+ if (!ended)
225
+ void Promise.resolve().then(() => iterator.return?.()).catch(() => undefined);
226
+ }
227
+ }
228
+ //# sourceMappingURL=ndjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ndjson.js","sourceRoot":"","sources":["../../../../src/adapters/http/server/ndjson.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,10 @@ export declare class HttpServerTransport implements ServerTransport {
19
19
  private readonly bodyLimit;
20
20
  /** The browser checks of each procedure call (see `server/browser-guard.ts`) */
21
21
  private readonly guard;
22
+ /** The quiet time of an NDJSON stream before a keep-alive line, or false for none */
23
+ private readonly keepAlive;
24
+ /** The clock of the keep-alive timers (roadmap R35) */
25
+ private readonly clock;
22
26
  constructor(server: RequestHandler, options?: HttpServerTransportOptions);
23
27
  /**
24
28
  * Setup Express routes.
@@ -36,20 +40,21 @@ export declare class HttpServerTransport implements ServerTransport {
36
40
  * a string (deep dive TRN-10).
37
41
  */
38
42
  private readBody;
39
- /**
40
- * Convert HTTP request to ServerRequest.
41
- */
42
43
  /**
43
44
  * Send a stream response.
44
45
  *
45
46
  * A client that accepts `application/x-ndjson` gets one JSON line for each item
46
47
  * (`{"type":"item","seq":1,"payload":...}`), then `{"type":"done","seq":...}`, or
47
48
  * `{"type":"error","error":...}`. The `seq` of the lines counts from 1, as in the `stream`
48
- * frames of WebSocket.
49
+ * frames of WebSocket. A quiet stream gets a keep-alive line, a blank line, after each quiet
50
+ * time of `keepAlive`. `writeNdjsonStream` writes these lines.
49
51
  * Another client (curl, a browser fetch without the header) gets the last item as plain JSON,
50
52
  * the "sponge" mode, so a streaming procedure does not change its response format.
51
53
  */
52
54
  private streamToHttp;
55
+ /**
56
+ * This method converts an HTTP request to a `ServerRequest`.
57
+ */
53
58
  private httpToServerRequest;
54
59
  /**
55
60
  * Convert ServerResponse to HTTP response.
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/server/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAiC,MAAM,0BAA0B,CAAC;AAE/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAuF7D,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,OAAO,CAQb;IACF,OAAO,CAAC,MAAM,CAAiB;IAC/B,yFAAyF;IACzF,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAE5C,YAAY,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,0BAA+B,EAiC3E;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAgFnB;;;OAGG;YACW,iBAAiB;IAuE/B;;;;;OAKG;YACW,QAAQ;IAoBtB;;OAEG;IACH;;;;;;;;;OASG;YACW,YAAY;IAmF1B,OAAO,CAAC,mBAAmB;IAoG3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyDtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B3B;IAED;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB1B;IAED,SAAS,IAAI,OAAO,CAEnB;CACF"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/server/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAiC,MAAM,0BAA0B,CAAC;AAE/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAyD7D,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,OAAO,CAQb;IACF,OAAO,CAAC,MAAM,CAAiB;IAC/B,yFAAyF;IACzF,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,YAAY,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,0BAA+B,EAqC3E;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAgFnB;;;OAGG;YACW,iBAAiB;IAuE/B;;;;;OAKG;YACW,QAAQ;IAoBtB;;;;;;;;;;OAUG;YACW,YAAY;IAwD1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoG3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyDtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA2B3B;IAED;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB1B;IAED,SAAS,IAAI,OAAO,CAEnB;CACF"}
@@ -10,9 +10,10 @@ import { ERROR_REGISTRY } from "../../../client/errors/index.js";
10
10
  import { createPatternServerUrlStrategy } from "./strategies.js";
11
11
  import { checkBrowserRequest } from "../../../server/browser-guard.js";
12
12
  import { bearerOf, withoutSecretHeaders } from "../../../server/request-auth.js";
13
- import { PROTOCOL_HEADER, PROTOCOL_VERSION, errorCodeOf, httpStatusOf, protocolVersionOf } from "../../../protocol.js";
14
- /** The media type of a stream response: one JSON value on each line. */
15
- const NDJSON = "application/x-ndjson";
13
+ import { PROTOCOL_HEADER, PROTOCOL_VERSION, httpStatusOf, protocolVersionOf } from "../../../protocol.js";
14
+ import { realClock } from "../../../clock.js";
15
+ import { ms } from "../../../duration.js";
16
+ import { NDJSON_MEDIA_TYPE as NDJSON, defaultNdjsonError as errorOf, keepAliveMsOf, writeNdjsonStream } from "./ndjson.js";
16
17
  /** True when a stream response can run without an end (`STREAM_METADATA_KEY` of procedure-server.ts). */
17
18
  function isUnboundedStream(response) {
18
19
  return response.metadata?.["stream"] === "unbounded";
@@ -27,35 +28,6 @@ class BodyError extends Error {
27
28
  this.httpStatus = httpStatus;
28
29
  }
29
30
  }
30
- /** The code and message of a thrown error, with its retryable flag (deep dive TRN-7). */
31
- function errorOf(error) {
32
- const retryable = error?.retryable;
33
- return {
34
- code: errorCodeOf(error),
35
- message: error instanceof Error ? error.message : String(error),
36
- retryable: typeof retryable === "boolean" ? retryable : false,
37
- };
38
- }
39
- /**
40
- * Write one chunk. When the response's buffer is full, wait for "drain", or for the end of the
41
- * request (deep dive TRN-3: before, the server ignored the result of write() and ran a stream
42
- * to its end whatever the reader did).
43
- */
44
- function write(res, chunk, signal) {
45
- if (res.write(chunk) || signal.aborted)
46
- return Promise.resolve();
47
- return new Promise((resolve) => {
48
- const done = () => {
49
- res.off("drain", done);
50
- res.off("close", done);
51
- signal.removeEventListener("abort", done);
52
- resolve();
53
- };
54
- res.on("drain", done);
55
- res.on("close", done);
56
- signal.addEventListener("abort", done, { once: true });
57
- });
58
- }
59
31
  /**
60
32
  * HTTP server transport adapter for Express.
61
33
  *
@@ -99,6 +71,10 @@ export class HttpServerTransport {
99
71
  bodyLimit;
100
72
  /** The browser checks of each procedure call (see `server/browser-guard.ts`) */
101
73
  guard;
74
+ /** The quiet time of an NDJSON stream before a keep-alive line, or false for none */
75
+ keepAlive;
76
+ /** The clock of the keep-alive timers (roadmap R35) */
77
+ clock;
102
78
  constructor(server, options = {}) {
103
79
  this.server = server;
104
80
  const basePath = options.basePath ?? "/api";
@@ -115,6 +91,10 @@ export class HttpServerTransport {
115
91
  httpServer: options.httpServer,
116
92
  };
117
93
  this.bodyLimit = options.bodyLimit ?? 1024 * 1024;
94
+ // A value that is not a duration fails here, not at the first stream
95
+ const keepAliveMs = keepAliveMsOf(options.keepAlive);
96
+ this.keepAlive = keepAliveMs > 0 ? ms(keepAliveMs) : false;
97
+ this.clock = options.clock ?? realClock;
118
98
  this.guard = {
119
99
  allowedOrigins: options.allowedOrigins ?? corsOrigins(options),
120
100
  allowedHosts: options.allowedHosts,
@@ -304,16 +284,14 @@ export class HttpServerTransport {
304
284
  throw new BodyError("The request body is not valid JSON", 400);
305
285
  }
306
286
  }
307
- /**
308
- * Convert HTTP request to ServerRequest.
309
- */
310
287
  /**
311
288
  * Send a stream response.
312
289
  *
313
290
  * A client that accepts `application/x-ndjson` gets one JSON line for each item
314
291
  * (`{"type":"item","seq":1,"payload":...}`), then `{"type":"done","seq":...}`, or
315
292
  * `{"type":"error","error":...}`. The `seq` of the lines counts from 1, as in the `stream`
316
- * frames of WebSocket.
293
+ * frames of WebSocket. A quiet stream gets a keep-alive line, a blank line, after each quiet
294
+ * time of `keepAlive`. `writeNdjsonStream` writes these lines.
317
295
  * Another client (curl, a browser fetch without the header) gets the last item as plain JSON,
318
296
  * the "sponge" mode, so a streaming procedure does not change its response format.
319
297
  */
@@ -356,39 +334,12 @@ export class HttpServerTransport {
356
334
  this.serverResponseToHttp({ id: response.id, status: response.status, metadata: response.metadata, payload: last.value }, res);
357
335
  return;
358
336
  }
359
- res.status(200);
360
- res.setHeader("Content-Type", NDJSON);
361
- res.setHeader("Cache-Control", "no-cache");
362
- res.flushHeaders();
363
- // stop() aborted the request while the reader still listens: end the stream with an error
364
- const endAborted = () => {
365
- if (!res.writableEnded && !res.destroyed) {
366
- res.end(JSON.stringify({ type: "error", error: { code: "ABORTED", message: "The server stopped the request", retryable: true } }) + "\n");
367
- }
368
- };
369
- let seq = 0;
370
- try {
371
- for await (const item of stream) {
372
- if (signal.aborted)
373
- break;
374
- await write(res, JSON.stringify({ type: "item", seq: ++seq, payload: item }) + "\n", signal);
375
- if (signal.aborted)
376
- break;
377
- }
378
- if (signal.aborted) {
379
- endAborted();
380
- return;
381
- }
382
- res.end(JSON.stringify({ type: "done", seq: ++seq }) + "\n");
383
- }
384
- catch (error) {
385
- if (signal.aborted) {
386
- endAborted();
387
- return;
388
- }
389
- res.end(JSON.stringify({ type: "error", error: errorOf(error) }) + "\n");
390
- }
337
+ // The lines, the backpressure, the keep-alive and the abort of stop() (WIRE-PROTOCOL.md)
338
+ await writeNdjsonStream(res, stream, { signal, keepAlive: this.keepAlive, errorOf, clock: this.clock });
391
339
  }
340
+ /**
341
+ * This method converts an HTTP request to a `ServerRequest`.
342
+ */
392
343
  httpToServerRequest(req, body) {
393
344
  // Parse method from URL using strategy
394
345
  const method = this.options.urlStrategy(req);