@procedures/client 0.8.0 → 0.9.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 (197) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +95 -8
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts +4 -0
  5. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  6. package/dist/adapters/http/client/transport.js +11 -1
  7. package/dist/adapters/http/client/transport.js.map +1 -1
  8. package/dist/adapters/http/client/types.d.ts +19 -0
  9. package/dist/adapters/http/client/types.d.ts.map +1 -1
  10. package/dist/adapters/http/server/cors.d.ts +64 -0
  11. package/dist/adapters/http/server/cors.d.ts.map +1 -0
  12. package/dist/adapters/http/server/cors.js +113 -0
  13. package/dist/adapters/http/server/cors.js.map +1 -0
  14. package/dist/adapters/http/server/handler.d.ts +136 -0
  15. package/dist/adapters/http/server/handler.d.ts.map +1 -0
  16. package/dist/adapters/http/server/handler.js +495 -0
  17. package/dist/adapters/http/server/handler.js.map +1 -0
  18. package/dist/adapters/http/server/strategies.d.ts +14 -5
  19. package/dist/adapters/http/server/strategies.d.ts.map +1 -1
  20. package/dist/adapters/http/server/strategies.js.map +1 -1
  21. package/dist/adapters/http/server/transport.d.ts +30 -46
  22. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  23. package/dist/adapters/http/server/transport.js +48 -432
  24. package/dist/adapters/http/server/transport.js.map +1 -1
  25. package/dist/adapters/http/server/types.d.ts +13 -0
  26. package/dist/adapters/http/server/types.d.ts.map +1 -1
  27. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  28. package/dist/adapters/websocket/client/transport.js +4 -12
  29. package/dist/adapters/websocket/client/transport.js.map +1 -1
  30. package/dist/adapters/websocket/server/transport.d.ts +46 -1
  31. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  32. package/dist/adapters/websocket/server/transport.js +152 -15
  33. package/dist/adapters/websocket/server/transport.js.map +1 -1
  34. package/dist/adapters/websocket/server/types.d.ts +10 -3
  35. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  36. package/dist/adapters/websocket/server/upgrade-router.d.ts +28 -0
  37. package/dist/adapters/websocket/server/upgrade-router.d.ts.map +1 -0
  38. package/dist/adapters/websocket/server/upgrade-router.js +62 -0
  39. package/dist/adapters/websocket/server/upgrade-router.js.map +1 -0
  40. package/dist/adapters/websocket/server/upgrade.d.ts +68 -0
  41. package/dist/adapters/websocket/server/upgrade.d.ts.map +1 -0
  42. package/dist/adapters/websocket/server/upgrade.js +49 -0
  43. package/dist/adapters/websocket/server/upgrade.js.map +1 -0
  44. package/dist/adapters/websocket/shared/rpc.d.ts +2 -0
  45. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -1
  46. package/dist/adapters/websocket/shared/rpc.js +8 -2
  47. package/dist/adapters/websocket/shared/rpc.js.map +1 -1
  48. package/dist/browser.d.ts +12 -4
  49. package/dist/browser.d.ts.map +1 -1
  50. package/dist/browser.js +13 -2
  51. package/dist/browser.js.map +1 -1
  52. package/dist/client/client.d.ts +43 -0
  53. package/dist/client/client.d.ts.map +1 -1
  54. package/dist/client/client.js +69 -1
  55. package/dist/client/client.js.map +1 -1
  56. package/dist/events/publisher.d.ts +25 -1
  57. package/dist/events/publisher.d.ts.map +1 -1
  58. package/dist/events/publisher.js +66 -9
  59. package/dist/events/publisher.js.map +1 -1
  60. package/dist/events/rows.d.ts +31 -0
  61. package/dist/events/rows.d.ts.map +1 -0
  62. package/dist/events/rows.js +39 -0
  63. package/dist/events/rows.js.map +1 -0
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/node.d.ts +14 -0
  69. package/dist/node.d.ts.map +1 -1
  70. package/dist/node.js +9 -0
  71. package/dist/node.js.map +1 -1
  72. package/dist/procedures/capability.d.ts +6 -0
  73. package/dist/procedures/capability.d.ts.map +1 -1
  74. package/dist/procedures/capability.js +25 -0
  75. package/dist/procedures/capability.js.map +1 -1
  76. package/dist/procedures/collection/changes.d.ts +94 -0
  77. package/dist/procedures/collection/changes.d.ts.map +1 -0
  78. package/dist/procedures/collection/changes.js +182 -0
  79. package/dist/procedures/collection/changes.js.map +1 -0
  80. package/dist/procedures/collection/index.d.ts +10 -3
  81. package/dist/procedures/collection/index.d.ts.map +1 -1
  82. package/dist/procedures/collection/index.js +8 -1
  83. package/dist/procedures/collection/index.js.map +1 -1
  84. package/dist/procedures/collection/partition.d.ts +67 -0
  85. package/dist/procedures/collection/partition.d.ts.map +1 -0
  86. package/dist/procedures/collection/partition.js +82 -0
  87. package/dist/procedures/collection/partition.js.map +1 -0
  88. package/dist/procedures/collection/procedures.d.ts +39 -2
  89. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  90. package/dist/procedures/collection/procedures.js +147 -44
  91. package/dist/procedures/collection/procedures.js.map +1 -1
  92. package/dist/procedures/collection/query.d.ts +246 -0
  93. package/dist/procedures/collection/query.d.ts.map +1 -0
  94. package/dist/procedures/collection/query.js +854 -0
  95. package/dist/procedures/collection/query.js.map +1 -0
  96. package/dist/procedures/collection/schemas.d.ts +50 -0
  97. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  98. package/dist/procedures/collection/schemas.js +144 -6
  99. package/dist/procedures/collection/schemas.js.map +1 -1
  100. package/dist/procedures/collection/storage.d.ts +58 -6
  101. package/dist/procedures/collection/storage.d.ts.map +1 -1
  102. package/dist/procedures/collection/storage.js +23 -0
  103. package/dist/procedures/collection/storage.js.map +1 -1
  104. package/dist/procedures/elicit.d.ts +190 -0
  105. package/dist/procedures/elicit.d.ts.map +1 -0
  106. package/dist/procedures/elicit.js +127 -0
  107. package/dist/procedures/elicit.js.map +1 -0
  108. package/dist/procedures/hints.d.ts +43 -0
  109. package/dist/procedures/hints.d.ts.map +1 -0
  110. package/dist/procedures/hints.js +74 -0
  111. package/dist/procedures/hints.js.map +1 -0
  112. package/dist/procedures/index.d.ts +9 -2
  113. package/dist/procedures/index.d.ts.map +1 -1
  114. package/dist/procedures/index.js +5 -1
  115. package/dist/procedures/index.js.map +1 -1
  116. package/dist/procedures/invoke.d.ts +24 -2
  117. package/dist/procedures/invoke.d.ts.map +1 -1
  118. package/dist/procedures/invoke.js +14 -1
  119. package/dist/procedures/invoke.js.map +1 -1
  120. package/dist/procedures/progress.d.ts +24 -0
  121. package/dist/procedures/progress.d.ts.map +1 -0
  122. package/dist/procedures/progress.js +11 -0
  123. package/dist/procedures/progress.js.map +1 -0
  124. package/dist/procedures/registry.d.ts.map +1 -1
  125. package/dist/procedures/registry.js +5 -0
  126. package/dist/procedures/registry.js.map +1 -1
  127. package/dist/procedures/types.d.ts +55 -0
  128. package/dist/procedures/types.d.ts.map +1 -1
  129. package/dist/procedures/types.js.map +1 -1
  130. package/dist/procedures/untrusted.d.ts +28 -0
  131. package/dist/procedures/untrusted.d.ts.map +1 -0
  132. package/dist/procedures/untrusted.js +32 -0
  133. package/dist/procedures/untrusted.js.map +1 -0
  134. package/dist/server/browser-guard.d.ts +12 -2
  135. package/dist/server/browser-guard.d.ts.map +1 -1
  136. package/dist/server/browser-guard.js +43 -6
  137. package/dist/server/browser-guard.js.map +1 -1
  138. package/dist/server/host-policy.d.ts +10 -1
  139. package/dist/server/host-policy.d.ts.map +1 -1
  140. package/dist/server/host-policy.js +5 -0
  141. package/dist/server/host-policy.js.map +1 -1
  142. package/dist/server/index.d.ts +1 -1
  143. package/dist/server/index.d.ts.map +1 -1
  144. package/dist/server/index.js.map +1 -1
  145. package/dist/server/procedure-server.d.ts +68 -7
  146. package/dist/server/procedure-server.d.ts.map +1 -1
  147. package/dist/server/procedure-server.js +124 -24
  148. package/dist/server/procedure-server.js.map +1 -1
  149. package/dist/server/request-auth.d.ts +51 -4
  150. package/dist/server/request-auth.d.ts.map +1 -1
  151. package/dist/server/request-auth.js +116 -5
  152. package/dist/server/request-auth.js.map +1 -1
  153. package/dist/server/types.d.ts +73 -5
  154. package/dist/server/types.d.ts.map +1 -1
  155. package/dist/server/types.js.map +1 -1
  156. package/package.json +7 -3
  157. package/src/adapters/http/client/transport.ts +11 -1
  158. package/src/adapters/http/client/types.ts +22 -0
  159. package/src/adapters/http/server/cors.ts +144 -0
  160. package/src/adapters/http/server/handler.ts +624 -0
  161. package/src/adapters/http/server/strategies.ts +16 -6
  162. package/src/adapters/http/server/transport.ts +55 -478
  163. package/src/adapters/http/server/types.ts +15 -0
  164. package/src/adapters/websocket/client/transport.ts +4 -12
  165. package/src/adapters/websocket/server/transport.ts +166 -16
  166. package/src/adapters/websocket/server/types.ts +11 -3
  167. package/src/adapters/websocket/server/upgrade-router.ts +77 -0
  168. package/src/adapters/websocket/server/upgrade.ts +88 -0
  169. package/src/adapters/websocket/shared/rpc.ts +9 -2
  170. package/src/browser.ts +85 -2
  171. package/src/client/client.ts +83 -1
  172. package/src/events/publisher.ts +75 -11
  173. package/src/events/rows.ts +48 -0
  174. package/src/index.ts +1 -1
  175. package/src/node.ts +21 -0
  176. package/src/procedures/capability.ts +21 -0
  177. package/src/procedures/collection/changes.ts +245 -0
  178. package/src/procedures/collection/index.ts +57 -1
  179. package/src/procedures/collection/partition.ts +123 -0
  180. package/src/procedures/collection/procedures.ts +206 -51
  181. package/src/procedures/collection/query.ts +1009 -0
  182. package/src/procedures/collection/schemas.ts +196 -7
  183. package/src/procedures/collection/storage.ts +78 -6
  184. package/src/procedures/elicit.ts +320 -0
  185. package/src/procedures/hints.ts +91 -0
  186. package/src/procedures/index.ts +83 -2
  187. package/src/procedures/invoke.ts +33 -2
  188. package/src/procedures/progress.ts +25 -0
  189. package/src/procedures/registry.ts +4 -0
  190. package/src/procedures/types.ts +65 -0
  191. package/src/procedures/untrusted.ts +50 -0
  192. package/src/server/browser-guard.ts +48 -6
  193. package/src/server/host-policy.ts +13 -1
  194. package/src/server/index.ts +3 -0
  195. package/src/server/procedure-server.ts +147 -26
  196. package/src/server/request-auth.ts +128 -6
  197. package/src/server/types.ts +82 -5
