@browserlessapi/inferlo 0.6.0 → 0.8.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 (140) hide show
  1. package/README.md +9 -5
  2. package/dist/ai/ai-sdk.d.ts +48 -0
  3. package/dist/ai/ai-sdk.js +235 -0
  4. package/dist/ai/ai-sdk.js.map +1 -0
  5. package/dist/ai/index.d.ts +37 -3
  6. package/dist/ai/index.js +96 -7
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/public.d.ts +5 -1
  9. package/dist/ai/public.js +2 -0
  10. package/dist/ai/public.js.map +1 -1
  11. package/dist/ai/ui.d.ts +47 -0
  12. package/dist/ai/ui.js +33 -0
  13. package/dist/ai/ui.js.map +1 -0
  14. package/dist/app.d.ts +55 -4
  15. package/dist/app.js +439 -39
  16. package/dist/app.js.map +1 -1
  17. package/dist/astro.d.ts +60 -0
  18. package/dist/astro.js +68 -0
  19. package/dist/astro.js.map +1 -0
  20. package/dist/audit.d.ts +8 -1
  21. package/dist/audit.js +9 -2
  22. package/dist/audit.js.map +1 -1
  23. package/dist/auth.d.ts +1 -0
  24. package/dist/auth.js +1 -0
  25. package/dist/auth.js.map +1 -1
  26. package/dist/authjs.d.ts +70 -0
  27. package/dist/authjs.js +94 -0
  28. package/dist/authjs.js.map +1 -0
  29. package/dist/azure.d.ts +66 -0
  30. package/dist/azure.js +119 -0
  31. package/dist/azure.js.map +1 -0
  32. package/dist/better-auth.d.ts +89 -0
  33. package/dist/better-auth.js +75 -0
  34. package/dist/better-auth.js.map +1 -0
  35. package/dist/cache.d.ts +13 -9
  36. package/dist/cache.js +11 -9
  37. package/dist/cache.js.map +1 -1
  38. package/dist/cli/main.js +5 -5
  39. package/dist/cli/main.js.map +1 -1
  40. package/dist/client-ip.d.ts +41 -1
  41. package/dist/client-ip.js +85 -1
  42. package/dist/client-ip.js.map +1 -1
  43. package/dist/cross-site.d.ts +14 -0
  44. package/dist/cross-site.js +56 -0
  45. package/dist/cross-site.js.map +1 -0
  46. package/dist/db/memory.js +2 -1
  47. package/dist/db/memory.js.map +1 -1
  48. package/dist/db/postgres.js +23 -6
  49. package/dist/db/postgres.js.map +1 -1
  50. package/dist/db/table.d.ts +37 -5
  51. package/dist/db/table.js +96 -15
  52. package/dist/db/table.js.map +1 -1
  53. package/dist/db/types.d.ts +2 -0
  54. package/dist/describe.d.ts +23 -5
  55. package/dist/describe.js +20 -2
  56. package/dist/describe.js.map +1 -1
  57. package/dist/disk-storage.d.ts +6 -0
  58. package/dist/disk-storage.js +96 -0
  59. package/dist/disk-storage.js.map +1 -0
  60. package/dist/events.d.ts +134 -0
  61. package/dist/events.js +196 -0
  62. package/dist/events.js.map +1 -0
  63. package/dist/files.d.ts +23 -0
  64. package/dist/files.js +168 -0
  65. package/dist/files.js.map +1 -0
  66. package/dist/index.d.ts +26 -8
  67. package/dist/index.js +10 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/jobs.d.ts +56 -10
  70. package/dist/jobs.js +71 -13
  71. package/dist/jobs.js.map +1 -1
  72. package/dist/jwt.d.ts +83 -0
  73. package/dist/jwt.js +312 -0
  74. package/dist/jwt.js.map +1 -0
  75. package/dist/langchain.d.ts +58 -0
  76. package/dist/langchain.js +220 -0
  77. package/dist/langchain.js.map +1 -0
  78. package/dist/model.d.ts +23 -6
  79. package/dist/model.js +41 -7
  80. package/dist/model.js.map +1 -1
  81. package/dist/oidc.d.ts +70 -0
  82. package/dist/oidc.js +379 -0
  83. package/dist/oidc.js.map +1 -0
  84. package/dist/openapi.js +17 -2
  85. package/dist/openapi.js.map +1 -1
  86. package/dist/passport.d.ts +54 -0
  87. package/dist/passport.js +68 -0
  88. package/dist/passport.js.map +1 -0
  89. package/dist/postgres-js.d.ts +39 -0
  90. package/dist/postgres-js.js +71 -0
  91. package/dist/postgres-js.js.map +1 -0
  92. package/dist/rate-limit.d.ts +5 -3
  93. package/dist/rate-limit.js +3 -3
  94. package/dist/rate-limit.js.map +1 -1
  95. package/dist/redis-events.d.ts +27 -0
  96. package/dist/redis-events.js +163 -0
  97. package/dist/redis-events.js.map +1 -0
  98. package/dist/redis-jobs.d.ts +24 -0
  99. package/dist/redis-jobs.js +203 -0
  100. package/dist/redis-jobs.js.map +1 -0
  101. package/dist/redis-sockets.d.ts +24 -0
  102. package/dist/redis-sockets.js +75 -0
  103. package/dist/redis-sockets.js.map +1 -0
  104. package/dist/redis.d.ts +30 -0
  105. package/dist/redis.js +106 -0
  106. package/dist/redis.js.map +1 -0
  107. package/dist/response-body.d.ts +6 -0
  108. package/dist/response-body.js +7 -0
  109. package/dist/response-body.js.map +1 -0
  110. package/dist/route.d.ts +117 -3
  111. package/dist/route.js +27 -0
  112. package/dist/route.js.map +1 -1
  113. package/dist/schema.d.ts +23 -3
  114. package/dist/schema.js +70 -0
  115. package/dist/schema.js.map +1 -1
  116. package/dist/serve.d.ts +24 -1
  117. package/dist/serve.js +200 -8
  118. package/dist/serve.js.map +1 -1
  119. package/dist/service-client.d.ts +91 -0
  120. package/dist/service-client.js +177 -0
  121. package/dist/service-client.js.map +1 -0
  122. package/dist/sessions.d.ts +2 -0
  123. package/dist/sessions.js +36 -4
  124. package/dist/sessions.js.map +1 -1
  125. package/dist/sockets.d.ts +58 -0
  126. package/dist/sockets.js +111 -0
  127. package/dist/sockets.js.map +1 -0
  128. package/dist/storage.d.ts +47 -0
  129. package/dist/storage.js +123 -0
  130. package/dist/storage.js.map +1 -0
  131. package/dist/tracing.d.ts +7 -3
  132. package/dist/tracing.js +8 -2
  133. package/dist/tracing.js.map +1 -1
  134. package/dist/websocket.d.ts +81 -0
  135. package/dist/websocket.js +251 -0
  136. package/dist/websocket.js.map +1 -0
  137. package/llms.txt +2 -0
  138. package/package.json +77 -5
  139. package/templates/app/AGENTS.md +9 -5
  140. package/templates/app/test/notes.test.ts +2 -0
package/dist/serve.js CHANGED
@@ -8,7 +8,9 @@
8
8
  import { createRedactor } from "./redact.js";
9
9
  import { appAnswers } from "./request-matcher.js";
10
10
  import { InferloError } from "./errors.js";
11
- import { clientIps } from "./client-ip.js";
11
+ import { clientIps, clientSignals, nodeRequests } from "./client-ip.js";
12
+ import { knownBodies } from "./response-body.js";
13
+ import { acceptKey, bunWebSocket, encodeClose, encodeFrame, FrameReader, OP_PONG, OP_TEXT, upgraders } from "./websocket.js";
12
14
  export function normalizePrefix(prefix) {
13
15
  if (!prefix || prefix === "/")
14
16
  return "";
@@ -95,7 +97,12 @@ export function buildRequest(req, path, signal) {
95
97
  const method = (req.method ?? "GET").toUpperCase();
96
98
  let body;
97
99
  if (method !== "GET" && method !== "HEAD") {
98
- if (isParsedBody(req.body)) {
100
+ if (req.rawBody instanceof Uint8Array && isParsedBody(req.body)) {
101
+ // The host read the stream and kept the bytes: the app gets them unchanged, with their own content type.
102
+ headers.delete("content-length");
103
+ body = req.rawBody;
104
+ }
105
+ else if (isParsedBody(req.body)) {
99
106
  // The host framework already read the stream: use what it parsed.
100
107
  headers.delete("content-length");
101
108
  if (typeof req.body === "string" || req.body instanceof Uint8Array)
@@ -118,6 +125,7 @@ export function buildRequest(req, path, signal) {
118
125
  });
119
126
  if (req.socket?.remoteAddress)
120
127
  clientIps.set(request, req.socket.remoteAddress);
128
+ nodeRequests.set(request, req);
121
129
  return request;
122
130
  }
123
131
  /**
@@ -129,6 +137,12 @@ export function fromNodeRequest(req, options = {}) {
129
137
  const path = stripPrefix(raw, normalizePrefix(options.prefix)) ?? (raw.startsWith("/") ? raw : "/" + raw);
130
138
  return buildRequest(req, path, options.signal);
131
139
  }
140
+ const encoder = new TextEncoder();
141
+ /** UTF-8 length of a string, with Buffer where the runtime has it (Node.js, Bun). */
142
+ function byteLength(text) {
143
+ const B = globalThis.Buffer;
144
+ return B ? B.byteLength(text) : encoder.encode(text).byteLength;
145
+ }
132
146
  /** Write a Web Response (status, headers with every Set-Cookie, streamed body) to a Node response. */
133
147
  export async function writeResponse(res, response, method) {
134
148
  const outHeaders = {};
@@ -140,6 +154,13 @@ export async function writeResponse(res, response, method) {
140
154
  const cookies = response.headers.getSetCookie?.() ?? [];
141
155
  if (cookies.length)
142
156
  outHeaders["set-cookie"] = cookies;
157
+ // A JSON answer Inferlo built from a string: headers and body in one write, with its length.
158
+ const known = knownBodies.get(response);
159
+ if (known !== undefined && !response.bodyUsed && method !== "HEAD" && outHeaders["content-length"] === undefined && outHeaders["transfer-encoding"] === undefined) {
160
+ outHeaders["content-length"] = String(byteLength(known));
161
+ res.writeHead(response.status, outHeaders);
162
+ return void res.end(known);
163
+ }
143
164
  res.writeHead(response.status, outHeaders);
144
165
  if (!response.body || method === "HEAD")
145
166
  return void res.end();
@@ -179,7 +200,8 @@ export function toNodeHandler(app, options = {}) {
179
200
  if (!res.writableFinished)
180
201
  controller.abort();
181
202
  });
182
- const request = buildRequest(req, path ?? (req.url ?? "/"), controller.signal);
203
+ const request = buildRequest(req, path ?? (req.url ?? "/"));
204
+ clientSignals.set(request, controller.signal);
183
205
  const response = await app.fetch(request);
184
206
  await writeResponse(res, response, request.method);
185
207
  }
@@ -196,16 +218,55 @@ export async function serve(app, options = {}) {
196
218
  const hostname = options.hostname ?? "0.0.0.0";
197
219
  const g = globalThis;
198
220
  if (g.Bun) {
199
- const server = g.Bun.serve({ port, hostname, fetch: (req, bunServer) => app.fetch(req, bunServer) });
200
- return { port: server.port, close: async () => server.stop(true) };
221
+ // app.fetch upgrades WebSocket routes through the Bun server it is given, with bunWebSocket's handlers.
222
+ const server = g.Bun.serve({ port, hostname, fetch: (req, bunServer) => app.fetch(req, bunServer), websocket: bunWebSocket });
223
+ // Wait until the open requests (and streamed answers) are done, then stop, closing the idle keep-alive
224
+ // connections too. Requests that arrive meanwhile get 503 IL2006 from app.close(). app.close() calls the force
225
+ // closer, stop(true), when its timeout is up. (stop() without true would leave keep-alive connections served on
226
+ // Bun 1.3, and a later stop(true) would then do nothing.)
227
+ let forced = false;
228
+ const result = {
229
+ port: server.port,
230
+ close: async () => {
231
+ while (server.pendingRequests > 0 && !forced)
232
+ await new Promise((resolve) => setTimeout(resolve, 20));
233
+ await server.stop(true);
234
+ },
235
+ };
236
+ forceClosers.set(result, () => {
237
+ forced = true;
238
+ void server.stop(true);
239
+ });
240
+ return result;
201
241
  }
202
242
  if (g.Deno) {
203
- const server = g.Deno.serve({ port, hostname }, (req, info) => app.fetch(req, info));
204
- return { port: server.addr.port, close: () => server.shutdown() };
243
+ // shutdown() waits for every open request and streamed answer, with no way to cut them off. So each answer
244
+ // with a body is passed through a stream that the force closer can abort when app.close()'s timeout is up.
245
+ const open = new Set();
246
+ const server = g.Deno.serve({ port, hostname, onListen() { } }, async (req, info) => {
247
+ const response = await app.fetch(req, info);
248
+ if (!response.body)
249
+ return response;
250
+ const abort = new AbortController();
251
+ const { readable, writable } = new TransformStream();
252
+ open.add(abort);
253
+ void response.body
254
+ .pipeTo(writable, { signal: abort.signal })
255
+ .catch(() => { })
256
+ .finally(() => open.delete(abort));
257
+ return new Response(readable, { status: response.status, statusText: response.statusText, headers: response.headers });
258
+ });
259
+ const result = { port: server.addr.port, close: () => server.shutdown() };
260
+ forceClosers.set(result, () => {
261
+ for (const abort of open)
262
+ abort.abort();
263
+ });
264
+ return result;
205
265
  }
206
266
  const http = await import("node:http");
207
267
  const handler = toNodeHandler(app);
208
268
  const server = http.createServer((req, res) => void handler(req, res));
269
+ server.on("upgrade", toNodeUpgradeHandler(app));
209
270
  await new Promise((resolve, reject) => {
210
271
  server.once("error", reject);
211
272
  server.listen(port, hostname, () => resolve());
@@ -221,6 +282,137 @@ export async function serve(app, options = {}) {
221
282
  forceClosers.set(result, () => server.closeAllConnections());
222
283
  return result;
223
284
  }
224
- /** Closes every open connection of a Node server from serve(), for app.close() after its timeout. */
285
+ /** Longest message a WebSocket on Node.js may send before it is closed with 1009 (the app checks its own maxBodySize too). */
286
+ const MAX_SOCKET_MESSAGE = 16 * 1024 * 1024;
287
+ const STATUS_TEXT = { 400: "Bad Request", 401: "Unauthorized", 403: "Forbidden", 404: "Not Found", 405: "Method Not Allowed", 422: "Unprocessable Entity", 426: "Upgrade Required", 429: "Too Many Requests", 500: "Internal Server Error", 501: "Not Implemented", 503: "Service Unavailable" };
288
+ /**
289
+ * A listener for a Node.js server's "upgrade" event that serves the app's WebSocket routes (route.ws), for servers
290
+ * that another framework created: server.on("upgrade", toNodeUpgradeHandler(app, { prefix: "/api" })). Upgrade
291
+ * requests outside the prefix are left to the server's other "upgrade" listeners, and so are paths the app has no
292
+ * route for when fallthrough is true; otherwise the app answers them (404).
293
+ */
294
+ export function toNodeUpgradeHandler(app, options = {}) {
295
+ // Bun 1.3's node:http never sends what is written to an upgraded socket, so the handshake would hang.
296
+ const bun = globalThis.Bun?.version;
297
+ if (bun && /^1\.[0-3]\./.test(bun)) {
298
+ throw new InferloError("IL5031", `toNodeUpgradeHandler needs Bun 1.4 or later; this is Bun ${bun}.`, {
299
+ fix: "On Bun 1.3, serve WebSocket routes with app.listen(), serve(app) or Bun.serve({ fetch: app.fetch, websocket: bunWebSocket }), or update Bun.",
300
+ });
301
+ }
302
+ const prefix = normalizePrefix(options.prefix);
303
+ if (options.fallthrough !== undefined && typeof options.fallthrough !== "boolean") {
304
+ throw new InferloError("IL5019", "toNodeUpgradeHandler fallthrough must be true or false.", { fix: "Use toNodeUpgradeHandler(app, { fallthrough: true })." });
305
+ }
306
+ if (options.fallthrough && appAnswers(app, "GET", "/") === undefined) {
307
+ throw new InferloError("IL5019", "toNodeUpgradeHandler(app, { fallthrough: true }) needs an app from createApp.", { fix: "Pass the app returned by createApp, which knows its routes." });
308
+ }
309
+ return (req, socket, head) => {
310
+ const path = stripPrefix(req.url ?? "/", prefix);
311
+ if (path === null)
312
+ return;
313
+ if (options.fallthrough && !answersPath(app, "GET", path))
314
+ return;
315
+ void nodeUpgrade(app, req, socket, head, path);
316
+ };
317
+ }
318
+ /**
319
+ * A Node.js upgrade request: the app decides (auth, permissions, rate limits, the route); when it accepts, the
320
+ * handshake is answered here and the connection speaks RFC 6455 frames. Otherwise the app's answer is written as a
321
+ * plain HTTP response and the connection is closed.
322
+ */
323
+ async function nodeUpgrade(app, req, socket, head, path) {
324
+ socket.on("error", () => { });
325
+ let accepted = false;
326
+ try {
327
+ const request = buildRequest(req, path);
328
+ upgraders.set(request, async (connect) => {
329
+ const accept = await acceptKey(request.headers.get("sec-websocket-key") ?? "");
330
+ socket.write(`HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: ${accept}\r\n\r\n`);
331
+ accepted = true;
332
+ socket.setNoDelay?.(true);
333
+ nodeSocket(socket, connect, head);
334
+ return undefined;
335
+ });
336
+ const response = await app.fetch(request);
337
+ if (accepted)
338
+ return;
339
+ const body = new Uint8Array(await response.arrayBuffer());
340
+ const lines = [`HTTP/1.1 ${response.status} ${STATUS_TEXT[response.status] ?? ""}`];
341
+ response.headers.forEach((value, key) => {
342
+ if (key !== "content-length" && key !== "connection" && key !== "transfer-encoding")
343
+ lines.push(`${key}: ${value}`);
344
+ });
345
+ lines.push(`content-length: ${body.byteLength}`, "connection: close", "", "");
346
+ socket.write(lines.join("\r\n"));
347
+ socket.end(body);
348
+ }
349
+ catch (error) {
350
+ console.error("[inferlo] server error", createRedactor([]).value(error));
351
+ if (!accepted)
352
+ socket.end("HTTP/1.1 500 Internal Server Error\r\ncontent-length: 0\r\nconnection: close\r\n\r\n");
353
+ else
354
+ socket.destroy();
355
+ }
356
+ }
357
+ /** Runs one accepted connection: frames in, frames out, and the close handshake. */
358
+ function nodeSocket(socket, connect, head) {
359
+ const encoder = new TextEncoder();
360
+ let closeSent = false;
361
+ let gone = false;
362
+ let code = 1006;
363
+ let reason = "";
364
+ let timer;
365
+ const sendClose = (closeCode, closeReason) => {
366
+ if (closeSent || gone)
367
+ return;
368
+ closeSent = true;
369
+ socket.write(closeCode === 1005 ? encodeFrame(0x8, new Uint8Array(0)) : encodeClose(closeCode, closeReason));
370
+ // Wait for the client's close frame, but not forever.
371
+ timer = setTimeout(() => socket.destroy(), 5000);
372
+ };
373
+ const listener = connect({
374
+ send: (text) => {
375
+ if (!closeSent && !gone)
376
+ socket.write(encodeFrame(OP_TEXT, encoder.encode(text)));
377
+ },
378
+ close: (closeCode, closeReason) => {
379
+ code = closeCode;
380
+ reason = closeReason;
381
+ sendClose(closeCode, closeReason);
382
+ },
383
+ });
384
+ const reader = new FrameReader(MAX_SOCKET_MESSAGE, {
385
+ message: (data) => listener.message(data),
386
+ ping: (payload) => {
387
+ if (!closeSent)
388
+ socket.write(encodeFrame(OP_PONG, payload));
389
+ },
390
+ close: (clientCode, clientReason) => {
391
+ if (!closeSent) {
392
+ code = clientCode;
393
+ reason = clientReason;
394
+ }
395
+ sendClose(clientCode, clientReason);
396
+ socket.end();
397
+ },
398
+ error: (errorCode, errorReason) => {
399
+ code = errorCode;
400
+ reason = errorReason;
401
+ sendClose(errorCode, errorReason);
402
+ socket.end();
403
+ },
404
+ });
405
+ socket.on("data", (chunk) => reader.push(chunk));
406
+ socket.on("close", () => {
407
+ if (gone)
408
+ return;
409
+ gone = true;
410
+ clearTimeout(timer);
411
+ listener.close(code, reason);
412
+ });
413
+ if (head.byteLength)
414
+ reader.push(head);
415
+ }
416
+ /** Closes every open connection of a server from serve() (Node.js, Bun and Deno), for app.close() after its timeout. */
225
417
  export const forceClosers = new WeakMap();
226
418
  //# sourceMappingURL=serve.js.map
package/dist/serve.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Typed calls from one Inferlo service to another (microservices, part 1).
3
+ *
4
+ * import { getTicket, createTicket } from "../../tickets/src/routes/tickets.ts"; // the other service's routes
5
+ * const tickets = serviceClient({ baseUrl: settings.TICKETS_URL, token: settings.TICKETS_TOKEN });
6
+ *
7
+ * // in a route handler: input and answer are typed from the route
8
+ * const ticket = await tickets.call(getTicket, { params: { id }, ctx });
9
+ *
10
+ * The route definition gives the method, the path and the types; nothing is generated and nothing is global.
11
+ * Passing ctx forwards the request id (X-Request-Id) and cancels the call when the request is aborted. With
12
+ * tracing: { api: otel }, every attempt is a client span that sends its W3C traceparent, so the other service's
13
+ * spans join the caller's trace.
14
+ */
15
+ import { InferloError } from "./errors.ts";
16
+ import type { RouteDef } from "./route.ts";
17
+ import { type TracingConfig } from "./tracing.ts";
18
+ export interface ServiceClientOptions {
19
+ /** Where the other service is reached, with any path prefix it is mounted under: "http://tickets.internal" or "https://api.example.com/v1". */
20
+ baseUrl: string;
21
+ /** Sent as Authorization: Bearer <token> on every call. */
22
+ token?: string;
23
+ /** Headers sent on every call. */
24
+ headers?: Record<string, string>;
25
+ /** Longest wait for one attempt, in milliseconds. Default 10000. */
26
+ timeoutMs?: number;
27
+ /**
28
+ * Extra attempts for idempotent calls (GET, PUT, DELETE) that fail with a network error, a timeout, or a 502, 503
29
+ * or 504 answer, waiting 100 ms, 200 ms, 400 ms... in between. POST and PATCH are never retried. Default 0.
30
+ */
31
+ retries?: number;
32
+ /** The fetch to use. Default globalThis.fetch; pass otherApp.fetch to call an app in the same process (tests). */
33
+ fetch?: (request: Request) => Promise<Response>;
34
+ /**
35
+ * OpenTelemetry tracing: import * as otel from "@opentelemetry/api", then tracing: { api: otel }. Every attempt
36
+ * gets a client span ("GET /tickets/:id") under the active span and sends its trace context (traceparent), so a
37
+ * receiving Inferlo app with createApp({ tracing }) continues the same trace.
38
+ */
39
+ tracing?: TracingConfig;
40
+ }
41
+ /** A route made with route.<method>(...).handle(...): carries the types of its input and answer. */
42
+ export type TypedRoute = RouteDef & {
43
+ readonly $response: unknown;
44
+ readonly $input: {
45
+ body: unknown;
46
+ query: unknown;
47
+ params: unknown;
48
+ };
49
+ };
50
+ type ParamsInput<P> = keyof P extends never ? {
51
+ params?: P;
52
+ } : {
53
+ params: P;
54
+ };
55
+ type BodyInput<B> = undefined extends B ? {
56
+ body?: B;
57
+ } : {
58
+ body: B;
59
+ };
60
+ /** The request context to forward: pass the handler's ctx. */
61
+ export interface CallContext {
62
+ requestId: string;
63
+ signal: AbortSignal;
64
+ }
65
+ /** Options of one call, next to its params, query and body. */
66
+ export interface CallOptions {
67
+ /** The handler's context: forwards its request id and cancels the call when the request is aborted. */
68
+ ctx?: CallContext;
69
+ /** Cancels the call (in addition to ctx). */
70
+ signal?: AbortSignal;
71
+ /** Headers for this call. */
72
+ headers?: Record<string, string>;
73
+ }
74
+ export type CallInput<R extends TypedRoute> = ParamsInput<R["$input"]["params"]> & BodyInput<R["$input"]["body"]> & {
75
+ query?: Partial<R["$input"]["query"]>;
76
+ } & CallOptions;
77
+ /** The answer of a route: its JSON data, undefined for 204, or the Response itself for routes that return one (streams, files). */
78
+ export type CallResult<R extends TypedRoute> = R["$response"] extends Response ? Response : R["$response"] extends void | undefined ? undefined : R["$response"];
79
+ export interface ServiceClient {
80
+ /** Calls a route of the other service. Rejects with IL2008 when the call fails or answers with an error status. */
81
+ call<R extends TypedRoute>(route: R, ...input: {} extends CallInput<R> ? [input?: CallInput<R>] : [input: CallInput<R>]): Promise<CallResult<R>>;
82
+ }
83
+ /** Raised when a call to another service fails: remoteStatus is its HTTP status (0 when no answer came), remoteCode its error code. */
84
+ export declare class ServiceCallError extends InferloError {
85
+ readonly remoteStatus: number;
86
+ readonly remoteCode: string | undefined;
87
+ constructor(message: string, remoteStatus: number, remoteCode: string | undefined, fix: string, details: Record<string, unknown>);
88
+ }
89
+ /** A client for calls to another Inferlo service. See ServiceClientOptions. */
90
+ export declare function serviceClient(options: ServiceClientOptions): ServiceClient;
91
+ export {};
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Typed calls from one Inferlo service to another (microservices, part 1).
3
+ *
4
+ * import { getTicket, createTicket } from "../../tickets/src/routes/tickets.ts"; // the other service's routes
5
+ * const tickets = serviceClient({ baseUrl: settings.TICKETS_URL, token: settings.TICKETS_TOKEN });
6
+ *
7
+ * // in a route handler: input and answer are typed from the route
8
+ * const ticket = await tickets.call(getTicket, { params: { id }, ctx });
9
+ *
10
+ * The route definition gives the method, the path and the types; nothing is generated and nothing is global.
11
+ * Passing ctx forwards the request id (X-Request-Id) and cancels the call when the request is aborted. With
12
+ * tracing: { api: otel }, every attempt is a client span that sends its W3C traceparent, so the other service's
13
+ * spans join the caller's trace.
14
+ */
15
+ import { InferloError } from "./errors.js";
16
+ import { checkTracing, clientTracing } from "./tracing.js";
17
+ /** Raised when a call to another service fails: remoteStatus is its HTTP status (0 when no answer came), remoteCode its error code. */
18
+ export class ServiceCallError extends InferloError {
19
+ remoteStatus;
20
+ remoteCode;
21
+ constructor(message, remoteStatus, remoteCode, fix, details) {
22
+ super("IL2008", message, { status: 502, expose: false, fix, details });
23
+ this.remoteStatus = remoteStatus;
24
+ this.remoteCode = remoteCode;
25
+ }
26
+ }
27
+ const IDEMPOTENT = new Set(["GET", "HEAD", "PUT", "DELETE", "OPTIONS"]);
28
+ const RETRY_STATUS = new Set([502, 503, 504]);
29
+ function invalid(message, fix) {
30
+ return new InferloError("IL2009", message, { status: 500, expose: false, fix });
31
+ }
32
+ function isRouteDef(value) {
33
+ return typeof value === "object" && value !== null && value.kind === "inferlo.route";
34
+ }
35
+ /** The path with :params filled in, each value URL-encoded. */
36
+ function fillPath(path, params, route) {
37
+ return path.replace(/:([A-Za-z0-9_]+)/g, (_, name) => {
38
+ const value = params?.[name];
39
+ if (value === undefined || value === null || value === "") {
40
+ throw invalid(`The call to ${route.method} ${route.path} has no value for the path parameter "${name}".`, `Pass it: client.call(route, { params: { ${name}: "..." } }).`);
41
+ }
42
+ return encodeURIComponent(String(value));
43
+ });
44
+ }
45
+ const sleep = (ms, signal) => new Promise((resolve) => {
46
+ const timer = setTimeout(resolve, ms);
47
+ signal?.addEventListener("abort", () => (clearTimeout(timer), resolve()), { once: true });
48
+ });
49
+ /** A client for calls to another Inferlo service. See ServiceClientOptions. */
50
+ export function serviceClient(options) {
51
+ if (typeof options !== "object" || options === null)
52
+ throw invalid("serviceClient() needs options.", 'Use serviceClient({ baseUrl: "http://tickets.internal" }).');
53
+ for (const key of Object.keys(options)) {
54
+ if (!["baseUrl", "token", "headers", "timeoutMs", "retries", "fetch", "tracing"].includes(key)) {
55
+ throw invalid(`serviceClient() has an unknown option "${key}".`, "The options are baseUrl, token, headers, timeoutMs, retries, fetch and tracing.");
56
+ }
57
+ }
58
+ let base;
59
+ try {
60
+ base = new URL(options.baseUrl);
61
+ }
62
+ catch {
63
+ throw invalid(`serviceClient() baseUrl ${JSON.stringify(options.baseUrl)} is not a URL.`, 'Use the address of the other service, such as "http://tickets.internal" or "https://api.example.com/v1".');
64
+ }
65
+ if (base.protocol !== "http:" && base.protocol !== "https:")
66
+ throw invalid(`serviceClient() baseUrl must use http or https, got ${base.protocol}.`, 'Use "http://..." or "https://...".');
67
+ if (base.search || base.hash)
68
+ throw invalid("serviceClient() baseUrl must not have a query string or fragment.", "Pass query values per call: client.call(route, { query }).");
69
+ const timeoutMs = options.timeoutMs ?? 10_000;
70
+ const retries = options.retries ?? 0;
71
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
72
+ throw invalid(`serviceClient() timeoutMs must be a positive number of milliseconds, got ${String(options.timeoutMs)}.`, "Use timeoutMs: 5000, or leave it out for 10 s.");
73
+ if (!Number.isInteger(retries) || retries < 0 || retries > 10)
74
+ throw invalid(`serviceClient() retries must be a whole number from 0 to 10, got ${String(options.retries)}.`, "Use retries: 2 for idempotent calls that may meet a restarting instance.");
75
+ const doFetch = options.fetch ?? ((request) => globalThis.fetch(request));
76
+ const basePath = base.pathname.replace(/\/+$/, "");
77
+ const tracingConfig = checkTracing(options.tracing, "serviceClient");
78
+ const tracing = tracingConfig ? clientTracing(tracingConfig, "inferlo") : undefined;
79
+ return {
80
+ async call(route, input = {}) {
81
+ if (!isRouteDef(route))
82
+ throw invalid("client.call() needs a route made with route.<method>(...).handle(...).", "Import the route from the other service and pass it: client.call(getTicket, { params: { id } }).");
83
+ const { params, query, body, ctx, signal, headers } = input;
84
+ const url = new URL(base.origin + basePath + fillPath(route.path, params, route));
85
+ for (const [k, v] of Object.entries(query ?? {})) {
86
+ if (v === undefined || v === null)
87
+ continue;
88
+ for (const item of Array.isArray(v) ? v : [v])
89
+ url.searchParams.append(k, String(item));
90
+ }
91
+ const method = route.method.toUpperCase();
92
+ const sent = { accept: "application/json", ...options.headers, ...headers };
93
+ if (options.token)
94
+ sent.authorization = `Bearer ${options.token}`;
95
+ if (ctx?.requestId)
96
+ sent["x-request-id"] = ctx.requestId;
97
+ const hasBody = body !== undefined && method !== "GET" && method !== "HEAD";
98
+ if (hasBody)
99
+ sent["content-type"] = "application/json";
100
+ const payload = hasBody ? JSON.stringify(body) : undefined;
101
+ const callerSignals = [ctx?.signal, signal].filter((s) => s !== undefined);
102
+ const callerSignal = callerSignals.length ? AbortSignal.any(callerSignals) : undefined;
103
+ const attempts = IDEMPOTENT.has(method) ? retries + 1 : 1;
104
+ const where = `${method} ${url.origin}${url.pathname}`;
105
+ const details = (extra) => ({ method, url: `${url.origin}${url.pathname}`, requestId: ctx?.requestId, ...extra });
106
+ for (let attempt = 1;; attempt++) {
107
+ const timeout = AbortSignal.timeout(timeoutMs);
108
+ const combined = callerSignal ? AbortSignal.any([timeout, callerSignal]) : timeout;
109
+ let span;
110
+ let headersSent = sent;
111
+ if (tracing) {
112
+ const attributes = { "http.request.method": method, "url.full": `${url.origin}${url.pathname}`, "url.template": route.path, "server.address": url.hostname };
113
+ if (url.port)
114
+ attributes["server.port"] = Number(url.port);
115
+ if (attempt > 1)
116
+ attributes["http.request.resend_count"] = attempt - 1;
117
+ span = tracing.start(`${method} ${route.path}`, attributes);
118
+ headersSent = { ...sent };
119
+ tracing.inject(span, headersSent);
120
+ }
121
+ let response;
122
+ try {
123
+ const request = new Request(url, { method, headers: headersSent, body: payload, signal: combined });
124
+ response = await (span ? tracing.within(span, () => doFetch(request)) : doFetch(request));
125
+ }
126
+ catch (error) {
127
+ const timedOut = timeout.aborted;
128
+ if (span)
129
+ tracing.fail(span, error, callerSignal?.aborted ? "cancelled" : timedOut ? "timeout" : undefined);
130
+ if (callerSignal?.aborted)
131
+ throw callerSignal.reason ?? error;
132
+ if (attempt < attempts) {
133
+ await sleep(100 * 2 ** (attempt - 1), callerSignal);
134
+ continue;
135
+ }
136
+ const failure = new ServiceCallError(timedOut ? `${where} did not answer within ${timeoutMs} ms.` : `${where} could not be reached: ${error instanceof Error ? error.message : String(error)}.`, 0, undefined, timedOut ? "Check that the service is healthy, or raise serviceClient({ timeoutMs })." : "Check serviceClient({ baseUrl }) and that the service is running and reachable.", details({ attempts: attempt }));
137
+ failure.cause = error;
138
+ throw failure;
139
+ }
140
+ span?.setAttribute("http.response.status_code", response.status);
141
+ if (response.ok) {
142
+ span?.end();
143
+ if (response.status === 204 || method === "HEAD")
144
+ return undefined;
145
+ const type = response.headers.get("content-type") ?? "";
146
+ if (/^application\/(.+\+)?json\b/i.test(type))
147
+ return (await response.json());
148
+ return response;
149
+ }
150
+ if (RETRY_STATUS.has(response.status) && attempt < attempts) {
151
+ if (span)
152
+ tracing.fail(span, new Error(`${where} answered ${response.status}.`), String(response.status));
153
+ await response.body?.cancel();
154
+ await sleep(100 * 2 ** (attempt - 1), callerSignal);
155
+ continue;
156
+ }
157
+ let remote;
158
+ try {
159
+ remote = (await response.json()).error;
160
+ }
161
+ catch {
162
+ remote = undefined;
163
+ }
164
+ const code = typeof remote?.code === "string" ? remote.code : undefined;
165
+ const failure = new ServiceCallError(`${where} answered ${response.status}${code ? ` ${code}` : ""}${remote?.message ? `: ${remote.message}` : ""}.`, response.status, code, response.status === 401 || response.status === 403
166
+ ? "Check serviceClient({ token }) and the other service's auth."
167
+ : response.status >= 500
168
+ ? "See the other service's logs for this request id."
169
+ : "Check the input against the other service's route, or handle the answer: catch the error and read error.remoteStatus.", details({ status: response.status, code, attempts: attempt }));
170
+ if (span)
171
+ tracing.fail(span, failure, String(response.status));
172
+ throw failure;
173
+ }
174
+ },
175
+ };
176
+ }
177
+ //# sourceMappingURL=service-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-client.js","sourceRoot":"","sources":["../src/service-client.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,8 @@ export interface SessionsOptions {
51
51
  cookie?: SessionCookieOptions;
52
52
  /** Roles of a user, checked when a route uses auth: "<role>". Default: user.roles ?? []. */
53
53
  roles?: (user: AppUser) => string[];
54
+ /** The tenant of a user, for tenant-scoped models. Default: user.tenantId. */
55
+ tenant?: (user: AppUser) => string | null | undefined;
54
56
  }
55
57
  /** What session.signIn and session.signOut need from the route context. */
56
58
  export interface SessionResponseContext {