@@ -0,0 +1,495 @@
1
+ /**
2
+ * The procedure handler of HTTP: a request handler of `node:http`, without a framework (CLI-3).
3
+ *
4
+ * `procedureHandler(server, options)` gives a function `(req, res) => boolean`. The function takes
5
+ * each request whose path is under `basePath` and gives `true`. It gives `false` for each other
6
+ * request and does not touch it, so the routes of the application get it. A mount list of a
7
+ * listener ("first match wins") can hold it next to other handlers. The wire is the wire of
8
+ * `HttpServerTransport` (`documentation/WIRE-PROTOCOL.md`). It has the URL of the method, the JSON
9
+ * body and the NDJSON streams of `writeNdjsonStream` with `seq` and keep-alive lines. It also has
10
+ * the error codes, the idempotency keys, the deadlines, the events and the browser checks.
11
+ *
12
+ * The handler also has the stop parts of a service transport: `start()`, `stopIntake()`,
13
+ * `drain(deadline, signal)`, `inFlight()` and `close()`. The handler does not make a server and
14
+ * does not listen: the owner of the listener does that.
15
+ *
16
+ * This module imports only the types of `node:http`, so it loads no Node code at run time.
17
+ */
18
+ import { decodeMetadataHeader, METADATA_HEADER_LIMIT } from "../shared/index.js";
19
+ import { ERROR_REGISTRY } from "../../../client/errors/index.js";
20
+ import { assertNamedOrigins, checkBrowserRequest, needsNamedOrigin } from "../../../server/browser-guard.js";
21
+ import { headerNames, isSecretHeader, queryRecord, requestCredentials, urlParts, withoutSecretHeaders } from "../../../server/request-auth.js";
22
+ import { PROTOCOL_HEADER, PROTOCOL_VERSION, httpStatusOf, protocolVersionOf } from "../../../protocol.js";
23
+ import { realClock } from "../../../clock.js";
24
+ import { ms } from "../../../duration.js";
25
+ import { NDJSON_MEDIA_TYPE as NDJSON, defaultNdjsonError as errorOf, keepAliveMsOf, writeNdjsonStream } from "./ndjson.js";
26
+ import { createPatternServerUrlStrategy } from "./strategies.js";
27
+ import { applyCors, corsOrigins, corsPolicy } from "./cors.js";
28
+ /** The error of a request body or of a header that the handler cannot read. */
29
+ class BodyError extends Error {
30
+ httpStatus;
31
+ constructor(message, httpStatus) {
32
+ super(message);
33
+ this.httpStatus = httpStatus;
34
+ }
35
+ }
36
+ /** True when a stream response has no end (`STREAM_METADATA_KEY` of procedure-server.ts). */
37
+ function isUnboundedStream(response) {
38
+ return response.metadata?.["stream"] === "unbounded";
39
+ }
40
+ /** The metadata keys that the transport sets: a query parameter or a header cannot replace them. */
41
+ const RESERVED_METADATA = new Set(["headers", "query", "params"]);
42
+ /** The headers that do not go to the root of the metadata. The client sends them as such. */
43
+ const STANDARD_HEADERS = new Set([
44
+ "host",
45
+ "connection",
46
+ "content-length",
47
+ "content-type",
48
+ "user-agent",
49
+ "accept",
50
+ "accept-encoding",
51
+ "accept-language",
52
+ "cache-control",
53
+ "origin",
54
+ "referer",
55
+ "x-request-id",
56
+ "x-trace-id",
57
+ "x-span-id",
58
+ "x-parent-span-id",
59
+ "x-timeout",
60
+ "x-api-key",
61
+ "authorization",
62
+ "x-metadata",
63
+ ]);
64
+ /** The known custom headers whose metadata key is not the header name (lower case to camel case). */
65
+ const HEADER_MAPPINGS = { collectionname: "collectionName" };
66
+ /** The reasons of the `FORBIDDEN` errors of the browser checks (wire v1). */
67
+ const GUARD_REASONS = {
68
+ FORBIDDEN_HOST: "host-header-not-allowed",
69
+ FORBIDDEN_ORIGIN: "origin-not-allowed",
70
+ METHOD_NOT_ALLOWED: "method-not-allowed",
71
+ UNSUPPORTED_MEDIA_TYPE: "media-type-not-allowed",
72
+ };
73
+ /** This function writes a JSON response without a framework. */
74
+ function writeJson(res, status, body) {
75
+ const text = JSON.stringify(body);
76
+ res.statusCode = status;
77
+ res.setHeader("Content-Type", "application/json; charset=utf-8");
78
+ res.setHeader("Content-Length", Buffer.byteLength(text));
79
+ res.end(text);
80
+ }
81
+ /** The path of a request without a framework: the path of `req.url`, without the query. */
82
+ function pathOf(req) {
83
+ return urlParts(req.url).path;
84
+ }
85
+ /** The query that a framework parsed (`req.query` of Express), or the query of the URL. */
86
+ function queryOf(req) {
87
+ const parsed = req.query;
88
+ if (parsed !== null && typeof parsed === "object")
89
+ return parsed;
90
+ const { query } = urlParts(req.url);
91
+ const out = new Map();
92
+ for (const key of new Set(query.keys())) {
93
+ const values = query.getAll(key);
94
+ out.set(key, values.length === 1 ? values[0] : values);
95
+ }
96
+ return Object.fromEntries(out);
97
+ }
98
+ /** The route parameters that a framework parsed (`req.params` of Express), or none. */
99
+ function paramsOf(req) {
100
+ const parsed = req.params;
101
+ return parsed !== null && typeof parsed === "object" ? parsed : {};
102
+ }
103
+ /**
104
+ * This function makes a procedure handler: a request handler of `node:http` that serves the
105
+ * procedures of `server` under `options.basePath`, with wire protocol v1.
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const server = new ProcedureServer({ registry, token });
110
+ * const procedures = procedureHandler(server, { basePath: "/api/proc" });
111
+ * createServer((req, res) => {
112
+ * if (procedures(req, res)) return;
113
+ * appRoutes(req, res); // for example /api/chat
114
+ * }).listen(4820);
115
+ * ```
116
+ */
117
+ export function procedureHandler(server, options = {}) {
118
+ return createProcedureHandler(server, options);
119
+ }
120
+ /**
121
+ * This function makes the procedure handler with the parts of a compatibility shim.
122
+ *
123
+ * @internal
124
+ */
125
+ export function createProcedureHandler(server, options, compat = {}) {
126
+ const legacy = compat.legacy === true;
127
+ const basePath = options.basePath ?? "/api";
128
+ const prefix = basePath.endsWith("/") ? basePath : `${basePath}/`;
129
+ const bodyLimit = options.bodyLimit ?? 1024 * 1024;
130
+ // A value that is not a duration fails here, not at the first stream
131
+ const keepAliveMs = keepAliveMsOf(options.keepAlive);
132
+ const keepAlive = keepAliveMs > 0 ? ms(keepAliveMs) : false;
133
+ const clock = options.clock ?? realClock;
134
+ const corsOptions = options.cors === true ? {} : options.cors === false ? undefined : options.cors;
135
+ // A list of origins or a function: the default sends the credentials. "*" with credentials is invalid.
136
+ const cors = corsOptions === undefined || compat.corsOutside ? undefined : corsPolicy(corsOptions, (corsOptions.origin ?? "*") !== "*");
137
+ const guard = {
138
+ allowedOrigins: options.allowedOrigins ?? corsOrigins(corsOptions),
139
+ allowedHosts: options.allowedHosts,
140
+ allowGet: options.allowGet,
141
+ };
142
+ // CSRF: a server that reads the cookies of each request needs named origins (CLI-2a)
143
+ const ambientMode = server.ambientCredentials;
144
+ assertNamedOrigins(compat.face?.name ?? "procedureHandler", ambientMode, guard.allowedOrigins, compat.face?.originOption ?? "cors.origin");
145
+ const secretHeaders = headerNames(options.secretHeaders);
146
+ const secretQuery = new Set(options.secretQuery ?? (legacy ? [] : ["token"]));
147
+ const strategy = options.urlStrategy ?? createPatternServerUrlStrategy(basePath);
148
+ const methodOf = compat.methodOf ??
149
+ ((req) => {
150
+ const { path, query } = urlParts(req.url);
151
+ const view = { method: (req.method ?? "GET").toUpperCase(), path, url: req.url ?? "/", headers: req.headers, query: queryRecord(query) };
152
+ return strategy(view, req);
153
+ });
154
+ const sendJson = compat.sendJson ?? writeJson;
155
+ /** The controllers of the requests in progress: close() aborts them (deep dive TRN-15) */
156
+ const openRequests = new Set();
157
+ /** The functions that drain() waits on: each one runs when no request is in progress */
158
+ let idleWaiters = [];
159
+ let stopped = false;
160
+ const requestEnded = (controller) => {
161
+ if (!openRequests.delete(controller) || openRequests.size > 0)
162
+ return;
163
+ const waiters = idleWaiters;
164
+ idleWaiters = [];
165
+ for (const waiter of waiters)
166
+ waiter();
167
+ };
168
+ const matches = (req) => compat.matchAll === true || pathOf(req).startsWith(prefix);
169
+ /** The error body of wire v1: the message, the code, the retryable flag and the more fields. */
170
+ const sendError = (res, status, message, code, retryable = false, more = {}) => {
171
+ sendJson(res, status, { error: message, code, retryable, ...more });
172
+ };
173
+ const refuseGuard = (res, refusal) => {
174
+ if (legacy) {
175
+ sendError(res, refusal.status, refusal.message, refusal.code);
176
+ return;
177
+ }
178
+ sendError(res, 403, refusal.message, "FORBIDDEN", false, { reason: GUARD_REASONS[refusal.code] ?? refusal.code.toLowerCase() });
179
+ };
180
+ /**
181
+ * The request body. A body parser of a framework (`express.json({ strict: false })`) gives
182
+ * `req.body`. Without one, the handler reads the JSON body itself (deep dive TRN-10).
183
+ */
184
+ const readBody = async (req) => {
185
+ const parsed = req.body;
186
+ if (parsed !== undefined)
187
+ return parsed;
188
+ if (req.method === "GET" || req.method === "HEAD" || req.readableEnded)
189
+ return undefined;
190
+ const chunks = [];
191
+ let size = 0;
192
+ for await (const chunk of req) {
193
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
194
+ size += buffer.length;
195
+ if (size > bodyLimit)
196
+ throw new BodyError(`The request body is larger than ${bodyLimit} bytes`, 413);
197
+ chunks.push(buffer);
198
+ }
199
+ const text = Buffer.concat(chunks).toString("utf8");
200
+ if (text.trim() === "")
201
+ return undefined;
202
+ try {
203
+ return JSON.parse(text);
204
+ }
205
+ catch {
206
+ throw new BodyError("The request body is not valid JSON", 400);
207
+ }
208
+ };
209
+ /** This function converts an HTTP request to a `ServerRequest`, or null when the URL names no method. */
210
+ const toServerRequest = (req, body) => {
211
+ const method = methodOf(req);
212
+ if (!method)
213
+ return null;
214
+ const id = req.headers["x-request-id"] ?? `req-${Date.now()}-${Math.random()}`;
215
+ // The query without its secret parameters: they go into the credentials (CLI-2a)
216
+ const query = {};
217
+ for (const [key, value] of Object.entries(queryOf(req)))
218
+ if (!secretQuery.has(key))
219
+ query[key] = value;
220
+ const params = paramsOf(req);
221
+ // The metadata of the headers and of the query. The query parameters cannot replace headers,
222
+ // query or params. The secret headers go into the credentials, not into the metadata, so a
223
+ // handler and a nested call do not see them (roadmap R18)
224
+ const metadata = {
225
+ headers: withoutSecretHeaders(req.headers, secretHeaders),
226
+ query,
227
+ params,
228
+ };
229
+ for (const [key, value] of Object.entries(query)) {
230
+ if (!RESERVED_METADATA.has(key) && !key.startsWith("__"))
231
+ metadata[key] = value;
232
+ }
233
+ // The custom headers at the root of the metadata, as the client's metadataToHeaders() sends
234
+ // them. A secret header (Cookie too) does not go there.
235
+ for (const [key, value] of Object.entries(req.headers)) {
236
+ const lower = key.toLowerCase();
237
+ if (STANDARD_HEADERS.has(lower) || isSecretHeader(lower, secretHeaders) || typeof value !== "string")
238
+ continue;
239
+ const normalizedKey = HEADER_MAPPINGS[lower] ?? key;
240
+ if (!RESERVED_METADATA.has(normalizedKey) && !normalizedKey.startsWith("__"))
241
+ metadata[normalizedKey] = value;
242
+ }
243
+ // The custom metadata of the HTTP client: any JSON value, any key (deep dive TRN-11)
244
+ const encoded = req.headers["x-metadata"];
245
+ if (typeof encoded === "string") {
246
+ if (encoded.length > METADATA_HEADER_LIMIT) {
247
+ throw new BodyError(`The X-Metadata header is longer than ${METADATA_HEADER_LIMIT} characters`, 431);
248
+ }
249
+ const custom = decodeMetadataHeader(encoded);
250
+ if (!custom)
251
+ throw new BodyError("The X-Metadata header is not URI-encoded JSON of an object", 400);
252
+ for (const [key, value] of Object.entries(custom)) {
253
+ if (!RESERVED_METADATA.has(key) && key !== "auth" && !key.startsWith("__"))
254
+ metadata[key] = value;
255
+ }
256
+ }
257
+ // The payload: the body, or the id of a RESTful GET. Only an absent payload becomes {}: 0,
258
+ // false, "" and null stay (deep dive TRN-10)
259
+ let payload = body;
260
+ if (req.method === "GET" && params["id"])
261
+ payload = { id: params["id"] };
262
+ if (payload === undefined)
263
+ payload = {};
264
+ return {
265
+ id,
266
+ method,
267
+ payload,
268
+ metadata,
269
+ // A network request: ProcedureServer examines the token and the request hook (R18, CLI-2a)
270
+ credentials: requestCredentials({ headers: req.headers, url: req.url }),
271
+ };
272
+ };
273
+ /** This function converts a `ServerResponse` to the HTTP response. */
274
+ const toHttp = (serverResponse, res) => {
275
+ const { status, payload, metadata } = serverResponse;
276
+ // A symbolic code maps to its HTTP status: the protocol list, then the error registry
277
+ // (BUGS-2026-07 M7). A number is the status.
278
+ let httpStatusCode;
279
+ if (typeof status.code === "string") {
280
+ const mapped = httpStatusOf(status.code) ?? ERROR_REGISTRY[status.code]?.httpStatus;
281
+ httpStatusCode = mapped ?? (status.type === "success" ? 200 : 500);
282
+ }
283
+ else if (typeof status.code === "number") {
284
+ httpStatusCode = status.code;
285
+ }
286
+ else {
287
+ httpStatusCode = status.type === "success" ? 200 : 500;
288
+ }
289
+ if (metadata["headers"]) {
290
+ for (const [key, value] of Object.entries(metadata["headers"]))
291
+ res.setHeader(key, value);
292
+ }
293
+ if (status.type === "success") {
294
+ // No result: 204 with no body (deep dive TRN-10)
295
+ if (payload === undefined) {
296
+ res.statusCode = 204;
297
+ res.end();
298
+ return;
299
+ }
300
+ sendJson(res, httpStatusCode, payload);
301
+ return;
302
+ }
303
+ // The wait that the error asks for: a Retry-After header in seconds, and the exact
304
+ // milliseconds in the body (R12)
305
+ const retryAfterMs = metadata["retry-after"];
306
+ const hasRetryAfter = typeof retryAfterMs === "number" && Number.isFinite(retryAfterMs) && retryAfterMs >= 0;
307
+ if (hasRetryAfter)
308
+ res.setHeader("Retry-After", String(Math.ceil(retryAfterMs / 1000)));
309
+ // The reason of a FORBIDDEN error travels on each face (roadmap R25)
310
+ const reason = typeof metadata["reason"] === "string" ? metadata["reason"] : undefined;
311
+ sendJson(res, httpStatusCode, {
312
+ error: status.message,
313
+ code: status.code,
314
+ retryable: status.retryable,
315
+ ...(hasRetryAfter ? { retryAfterMs } : {}),
316
+ ...(reason !== undefined ? { reason } : {}),
317
+ });
318
+ };
319
+ /**
320
+ * This function sends a stream response. A client that accepts NDJSON gets the lines of
321
+ * `writeNdjsonStream`. Another client gets the last item as plain JSON, the "sponge" mode, and a
322
+ * stream without an end gets `NOT_ACCEPTABLE` (roadmap R15).
323
+ */
324
+ const streamToHttp = async (response, stream, req, res, signal) => {
325
+ const ndjson = String(req.headers.accept ?? "").includes(NDJSON);
326
+ if (!ndjson && isUnboundedStream(response)) {
327
+ void Promise.resolve(stream[Symbol.asyncIterator]().return?.()).catch(() => undefined);
328
+ const message = `This procedure gives a stream that can run without an end. Send "Accept: ${NDJSON}" to read its items.`;
329
+ toHttp({ id: response.id, status: { type: "error", code: "NOT_ACCEPTABLE", message, retryable: false }, metadata: {} }, res);
330
+ return;
331
+ }
332
+ if (!ndjson) {
333
+ let last;
334
+ try {
335
+ for await (const item of stream)
336
+ last = { value: item };
337
+ }
338
+ catch (error) {
339
+ toHttp({ id: response.id, status: { type: "error", ...errorOf(error) }, metadata: {} }, res);
340
+ return;
341
+ }
342
+ if (!last) {
343
+ toHttp({ id: response.id, status: { type: "error", code: "NO_OUTPUT", message: "The procedure gave no output", retryable: false }, metadata: {} }, res);
344
+ return;
345
+ }
346
+ toHttp({ id: response.id, status: response.status, metadata: response.metadata, payload: last.value }, res);
347
+ return;
348
+ }
349
+ // The lines, the backpressure, the keep-alive and the abort of close() (WIRE-PROTOCOL.md)
350
+ await writeNdjsonStream(res, stream, { signal, keepAlive, errorOf, clock });
351
+ };
352
+ /** This function serves a request that the handler took. */
353
+ const serve = async (req, res) => {
354
+ if (cors && applyCors(req, res, cors))
355
+ return;
356
+ // The protocol version of this server, on each response (roadmap R25)
357
+ res.setHeader(PROTOCOL_HEADER, String(PROTOCOL_VERSION));
358
+ const version = protocolVersionOf(req.headers[PROTOCOL_HEADER.toLowerCase()]);
359
+ if (version !== undefined && version > PROTOCOL_VERSION) {
360
+ sendJson(res, 400, {
361
+ error: `This server speaks the protocol ${PROTOCOL_VERSION}, and the request uses ${version}`,
362
+ code: "PROTOCOL_VERSION",
363
+ retryable: false,
364
+ protocol: PROTOCOL_VERSION,
365
+ });
366
+ return;
367
+ }
368
+ if (stopped) {
369
+ if (legacy)
370
+ sendError(res, 503, "Server stopped", "SERVER_STOPPED", true);
371
+ else
372
+ sendError(res, 503, "The server is stopping", "UNAVAILABLE", true);
373
+ return;
374
+ }
375
+ // A preflight without CORS: no procedure runs for it, and the browser sees no CORS header
376
+ if (!legacy && req.method === "OPTIONS") {
377
+ res.statusCode = 204;
378
+ res.end();
379
+ return;
380
+ }
381
+ // A web page must not reach the procedures: host, origin, method and body type
382
+ // Ambient credentials (cookies) are trusted only from a named origin. The shim keeps its former
383
+ // checks for a server that reads no cookies.
384
+ const ambient = needsNamedOrigin(ambientMode, req.headers, !legacy);
385
+ const check = checkBrowserRequest(req, guard, true, ambient);
386
+ if (!check.ok) {
387
+ refuseGuard(res, check);
388
+ return;
389
+ }
390
+ // A closed connection or close() aborts the request: a stream stops, and its handler gets return()
391
+ const controller = new AbortController();
392
+ openRequests.add(controller);
393
+ res.on("close", () => {
394
+ if (!res.writableFinished)
395
+ controller.abort();
396
+ requestEnded(controller);
397
+ });
398
+ try {
399
+ let serverRequest;
400
+ try {
401
+ serverRequest = toServerRequest(req, await readBody(req));
402
+ }
403
+ catch (error) {
404
+ const status = error instanceof BodyError ? error.httpStatus : 400;
405
+ sendError(res, status, error.message, "INVALID_REQUEST");
406
+ return;
407
+ }
408
+ if (!serverRequest) {
409
+ sendError(res, 400, "Invalid request: could not parse RPC method from URL", "INVALID_REQUEST");
410
+ return;
411
+ }
412
+ serverRequest.signal = controller.signal;
413
+ const serverResponse = await server.handle(serverRequest);
414
+ if (serverResponse.stream) {
415
+ await streamToHttp(serverResponse, serverResponse.stream, req, res, controller.signal);
416
+ return;
417
+ }
418
+ toHttp(serverResponse, res);
419
+ }
420
+ catch (error) {
421
+ if (!res.headersSent)
422
+ sendError(res, 500, error.message || "Internal server error", "INTERNAL_ERROR");
423
+ }
424
+ finally {
425
+ // An open response (an error before its end) stays in progress until its close event
426
+ if (res.writableEnded || res.destroyed)
427
+ requestEnded(controller);
428
+ }
429
+ };
430
+ /** This function serves a request, and does not reject: an error ends the response with 500. */
431
+ const settle = (req, res) => serve(req, res).catch((error) => {
432
+ if (!res.headersSent)
433
+ sendError(res, 500, error instanceof Error ? error.message : String(error), "INTERNAL_ERROR");
434
+ else if (!res.writableEnded)
435
+ res.destroy();
436
+ });
437
+ const handler = ((req, res) => {
438
+ if (!matches(req))
439
+ return false;
440
+ void settle(req, res);
441
+ return true;
442
+ });
443
+ return Object.assign(handler, {
444
+ basePath,
445
+ async handle(req, res) {
446
+ if (!matches(req))
447
+ return false;
448
+ await settle(req, res);
449
+ return true;
450
+ },
451
+ matches,
452
+ middleware(req, res, next) {
453
+ if (!handler(req, res))
454
+ next();
455
+ },
456
+ start() {
457
+ stopped = false;
458
+ },
459
+ stopIntake() {
460
+ stopped = true;
461
+ },
462
+ drain(deadline, signal) {
463
+ if (openRequests.size === 0 || signal?.aborted)
464
+ return Promise.resolve();
465
+ return new Promise((resolve) => {
466
+ let timer;
467
+ const done = () => {
468
+ timer?.();
469
+ signal?.removeEventListener("abort", done);
470
+ const index = idleWaiters.indexOf(done);
471
+ if (index >= 0)
472
+ idleWaiters.splice(index, 1);
473
+ resolve();
474
+ };
475
+ idleWaiters.push(done);
476
+ signal?.addEventListener("abort", done, { once: true });
477
+ timer = clock.after(Math.max(0, deadline - clock.now()), done);
478
+ timer.unref?.();
479
+ });
480
+ },
481
+ inFlight() {
482
+ return openRequests.size;
483
+ },
484
+ close() {
485
+ for (const controller of [...openRequests])
486
+ controller.abort();
487
+ openRequests.clear();
488
+ const waiters = idleWaiters;
489
+ idleWaiters = [];
490
+ for (const waiter of waiters)
491
+ waiter();
492
+ },
493
+ });
494
+ }
495
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/adapters/http/server/handler.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,17 @@
3
3
  *
4
4
  * Functions for mapping HTTP requests to RPC methods.
5
5
  */
6
- import type { Request } from "express";
7
6
  import type { Method } from "../../../client/types.js";
7
+ /**
8
+ * The parts of a request that the URL strategies read: the HTTP method and the path. A `Request`
9
+ * of Express has them, and so does the `UrlRequest` of `procedureHandler`.
10
+ */
11
+ export interface RoutedRequest {
12
+ /** The HTTP method. */
13
+ readonly method: string;
14
+ /** The path of the URL, without the query. */
15
+ readonly path: string;
16
+ }
8
17
  /**
9
18
  * Default URL strategy: RESTful routes.
10
19
  *
@@ -15,7 +24,7 @@ import type { Method } from "../../../client/types.js";
15
24
  * - PUT /api/users/:id → { service: "users", operation: "update" }
16
25
  * - DELETE /api/users/:id → { service: "users", operation: "delete" }
17
26
  */
18
- export declare function defaultServerUrlStrategy(req: Request): Method | null;
27
+ export declare function defaultServerUrlStrategy(req: RoutedRequest): Method | null;
19
28
  /**
20
29
  * Alternative strategy: RPC-style routes.
21
30
  *
@@ -23,7 +32,7 @@ export declare function defaultServerUrlStrategy(req: Request): Method | null;
23
32
  * - POST /rpc/users/get → { service: "users", operation: "get" }
24
33
  * - POST /rpc/users/list → { service: "users", operation: "list" }
25
34
  */
26
- export declare function rpcServerUrlStrategy(req: Request): Method | null;
35
+ export declare function rpcServerUrlStrategy(req: RoutedRequest): Method | null;
27
36
  /**
28
37
  * Pattern URL strategy: parses the HTTP client's default URL format,
29
38
  * `{basePath}/{version?}/{service}/{operation}`, using defaultUrlPattern.parse — the exact inverse
@@ -33,7 +42,7 @@ export declare function rpcServerUrlStrategy(req: Request): Method | null;
33
42
  *
34
43
  * @param basePath - Base path prefix to strip before parsing (default "/api").
35
44
  */
36
- export declare function createPatternServerUrlStrategy(basePath?: string): (req: Request) => Method | null;
45
+ export declare function createPatternServerUrlStrategy(basePath?: string): (req: RoutedRequest) => Method | null;
37
46
  /** Pattern strategy with the standard "/api" base path (the server transport default). */
38
- export declare const patternServerUrlStrategy: (req: Request) => Method | null;
47
+ export declare const patternServerUrlStrategy: (req: RoutedRequest) => Method | null;
39
48
  //# sourceMappingURL=strategies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/server/strategies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmCpE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAiBhE;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CASjG;AAED,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,IAAuC,CAAC"}
1
+ {"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../../../src/adapters/http/server/strategies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAmC1E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAiBtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,SAAS,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,GAAG,IAAI,CASvG;AAED,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,GAAG,IAAuC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../../../src/adapters/http/server/strategies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAExC,oCAAoC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAEtB,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAQ,GAAG,MAAM;IAC9D,OAAO,CAAC,GAAY,EAAiB,EAAE;QACrC,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACpB,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,wEAAwE;QACxE,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAW,CAAC,CAAC;IAC1E,CAAC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,MAAM,wBAAwB,GAAoC,8BAA8B,EAAE,CAAC"}
1
+ {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../../../src/adapters/http/server/strategies.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAa5D;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAkB;IACzD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAExC,oCAAoC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAEtB,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAQ,GAAG,MAAM;IAC9D,OAAO,CAAC,GAAkB,EAAiB,EAAE;QAC3C,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACpB,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,wEAAwE;QACxE,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAW,CAAC,CAAC;IAC1E,CAAC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,MAAM,wBAAwB,GAA0C,8BAA8B,EAAE,CAAC"}