orpc-fn 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 (144) hide show
  1. package/README.md +66 -28
  2. package/dist/assemble-procedure.d.ts.map +1 -1
  3. package/dist/assemble-procedure.js +3 -1
  4. package/dist/assemble-procedure.js.map +1 -1
  5. package/dist/client.d.ts +13 -3
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +21 -1
  8. package/dist/client.js.map +1 -1
  9. package/dist/create-fn.d.ts +63 -5
  10. package/dist/create-fn.d.ts.map +1 -1
  11. package/dist/create-fn.js +45 -16
  12. package/dist/create-fn.js.map +1 -1
  13. package/dist/expected-client-error.d.ts +6 -0
  14. package/dist/expected-client-error.d.ts.map +1 -1
  15. package/dist/expected-client-error.js +16 -0
  16. package/dist/expected-client-error.js.map +1 -1
  17. package/dist/hono.d.ts +44 -22
  18. package/dist/hono.d.ts.map +1 -1
  19. package/dist/hono.js +51 -20
  20. package/dist/hono.js.map +1 -1
  21. package/dist/index.d.ts +1 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +0 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/issues.d.ts +12 -0
  26. package/dist/issues.d.ts.map +1 -0
  27. package/dist/issues.js +22 -0
  28. package/dist/issues.js.map +1 -0
  29. package/dist/json-schema.d.ts +3 -6
  30. package/dist/json-schema.d.ts.map +1 -1
  31. package/dist/json-schema.js +12 -7
  32. package/dist/json-schema.js.map +1 -1
  33. package/dist/live/codec.d.ts +2 -0
  34. package/dist/live/codec.d.ts.map +1 -1
  35. package/dist/live/codec.js +21 -16
  36. package/dist/live/codec.js.map +1 -1
  37. package/dist/live/fn-live.d.ts +6 -19
  38. package/dist/live/fn-live.d.ts.map +1 -1
  39. package/dist/live/fn-live.js +15 -23
  40. package/dist/live/fn-live.js.map +1 -1
  41. package/dist/live/index.d.ts +2 -2
  42. package/dist/live/index.d.ts.map +1 -1
  43. package/dist/live/index.js +1 -1
  44. package/dist/live/index.js.map +1 -1
  45. package/dist/live/memory.d.ts +11 -1
  46. package/dist/live/memory.d.ts.map +1 -1
  47. package/dist/live/memory.js +14 -1
  48. package/dist/live/memory.js.map +1 -1
  49. package/dist/live/pub-sub.d.ts +50 -8
  50. package/dist/live/pub-sub.d.ts.map +1 -1
  51. package/dist/live/pub-sub.js +79 -26
  52. package/dist/live/pub-sub.js.map +1 -1
  53. package/dist/live/redis-bun.d.ts +6 -1
  54. package/dist/live/redis-bun.d.ts.map +1 -1
  55. package/dist/live/redis-bun.js +10 -1
  56. package/dist/live/redis-bun.js.map +1 -1
  57. package/dist/live/scoped-change-bus.d.ts +3 -1
  58. package/dist/live/scoped-change-bus.d.ts.map +1 -1
  59. package/dist/live/scoped-change-bus.js +3 -0
  60. package/dist/live/scoped-change-bus.js.map +1 -1
  61. package/dist/mastra.d.ts +8 -3
  62. package/dist/mastra.d.ts.map +1 -1
  63. package/dist/mastra.js +8 -1
  64. package/dist/mastra.js.map +1 -1
  65. package/dist/mcp/core.d.ts +31 -14
  66. package/dist/mcp/core.d.ts.map +1 -1
  67. package/dist/mcp/core.js +39 -20
  68. package/dist/mcp/core.js.map +1 -1
  69. package/dist/mcp/sdk.d.ts +6 -2
  70. package/dist/mcp/sdk.d.ts.map +1 -1
  71. package/dist/mcp/sdk.js +9 -3
  72. package/dist/mcp/sdk.js.map +1 -1
  73. package/dist/mcp/server.d.ts +6 -2
  74. package/dist/mcp/server.d.ts.map +1 -1
  75. package/dist/mcp/server.js +9 -3
  76. package/dist/mcp/server.js.map +1 -1
  77. package/dist/mcp.d.ts +3 -7
  78. package/dist/mcp.d.ts.map +1 -1
  79. package/dist/mcp.js +4 -6
  80. package/dist/mcp.js.map +1 -1
  81. package/dist/meta.d.ts +14 -2
  82. package/dist/meta.d.ts.map +1 -1
  83. package/dist/meta.js +6 -2
  84. package/dist/meta.js.map +1 -1
  85. package/dist/otel.d.ts +16 -4
  86. package/dist/otel.d.ts.map +1 -1
  87. package/dist/otel.js +40 -10
  88. package/dist/otel.js.map +1 -1
  89. package/dist/react.d.ts +6 -1
  90. package/dist/react.d.ts.map +1 -1
  91. package/dist/react.js +5 -1
  92. package/dist/react.js.map +1 -1
  93. package/dist/route-options.d.ts.map +1 -1
  94. package/dist/route-options.js +4 -0
  95. package/dist/route-options.js.map +1 -1
  96. package/dist/stream-call.d.ts +15 -0
  97. package/dist/stream-call.d.ts.map +1 -0
  98. package/dist/stream-call.js +13 -0
  99. package/dist/stream-call.js.map +1 -0
  100. package/dist/timing.d.ts +2 -0
  101. package/dist/timing.d.ts.map +1 -1
  102. package/dist/timing.js +2 -0
  103. package/dist/timing.js.map +1 -1
  104. package/dist/tool-errors.d.ts +24 -0
  105. package/dist/tool-errors.d.ts.map +1 -0
  106. package/dist/tool-errors.js +36 -0
  107. package/dist/tool-errors.js.map +1 -0
  108. package/dist/types.d.ts +2 -0
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js.map +1 -1
  111. package/dist/vue.d.ts +47 -4
  112. package/dist/vue.d.ts.map +1 -1
  113. package/dist/vue.js +39 -9
  114. package/dist/vue.js.map +1 -1
  115. package/package.json +1 -1
  116. package/src/assemble-procedure.ts +3 -1
  117. package/src/client.ts +26 -2
  118. package/src/create-fn.ts +149 -19
  119. package/src/expected-client-error.ts +19 -0
  120. package/src/hono.ts +120 -41
  121. package/src/index.ts +3 -2
  122. package/src/issues.ts +35 -0
  123. package/src/json-schema.ts +16 -10
  124. package/src/live/codec.ts +21 -19
  125. package/src/live/fn-live.ts +18 -36
  126. package/src/live/index.ts +2 -2
  127. package/src/live/memory.ts +22 -1
  128. package/src/live/pub-sub.ts +142 -37
  129. package/src/live/redis-bun.ts +23 -2
  130. package/src/live/scoped-change-bus.ts +10 -1
  131. package/src/mastra.ts +10 -4
  132. package/src/mcp/core.ts +76 -29
  133. package/src/mcp/sdk.ts +27 -2
  134. package/src/mcp/server.ts +27 -2
  135. package/src/mcp.ts +5 -16
  136. package/src/meta.ts +28 -4
  137. package/src/otel.ts +41 -9
  138. package/src/react.ts +10 -3
  139. package/src/route-options.ts +8 -0
  140. package/src/stream-call.ts +15 -0
  141. package/src/timing.ts +3 -0
  142. package/src/tool-errors.ts +52 -0
  143. package/src/types.ts +2 -0
  144. package/src/vue.ts +92 -19
package/dist/hono.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hono.js","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable, pipeline } from 'node:stream'\nimport zlib from 'node:zlib'\nimport { SmartCoercionPlugin } from '@orpc/json-schema'\nimport type { OpenAPIGeneratorGenerateOptions } from '@orpc/openapi'\nimport { OpenAPIHandler } from '@orpc/openapi/fetch'\nimport { OpenAPIReferencePlugin } from '@orpc/openapi/plugins'\nimport {\n\ttype AnyRouter,\n\ttype InferRouterInitialContext,\n\tonError as orpcOnError\n} from '@orpc/server'\nimport { RPCHandler } from '@orpc/server/fetch'\nimport { BatchHandlerPlugin } from '@orpc/server/plugins'\nimport type { StandardHandlerPlugin } from '@orpc/server/standard'\nimport { ZodToJsonSchemaConverter } from '@orpc/zod/zod4'\nimport type { Context as HonoContext, Env, Hono } from 'hono'\nimport type { StatusCode } from 'hono/utils/http-status'\nimport { REQUEST_TIMING, type InvocationTiming } from './timing.js'\nimport { isExpectedClientError } from './expected-client-error.js'\nimport type { ProcedureFilter } from './mcp.js'\n\n/** Per-request timings in ms; `fn()` adds `handler_ms`. Sent as Server-Timing. */\nexport type RequestTiming = Record<string, number>\n\n/** What every request starts with; the default context when `context` is omitted. */\nexport type BaseContext = { headers: Headers; timing: RequestTiming }\n\n/**\n * Builds the router's initial context from the request. Return a `Response`\n * to answer (e.g. 401) instead.\n */\nexport type ContextFactory<E extends Env, R extends AnyRouter> = (\n\tc: HonoContext<E>,\n\tbase: BaseContext\n) =>\n\t| InferRouterInitialContext<R>\n\t| Response\n\t| Promise<InferRouterInitialContext<R> | Response>\n\n/** `context` is optional only when the base context already satisfies the router. */\ntype ContextOption<E extends Env, R extends AnyRouter> =\n\tBaseContext extends InferRouterInitialContext<R>\n\t\t? { context?: ContextFactory<E, R> }\n\t\t: { context: ContextFactory<E, R> }\n\ntype Path = `/${string}`\ntype Plugin<T extends object> = StandardHandlerPlugin<T>\n\nexport type MountOrpcOptions<\n\tE extends Env,\n\tR extends AnyRouter\n> = ContextOption<E, R> & {\n\trouter: R\n\t/** Mount the RPC handler (oRPC's `RPCLink`) here. Omit to skip it. */\n\trpcPrefix?: Path\n\t/** Mount the OpenAPI (REST) handler and its Scalar docs here. */\n\topenapi?: {\n\t\tprefix: Path\n\t\tinfo?: { title: string; version: string; description?: string }\n\t\t/** Docs page, relative to `prefix` (default '/'); the spec is at `/spec.json`. */\n\t\tdocsPath?: Path\n\t\t/** Only expose matching procedures (also filters the spec). */\n\t\tfilter?: ProcedureFilter\n\t\t/** Turn JSON strings back into `Date`s etc. for `z.date()` inputs. */\n\t\tsmartCoercion?: boolean\n\t\t/** Extra spec fields, e.g. `components.securitySchemes` and `security`. */\n\t\tspec?: Omit<OpenAPIGeneratorGenerateOptions, 'filter'>\n\t\tplugins?: Plugin<InferRouterInitialContext<R>>[]\n\t}\n\t/** Collapse parallel RPC calls into one HTTP request. Default: true (25 calls). */\n\tbatch?: boolean | { maxSize: number }\n\t/** Add a Server-Timing header from the request timing. Default: true */\n\tserverTiming?: boolean\n\t/**\n\t * gzip JSON responses and batch event streams for clients that accept it,\n\t * flushing after every batch result. Other event streams are left alone.\n\t * Default: true\n\t */\n\tcompress?: boolean\n\t/** SSE keep-alive comments every N ms (default 15000), or false. */\n\tsseKeepAlive?: boolean | number\n\t/** Extra RPC plugins (e.g. `CORSPlugin`). */\n\tplugins?: Plugin<InferRouterInitialContext<R>>[]\n\t/** Rewrite request headers before they reach the context (see `normalizeExpoOrigin`). */\n\tnormalizeHeaders?: (headers: Headers) => Headers\n\t/**\n\t * Time spent before the handler ran, reported as `queue`. Default: time\n\t * since {@link markRequestArrival}, when the server marked the request.\n\t */\n\tqueueMs?: (request: Request) => number | undefined\n\t/**\n\t * Unexpected procedure errors (oRPC turns thrown errors into responses, so\n\t * Hono's `onError` never sees them). Expected client errors are skipped.\n\t */\n\tonError?: (error: unknown, request: { url: string; method: string }) => void\n\t/** Default: 4xx `ORPCError` or `AbortError`. */\n\tisExpectedError?: (error: unknown) => boolean\n}\n\nconst arrivals = new WeakMap<Request, number>()\n\n/**\n * Marks a request at the server's front door (`Bun.serve({ fetch })`), before\n * routing and middleware. `mountOrpc` reports the time until the procedure\n * runs as `queue_ms`: in-process queueing no handler timer can see.\n */\nexport function markRequestArrival(request: Request): void {\n\tarrivals.set(request, performance.now())\n}\n\n/** Milliseconds since {@link markRequestArrival}, or undefined when unmarked. */\nexport function msSinceRequestArrival(request: Request): number | undefined {\n\tconst arrivedAt = arrivals.get(request)\n\treturn arrivedAt === undefined ? undefined : performance.now() - arrivedAt\n}\n\n/**\n * Expo native sends `expo-origin` but not `origin`; copy it so cookie-based\n * auth (e.g. Better Auth) sees the origin.\n */\nexport function normalizeExpoOrigin(raw: Headers): Headers {\n\tconst expo = raw.get('expo-origin')\n\tif (!expo || raw.get('origin')) return raw\n\tconst headers = new Headers(raw)\n\theaders.set('origin', expo)\n\treturn headers\n}\n\nexport function formatServerTiming(\n\ttotalMs: number,\n\ttiming: Record<string, number | undefined>\n): string {\n\tconst parts = [`total;dur=${totalMs.toFixed(2)}`]\n\tfor (const [key, value] of Object.entries(timing)) {\n\t\tif (value !== undefined) {\n\t\t\tparts.push(`${key.replace(/_ms$/, '')};dur=${value.toFixed(2)}`)\n\t\t}\n\t}\n\treturn parts.join(', ')\n}\n\n/**\n * Response headers plus Server-Timing. For SSE, also disable proxy buffering\n * so keep-alive comments reach the edge (empty `:` lines are otherwise easy\n * for nginx/Fastly to hold until an idle kill). A copy: some responses (e.g.\n * redirects) have immutable headers.\n */\nexport function finishOrpcHeaders(\n\tresponse: Response,\n\tserverTiming: string | undefined\n): Headers {\n\tconst headers = new Headers(response.headers)\n\tif (serverTiming) {\n\t\theaders.set('Server-Timing', serverTiming)\n\t\theaders.append('Access-Control-Expose-Headers', 'Server-Timing')\n\t}\n\tif ((headers.get('content-type') ?? '').includes('text/event-stream')) {\n\t\theaders.set('Cache-Control', 'no-cache')\n\t\theaders.set('X-Accel-Buffering', 'no')\n\t}\n\treturn headers\n}\n\nconst NO_TRANSFORM = /(?:^|,)\\s*no-transform\\s*(?:,|$)/i\n\n/**\n * JSON, and the event stream oRPC answers a streaming batch with (one event\n * per result). Other event streams are live: they stay open and carry little.\n */\nfunction shouldCompress(request: Request, response: Response): boolean {\n\tif (request.method === 'HEAD') return false\n\tif (!request.headers.get('accept-encoding')?.includes('gzip')) return false\n\tif (response.headers.has('content-encoding')) return false\n\tif (NO_TRANSFORM.test(response.headers.get('cache-control') ?? '')) {\n\t\treturn false\n\t}\n\tconst type = response.headers.get('content-type') ?? ''\n\tif (type.startsWith('text/event-stream')) {\n\t\t// BatchHandlerPlugin keys on this header too, whatever the URL.\n\t\treturn request.headers.has('x-orpc-batch')\n\t}\n\treturn type.startsWith('application/json')\n}\n\n/**\n * gzip that emits every chunk at once, so a fast batch result is not held\n * back by a slow one. Cancelling the result cancels `body`.\n */\nfunction gzipFlushingEachChunk(\n\tbody: ReadableStream<Uint8Array>\n): ReadableStream<Uint8Array> {\n\tconst gzip = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH })\n\tpipeline(Readable.fromWeb(body as never), gzip, () => {})\n\treturn Readable.toWeb(gzip) as unknown as ReadableStream<Uint8Array>\n}\n\n/** Mount oRPC's RPC and OpenAPI handlers on a Hono app. */\nexport function mountOrpc<E extends Env, R extends AnyRouter>(\n\tapp: Hono<E>,\n\toptions: MountOrpcOptions<E, R>\n): void {\n\tconst {\n\t\trouter,\n\t\tbatch = true,\n\t\tserverTiming = true,\n\t\tsseKeepAlive = true,\n\t\tcompress = true\n\t} = options\n\tconst isExpectedError = options.isExpectedError ?? isExpectedClientError\n\tconst keepAlive =\n\t\tsseKeepAlive === false\n\t\t\t? { eventIteratorKeepAliveEnabled: false }\n\t\t\t: {\n\t\t\t\t\teventIteratorKeepAliveEnabled: true,\n\t\t\t\t\t// Explicit keep-alive under proxy idle timers (~30s); oRPC's default is 5s.\n\t\t\t\t\teventIteratorKeepAliveInterval:\n\t\t\t\t\t\tsseKeepAlive === true ? 15_000 : sseKeepAlive\n\t\t\t\t}\n\tconst report = (\n\t\terror: unknown,\n\t\t{ request }: { request: { url: URL; method: string } }\n\t) => {\n\t\ttry {\n\t\t\tif (isExpectedError(error)) return\n\t\t\toptions.onError?.(error, {\n\t\t\t\turl: request.url.pathname,\n\t\t\t\tmethod: request.method\n\t\t\t})\n\t\t} catch {\n\t\t\t/* Error reporting cannot replace transport outcomes. */\n\t\t}\n\t}\n\n\tconst mount = (\n\t\tprefix: Path,\n\t\thandler: Pick<RPCHandler<InferRouterInitialContext<R>>, 'handle'>\n\t) => {\n\t\tapp.use(`${prefix}/*`, async (c, next) => {\n\t\t\tconst timing: RequestTiming = {}\n\t\t\tconst queueMs = (options.queueMs ?? msSinceRequestArrival)(c.req.raw)\n\t\t\tif (queueMs !== undefined)\n\t\t\t\ttiming.queue_ms = Math.round(queueMs * 100) / 100\n\t\t\tconst started = performance.now()\n\t\t\tconst headers = options.normalizeHeaders\n\t\t\t\t? options.normalizeHeaders(c.req.raw.headers)\n\t\t\t\t: c.req.raw.headers\n\t\t\tconst context = options.context\n\t\t\t\t? await options.context(c, { headers, timing })\n\t\t\t\t: { headers, timing }\n\t\t\tif (context instanceof Response) return context\n\t\t\tconst invocationTiming: InvocationTiming = { procedureMs: 0, calls: 0 }\n\t\t\tconst { matched, response } = await handler.handle(c.req.raw, {\n\t\t\t\tprefix,\n\t\t\t\tcontext: {\n\t\t\t\t\t...context,\n\t\t\t\t\t[REQUEST_TIMING]: invocationTiming\n\t\t\t\t} as InferRouterInitialContext<R>\n\t\t\t})\n\t\t\tif (!matched) return next()\n\t\t\tconst timed = serverTiming\n\t\t\t\t? formatServerTiming(performance.now() - started, {\n\t\t\t\t\t\t...timing,\n\t\t\t\t\t\thandler_ms: invocationTiming.procedureMs\n\t\t\t\t\t})\n\t\t\t\t: undefined\n\t\t\tconst responseHeaders = finishOrpcHeaders(response, timed)\n\t\t\tlet body = response.body\n\t\t\tif (body && compress && shouldCompress(c.req.raw, response)) {\n\t\t\t\tbody = gzipFlushingEachChunk(body)\n\t\t\t\tresponseHeaders.set('content-encoding', 'gzip')\n\t\t\t\tresponseHeaders.delete('content-length')\n\t\t\t\tresponseHeaders.append('vary', 'accept-encoding')\n\t\t\t}\n\t\t\treturn c.newResponse(body, {\n\t\t\t\t// oRPC only produces valid HTTP status codes.\n\t\t\t\tstatus: response.status as StatusCode,\n\t\t\t\theaders: responseHeaders\n\t\t\t})\n\t\t})\n\t}\n\n\tif (options.rpcPrefix) {\n\t\tconst plugins: Plugin<InferRouterInitialContext<R>>[] = [\n\t\t\t...(options.plugins ?? [])\n\t\t]\n\t\tif (batch) {\n\t\t\tplugins.push(\n\t\t\t\tnew BatchHandlerPlugin({\n\t\t\t\t\tmaxSize: batch === true ? 25 : batch.maxSize\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t\tmount(\n\t\t\toptions.rpcPrefix,\n\t\t\tnew RPCHandler(router, {\n\t\t\t\t...keepAlive,\n\t\t\t\tplugins,\n\t\t\t\tinterceptors: options.onError ? [orpcOnError(report)] : []\n\t\t\t})\n\t\t)\n\t}\n\n\tif (options.openapi) {\n\t\tconst { openapi } = options\n\t\tconst filter = openapi.filter ? { filter: openapi.filter } : {}\n\t\tconst converters = [new ZodToJsonSchemaConverter()]\n\t\tconst plugins: Plugin<InferRouterInitialContext<R>>[] = [\n\t\t\t...(openapi.plugins ?? [])\n\t\t]\n\t\tif (openapi.smartCoercion) {\n\t\t\tplugins.push(new SmartCoercionPlugin({ schemaConverters: converters }))\n\t\t}\n\t\tplugins.push(\n\t\t\tnew OpenAPIReferencePlugin({\n\t\t\t\tdocsProvider: 'scalar',\n\t\t\t\t...(openapi.docsPath ? { docsPath: openapi.docsPath } : {}),\n\t\t\t\tschemaConverters: converters,\n\t\t\t\tspecGenerateOptions: {\n\t\t\t\t\tinfo: openapi.info ?? { title: 'API', version: '0.0.0' },\n\t\t\t\t\tservers: [{ url: openapi.prefix }],\n\t\t\t\t\t...filter,\n\t\t\t\t\t...openapi.spec\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t\tmount(\n\t\t\topenapi.prefix,\n\t\t\tnew OpenAPIHandler(router, {\n\t\t\t\t...keepAlive,\n\t\t\t\t...filter,\n\t\t\t\tplugins,\n\t\t\t\tinterceptors: options.onError ? [orpcOnError(report)] : []\n\t\t\t})\n\t\t)\n\t}\n}\n"]}
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable, pipeline } from 'node:stream'\nimport zlib from 'node:zlib'\nimport type { OpenAPIGeneratorGenerateOptions } from '@orpc/openapi'\nimport {\n\ttype AnyRouter,\n\ttype InferRouterInitialContext,\n\tonError as orpcOnError\n} from '@orpc/server'\nimport { RPCHandler } from '@orpc/server/fetch'\nimport { BatchHandlerPlugin } from '@orpc/server/plugins'\nimport type { StandardHandlerPlugin } from '@orpc/server/standard'\nimport type { Context as HonoContext, Env, Hono } from 'hono'\nimport type { StatusCode } from 'hono/utils/http-status'\nimport { REQUEST_TIMING, type InvocationTiming } from './timing.js'\nimport { isExpectedClientError } from './expected-client-error.js'\nimport { hasTag, type ProcedureFilter } from './meta.js'\n\nexport { hasTag, type ProcedureFilter }\n\n/** Per-request timings in ms; `fn()` adds `handler_ms`. Sent as Server-Timing. */\nexport type RequestTiming = Record<string, number>\n\n/**\n * Run `work` and add its duration to `timing[key]` (rounded to 0.01 ms),\n * whether it resolves or throws: `await timed(context.timing, 'auth_ms', () => getSession(headers))`.\n */\nexport async function timed<T>(\n\ttiming: RequestTiming,\n\tkey: string,\n\twork: () => T | Promise<T>\n): Promise<T> {\n\tconst started = performance.now()\n\ttry {\n\t\treturn await work()\n\t} finally {\n\t\ttiming[key] =\n\t\t\t(timing[key] ?? 0) + Math.round((performance.now() - started) * 100) / 100\n\t}\n}\n\n/** What every request starts with; the default context when `context` is omitted. */\nexport type BaseContext = { headers: Headers; timing: RequestTiming }\n\n/**\n * Builds the router's initial context from the request. Return a `Response`\n * to answer (e.g. 401) instead.\n */\nexport type ContextFactory<E extends Env, R extends AnyRouter> = (\n\tc: HonoContext<E>,\n\tbase: BaseContext\n) =>\n\t| InferRouterInitialContext<R>\n\t| Response\n\t| Promise<InferRouterInitialContext<R> | Response>\n\n/** `context` is optional only when the base context already satisfies the router. */\ntype ContextOption<E extends Env, R extends AnyRouter> =\n\tBaseContext extends InferRouterInitialContext<R>\n\t\t? { context?: ContextFactory<E, R> }\n\t\t: { context: ContextFactory<E, R> }\n\ntype Path = `/${string}`\ntype Handler<C> = {\n\thandle(\n\t\trequest: Request,\n\t\toptions: { prefix: Path; context: C }\n\t): Promise<{ matched: boolean; response: Response | undefined }>\n}\ntype Plugin<T extends object> = StandardHandlerPlugin<T>\n\nexport type OpenApiMountOptions<R extends AnyRouter> = {\n\tprefix: Path\n\tinfo?: { title: string; version: string; description?: string }\n\t/** Docs page, relative to `prefix` (default '/'); the spec is at `/spec.json`. */\n\tdocsPath?: Path\n\t/** false: serve the REST routes without the docs page and `spec.json`. */\n\tdocs?: boolean\n\t/**\n\t * The procedures to publish (also filters the spec), e.g.\n\t * `hasTag('external')`. Required, so publishing is a choice;\n\t * `() => true` publishes every route.\n\t */\n\tfilter: ProcedureFilter\n\t/** Turn JSON strings back into `Date`s etc. for `z.date()` inputs. */\n\tsmartCoercion?: boolean\n\t/** Extra spec fields, e.g. `components.securitySchemes` and `security`. */\n\tspec?: Omit<OpenAPIGeneratorGenerateOptions, 'filter'>\n\tplugins?: Plugin<InferRouterInitialContext<R>>[]\n}\n\nexport type MountOrpcOptions<\n\tE extends Env,\n\tR extends AnyRouter\n> = ContextOption<E, R> & {\n\trouter: R\n\t/** Mount the RPC handler (oRPC's `RPCLink`) here. Omit to skip it. */\n\trpcPrefix?: Path\n\t/**\n\t * Mount the OpenAPI (REST) handler and its Scalar docs here. Needs the\n\t * optional peers `@orpc/openapi`, `@orpc/json-schema` and `@orpc/zod`,\n\t * loaded on the first request to `prefix`.\n\t */\n\topenapi?: OpenApiMountOptions<R>\n\t/** Collapse parallel RPC calls into one HTTP request. Default: true (25 calls). */\n\tbatch?: boolean | { maxSize: number }\n\t/** Add a Server-Timing header from the request timing. Default: true */\n\tserverTiming?: boolean\n\t/**\n\t * gzip JSON responses and batch event streams for clients that accept it,\n\t * flushing after every batch result. Other event streams are left alone.\n\t * Default: true\n\t */\n\tcompress?: boolean\n\t/** SSE keep-alive comments every N ms (default 15000), or false. */\n\tsseKeepAlive?: boolean | number\n\t/**\n\t * Extra RPC plugins. CORS belongs to Hono's `cors()` on the app, once; a\n\t * cross-origin client with batching needs `x-orpc-batch` in its `allowHeaders`.\n\t */\n\tplugins?: Plugin<InferRouterInitialContext<R>>[]\n\t/** Rewrite request headers before they reach the context (see `normalizeExpoOrigin`). */\n\tnormalizeHeaders?: (headers: Headers) => Headers\n\t/**\n\t * Time spent before the handler ran, reported as `queue`. Default: time\n\t * since {@link markRequestArrival}, when the server marked the request.\n\t */\n\tqueueMs?: (request: Request) => number | undefined\n\t/**\n\t * Unexpected procedure errors (oRPC turns thrown errors into responses, so\n\t * Hono's `onError` never sees them). Expected client errors are skipped.\n\t */\n\tonError?: (error: unknown, request: { url: string; method: string }) => void\n\t/**\n\t * Default: `isExpectedClientError`, which also accepts any error the\n\t * route's `createFn({ isExpectedError })` classified as expected.\n\t */\n\tisExpectedError?: (error: unknown) => boolean\n}\n\nconst arrivals = new WeakMap<Request, number>()\n\n/**\n * Marks a request at the server's front door (`Bun.serve({ fetch })`), before\n * routing and middleware. `mountOrpc` reports the time until the procedure\n * runs as `queue_ms`: in-process queueing no handler timer can see.\n */\nexport function markRequestArrival(request: Request): void {\n\tarrivals.set(request, performance.now())\n}\n\n/** Milliseconds since {@link markRequestArrival}, or undefined when unmarked. */\nexport function msSinceRequestArrival(request: Request): number | undefined {\n\tconst arrivedAt = arrivals.get(request)\n\treturn arrivedAt === undefined ? undefined : performance.now() - arrivedAt\n}\n\n/**\n * Expo native sends `expo-origin` but not `origin`; copy it so cookie-based\n * auth (e.g. Better Auth) sees the origin.\n */\nexport function normalizeExpoOrigin(raw: Headers): Headers {\n\tconst expo = raw.get('expo-origin')\n\tif (!expo || raw.get('origin')) return raw\n\tconst headers = new Headers(raw)\n\theaders.set('origin', expo)\n\treturn headers\n}\n\nexport function formatServerTiming(\n\ttotalMs: number,\n\ttiming: Record<string, number | undefined>\n): string {\n\tconst parts = [`total;dur=${totalMs.toFixed(2)}`]\n\tfor (const [key, value] of Object.entries(timing)) {\n\t\tif (value !== undefined) {\n\t\t\tparts.push(`${key.replace(/_ms$/, '')};dur=${value.toFixed(2)}`)\n\t\t}\n\t}\n\treturn parts.join(', ')\n}\n\n/**\n * Response headers plus Server-Timing. For SSE, also disable proxy buffering\n * so keep-alive comments reach the edge (empty `:` lines are otherwise easy\n * for nginx/Fastly to hold until an idle kill). A copy: some responses (e.g.\n * redirects) have immutable headers.\n */\nexport function finishOrpcHeaders(\n\tresponse: Response,\n\tserverTiming: string | undefined\n): Headers {\n\tconst headers = new Headers(response.headers)\n\tif (serverTiming) {\n\t\theaders.set('Server-Timing', serverTiming)\n\t\theaders.append('Access-Control-Expose-Headers', 'Server-Timing')\n\t}\n\tif ((headers.get('content-type') ?? '').includes('text/event-stream')) {\n\t\theaders.set('Cache-Control', 'no-cache')\n\t\theaders.set('X-Accel-Buffering', 'no')\n\t}\n\treturn headers\n}\n\nconst NO_TRANSFORM = /(?:^|,)\\s*no-transform\\s*(?:,|$)/i\n\n/**\n * JSON, and the event stream oRPC answers a streaming batch with (one event\n * per result). Other event streams are live: they stay open and carry little.\n */\nfunction shouldCompress(request: Request, response: Response): boolean {\n\tif (request.method === 'HEAD') return false\n\tif (!request.headers.get('accept-encoding')?.includes('gzip')) return false\n\tif (response.headers.has('content-encoding')) return false\n\tif (NO_TRANSFORM.test(response.headers.get('cache-control') ?? '')) {\n\t\treturn false\n\t}\n\tconst type = response.headers.get('content-type') ?? ''\n\tif (type.startsWith('text/event-stream')) {\n\t\t// BatchHandlerPlugin keys on this header too, whatever the URL.\n\t\treturn request.headers.has('x-orpc-batch')\n\t}\n\treturn type.startsWith('application/json')\n}\n\n/**\n * gzip that emits every chunk at once, so a fast batch result is not held\n * back by a slow one. Cancelling the result cancels `body`.\n */\nfunction gzipFlushingEachChunk(\n\tbody: ReadableStream<Uint8Array>\n): ReadableStream<Uint8Array> {\n\tconst gzip = zlib.createGzip({ flush: zlib.constants.Z_SYNC_FLUSH })\n\tpipeline(Readable.fromWeb(body as never), gzip, () => {})\n\treturn Readable.toWeb(gzip) as unknown as ReadableStream<Uint8Array>\n}\n\n/** Mount oRPC's RPC and OpenAPI handlers on a Hono app. */\nexport function mountOrpc<E extends Env, R extends AnyRouter>(\n\tapp: Hono<E>,\n\toptions: MountOrpcOptions<E, R>\n): void {\n\tconst {\n\t\trouter,\n\t\tbatch = true,\n\t\tserverTiming = true,\n\t\tsseKeepAlive = true,\n\t\tcompress = true\n\t} = options\n\tconst isExpectedError = options.isExpectedError ?? isExpectedClientError\n\tconst keepAlive =\n\t\tsseKeepAlive === false\n\t\t\t? { eventIteratorKeepAliveEnabled: false }\n\t\t\t: {\n\t\t\t\t\teventIteratorKeepAliveEnabled: true,\n\t\t\t\t\t// Explicit keep-alive under proxy idle timers (~30s); oRPC's default is 5s.\n\t\t\t\t\teventIteratorKeepAliveInterval:\n\t\t\t\t\t\tsseKeepAlive === true ? 15_000 : sseKeepAlive\n\t\t\t\t}\n\tconst report = (\n\t\terror: unknown,\n\t\t{ request }: { request: { url: URL; method: string } }\n\t) => {\n\t\ttry {\n\t\t\tif (isExpectedError(error)) return\n\t\t\toptions.onError?.(error, {\n\t\t\t\turl: request.url.pathname,\n\t\t\t\tmethod: request.method\n\t\t\t})\n\t\t} catch {\n\t\t\t/* Error reporting cannot replace transport outcomes. */\n\t\t}\n\t}\n\n\tconst mount = (\n\t\tprefix: Path,\n\t\thandler: Handler<InferRouterInitialContext<R>>\n\t) => {\n\t\tapp.use(`${prefix}/*`, async (c, next) => {\n\t\t\tconst timing: RequestTiming = {}\n\t\t\tconst queueMs = (options.queueMs ?? msSinceRequestArrival)(c.req.raw)\n\t\t\tif (queueMs !== undefined)\n\t\t\t\ttiming.queue_ms = Math.round(queueMs * 100) / 100\n\t\t\tconst started = performance.now()\n\t\t\tconst headers = options.normalizeHeaders\n\t\t\t\t? options.normalizeHeaders(c.req.raw.headers)\n\t\t\t\t: c.req.raw.headers\n\t\t\tconst context = options.context\n\t\t\t\t? await options.context(c, { headers, timing })\n\t\t\t\t: { headers, timing }\n\t\t\tif (context instanceof Response) return context\n\t\t\tconst invocationTiming: InvocationTiming = { procedureMs: 0, calls: 0 }\n\t\t\tconst { matched, response } = await handler.handle(c.req.raw, {\n\t\t\t\tprefix,\n\t\t\t\tcontext: {\n\t\t\t\t\t...context,\n\t\t\t\t\t[REQUEST_TIMING]: invocationTiming\n\t\t\t\t} as InferRouterInitialContext<R>\n\t\t\t})\n\t\t\tif (!matched || !response) return next()\n\t\t\tconst timed = serverTiming\n\t\t\t\t? formatServerTiming(performance.now() - started, {\n\t\t\t\t\t\t...timing,\n\t\t\t\t\t\thandler_ms: invocationTiming.procedureMs\n\t\t\t\t\t})\n\t\t\t\t: undefined\n\t\t\tconst responseHeaders = finishOrpcHeaders(response, timed)\n\t\t\tlet body = response.body\n\t\t\tif (body && compress && shouldCompress(c.req.raw, response)) {\n\t\t\t\tbody = gzipFlushingEachChunk(body)\n\t\t\t\tresponseHeaders.set('content-encoding', 'gzip')\n\t\t\t\tresponseHeaders.delete('content-length')\n\t\t\t\tresponseHeaders.append('vary', 'accept-encoding')\n\t\t\t}\n\t\t\treturn c.newResponse(body, {\n\t\t\t\t// oRPC only produces valid HTTP status codes.\n\t\t\t\tstatus: response.status as StatusCode,\n\t\t\t\theaders: responseHeaders\n\t\t\t})\n\t\t})\n\t}\n\n\tif (options.rpcPrefix) {\n\t\tconst plugins: Plugin<InferRouterInitialContext<R>>[] = [\n\t\t\t...(options.plugins ?? [])\n\t\t]\n\t\tif (batch) {\n\t\t\tplugins.push(\n\t\t\t\tnew BatchHandlerPlugin({\n\t\t\t\t\tmaxSize: batch === true ? 25 : batch.maxSize\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t\tmount(\n\t\t\toptions.rpcPrefix,\n\t\t\tnew RPCHandler(router, {\n\t\t\t\t...keepAlive,\n\t\t\t\tplugins,\n\t\t\t\tinterceptors: options.onError ? [orpcOnError(report)] : []\n\t\t\t})\n\t\t)\n\t}\n\n\tif (options.openapi) {\n\t\tconst { openapi } = options\n\t\tif (typeof openapi.filter !== 'function')\n\t\t\tthrow new TypeError(\n\t\t\t\t'orpc-fn: mountOrpc openapi needs a filter; pass () => true to publish every route'\n\t\t\t)\n\t\tlet loading: Promise<Handler<InferRouterInitialContext<R>>> | undefined\n\t\tmount(openapi.prefix, {\n\t\t\thandle: async (request, handleOptions) => {\n\t\t\t\tloading ??= createOpenApiHandler(\n\t\t\t\t\trouter,\n\t\t\t\t\topenapi,\n\t\t\t\t\tkeepAlive,\n\t\t\t\t\toptions.onError ? report : undefined\n\t\t\t\t)\n\t\t\t\treturn (await loading).handle(request, handleOptions)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/** Loads the OpenAPI peers only for apps that mount it. */\nasync function createOpenApiHandler<R extends AnyRouter>(\n\trouter: R,\n\topenapi: OpenApiMountOptions<R>,\n\tkeepAlive: object,\n\treport:\n\t\t| ((\n\t\t\t\terror: unknown,\n\t\t\t\toptions: { request: { url: URL; method: string } }\n\t\t ) => void)\n\t\t| undefined\n): Promise<Handler<InferRouterInitialContext<R>>> {\n\tconst [\n\t\t{ SmartCoercionPlugin },\n\t\t{ OpenAPIHandler },\n\t\t{ OpenAPIReferencePlugin },\n\t\t{ ZodToJsonSchemaConverter }\n\t] = await Promise.all([\n\t\timport('@orpc/json-schema'),\n\t\timport('@orpc/openapi/fetch'),\n\t\timport('@orpc/openapi/plugins'),\n\t\timport('@orpc/zod/zod4')\n\t])\n\tconst converters = [new ZodToJsonSchemaConverter()]\n\tconst plugins: Plugin<InferRouterInitialContext<R>>[] = [\n\t\t...(openapi.plugins ?? [])\n\t]\n\tif (openapi.smartCoercion) {\n\t\tplugins.push(new SmartCoercionPlugin({ schemaConverters: converters }))\n\t}\n\tif (openapi.docs !== false) {\n\t\tplugins.push(\n\t\t\tnew OpenAPIReferencePlugin({\n\t\t\t\tdocsProvider: 'scalar',\n\t\t\t\t...(openapi.docsPath ? { docsPath: openapi.docsPath } : {}),\n\t\t\t\tschemaConverters: converters,\n\t\t\t\tspecGenerateOptions: {\n\t\t\t\t\tinfo: openapi.info ?? { title: 'API', version: '0.0.0' },\n\t\t\t\t\tservers: [{ url: openapi.prefix }],\n\t\t\t\t\tfilter: openapi.filter,\n\t\t\t\t\t...openapi.spec\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\t}\n\treturn new OpenAPIHandler(router, {\n\t\t...keepAlive,\n\t\tfilter: openapi.filter,\n\t\tplugins,\n\t\tinterceptors: report ? [orpcOnError(report)] : []\n\t})\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export { type BoundCall, createBoundCall } from './bound-call.js';
2
- export { type CreateFnOptions, createFn, type FnFactory } from './create-fn.js';
2
+ export { type CreateFnOptions, createFn, type FnFactory, type RoutePolicyParams, type TestCallExtras } from './create-fn.js';
3
3
  export { isExpectedClientError } from './expected-client-error.js';
4
- export { createBoundedEventQueue } from './live/pub-sub.js';
5
4
  export { createDefaultLogger, type FnLogger, type LogAttributes } from './logger.js';
6
5
  export { defineMeta, FN_META_KEY, type FnMeta, readFnMeta } from './meta.js';
7
6
  export type { AttributeValue, OtelApiLike, SpanLike, SpanOf, Tracing } from './otel.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EACN,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,SAAS,EACd,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACN,mBAAmB,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5E,YAAY,EACX,cAAc,EACd,WAAW,EACX,QAAQ,EACR,MAAM,EACN,OAAO,EACP,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,MAAM,aAAa,CAAA;AACpB,YAAY,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,EAAE,EACF,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EACN,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EACN,mBAAmB,EACnB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC5E,YAAY,EACX,cAAc,EACd,WAAW,EACX,QAAQ,EACR,MAAM,EACN,OAAO,EACP,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,MAAM,aAAa,CAAA;AACpB,YAAY,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,EAAE,EACF,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,KAAK,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,MAAM,YAAY,CAAA"}
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  export { createBoundCall } from './bound-call.js';
2
2
  export { createFn } from './create-fn.js';
3
3
  export { isExpectedClientError } from './expected-client-error.js';
4
- export { createBoundedEventQueue } from './live/pub-sub.js';
5
4
  export { createDefaultLogger } from './logger.js';
6
5
  export { defineMeta, FN_META_KEY, readFnMeta } from './meta.js';
7
6
  export { createRouter, createStreamManifest, createStreamManifestAsync, renderStreamManifest } from './router.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAEN,QAAQ,EAER,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACN,mBAAmB,EAGnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAe,UAAU,EAAE,MAAM,WAAW,CAAA;AAQ5E,OAAO,EACN,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,MAAM,aAAa,CAAA","sourcesContent":["export { type BoundCall, createBoundCall } from './bound-call.js'\nexport {\n\ttype CreateFnOptions,\n\tcreateFn,\n\ttype FnFactory\n} from './create-fn.js'\nexport { isExpectedClientError } from './expected-client-error.js'\nexport { createBoundedEventQueue } from './live/pub-sub.js'\nexport {\n\tcreateDefaultLogger,\n\ttype FnLogger,\n\ttype LogAttributes\n} from './logger.js'\nexport { defineMeta, FN_META_KEY, type FnMeta, readFnMeta } from './meta.js'\nexport type {\n\tAttributeValue,\n\tOtelApiLike,\n\tSpanLike,\n\tSpanOf,\n\tTracing\n} from './otel.js'\nexport {\n\tcreateRouter,\n\tcreateStreamManifest,\n\tcreateStreamManifestAsync,\n\trenderStreamManifest\n} from './router.js'\nexport type {\n\tAnyFnContext,\n\tBuilderLike,\n\tCurrentContextOf,\n\tFn,\n\tFnCompletedEvent,\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tGuard,\n\tGuardOptions,\n\tGuardParams,\n\tHandlerParams,\n\tInitialContextOf,\n\tProcedureContext,\n\tProcedureInput,\n\tProcedureKey,\n\tProcedureOption,\n\tProcedureOutput,\n\tReservedOptionKey,\n\tRouteConfig\n} from './types.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAEN,QAAQ,EAIR,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EACN,mBAAmB,EAGnB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAe,UAAU,EAAE,MAAM,WAAW,CAAA;AAQ5E,OAAO,EACN,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,MAAM,aAAa,CAAA","sourcesContent":["export { type BoundCall, createBoundCall } from './bound-call.js'\nexport {\n\ttype CreateFnOptions,\n\tcreateFn,\n\ttype FnFactory,\n\ttype RoutePolicyParams,\n\ttype TestCallExtras\n} from './create-fn.js'\nexport { isExpectedClientError } from './expected-client-error.js'\nexport {\n\tcreateDefaultLogger,\n\ttype FnLogger,\n\ttype LogAttributes\n} from './logger.js'\nexport { defineMeta, FN_META_KEY, type FnMeta, readFnMeta } from './meta.js'\nexport type {\n\tAttributeValue,\n\tOtelApiLike,\n\tSpanLike,\n\tSpanOf,\n\tTracing\n} from './otel.js'\nexport {\n\tcreateRouter,\n\tcreateStreamManifest,\n\tcreateStreamManifestAsync,\n\trenderStreamManifest\n} from './router.js'\nexport type {\n\tAnyFnContext,\n\tBuilderLike,\n\tCurrentContextOf,\n\tFn,\n\tFnCompletedEvent,\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tGuard,\n\tGuardOptions,\n\tGuardParams,\n\tHandlerParams,\n\tInitialContextOf,\n\tProcedureContext,\n\tProcedureInput,\n\tProcedureKey,\n\tProcedureOption,\n\tProcedureOutput,\n\tReservedOptionKey,\n\tRouteConfig\n} from './types.js'\n"]}
@@ -0,0 +1,12 @@
1
+ /** A Standard Schema issue, as oRPC puts them on `error.data.issues`. */
2
+ export type SchemaIssue = {
3
+ message: string;
4
+ path?: ReadonlyArray<PropertyKey | {
5
+ key: PropertyKey;
6
+ }> | undefined;
7
+ };
8
+ /** `items.0.name: Required`, or the bare message for a root issue. */
9
+ export declare function formatIssue(issue: SchemaIssue): string;
10
+ /** The validation issues oRPC attaches to a BAD_REQUEST (`data.issues`). */
11
+ export declare function issuesOf(error: unknown): SchemaIssue[];
12
+ //# sourceMappingURL=issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../src/issues.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG;QAAE,GAAG,EAAE,WAAW,CAAA;KAAE,CAAC,GAAG,SAAS,CAAA;CACpE,CAAA;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAOtD;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,EAAE,CAiBtD"}
package/dist/issues.js ADDED
@@ -0,0 +1,22 @@
1
+ /** `items.0.name: Required`, or the bare message for a root issue. */
2
+ export function formatIssue(issue) {
3
+ const path = (issue.path ?? [])
4
+ .map((segment) => String(typeof segment === 'object' ? segment.key : segment))
5
+ .join('.');
6
+ return path ? `${path}: ${issue.message}` : issue.message;
7
+ }
8
+ /** The validation issues oRPC attaches to a BAD_REQUEST (`data.issues`). */
9
+ export function issuesOf(error) {
10
+ const data = typeof error === 'object' && error !== null
11
+ ? error.data
12
+ : undefined;
13
+ const issues = typeof data === 'object' && data !== null
14
+ ? data.issues
15
+ : undefined;
16
+ return Array.isArray(issues)
17
+ ? issues.filter((issue) => typeof issue === 'object' &&
18
+ issue !== null &&
19
+ typeof issue.message === 'string')
20
+ : [];
21
+ }
22
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../src/issues.ts"],"names":[],"mappings":"AAMA,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC7C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;SAC7B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAChB,MAAM,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAC3D;SACA,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;AAC1D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,MAAM,IAAI,GACT,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC1C,CAAC,CAAE,KAA4B,CAAC,IAAI;QACpC,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,MAAM,GACX,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QACxC,CAAC,CAAE,IAA6B,CAAC,MAAM;QACvC,CAAC,CAAC,SAAS,CAAA;IACb,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CACb,CAAC,KAAK,EAAwB,EAAE,CAC/B,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,CAC7D;QACF,CAAC,CAAC,EAAE,CAAA;AACN,CAAC","sourcesContent":["/** A Standard Schema issue, as oRPC puts them on `error.data.issues`. */\nexport type SchemaIssue = {\n\tmessage: string\n\tpath?: ReadonlyArray<PropertyKey | { key: PropertyKey }> | undefined\n}\n\n/** `items.0.name: Required`, or the bare message for a root issue. */\nexport function formatIssue(issue: SchemaIssue): string {\n\tconst path = (issue.path ?? [])\n\t\t.map((segment) =>\n\t\t\tString(typeof segment === 'object' ? segment.key : segment)\n\t\t)\n\t\t.join('.')\n\treturn path ? `${path}: ${issue.message}` : issue.message\n}\n\n/** The validation issues oRPC attaches to a BAD_REQUEST (`data.issues`). */\nexport function issuesOf(error: unknown): SchemaIssue[] {\n\tconst data =\n\t\ttypeof error === 'object' && error !== null\n\t\t\t? (error as { data?: unknown }).data\n\t\t\t: undefined\n\tconst issues =\n\t\ttypeof data === 'object' && data !== null\n\t\t\t? (data as { issues?: unknown }).issues\n\t\t\t: undefined\n\treturn Array.isArray(issues)\n\t\t? issues.filter(\n\t\t\t\t(issue): issue is SchemaIssue =>\n\t\t\t\t\ttypeof issue === 'object' &&\n\t\t\t\t\tissue !== null &&\n\t\t\t\t\ttypeof (issue as { message?: unknown }).message === 'string'\n\t\t\t)\n\t\t: []\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { AnySchema } from '@orpc/contract';
2
+ import type { SchemaIssue } from './issues.js';
2
3
  export type JsonSchema = Record<string, unknown>;
3
4
  /**
4
5
  * A Standard Schema with JSON Schema attached, as MCP SDKs and Mastra expect.
@@ -12,16 +13,12 @@ export type ToolSchema<TIn = unknown, TOut = TIn> = {
12
13
  value: TOut;
13
14
  issues?: undefined;
14
15
  } | {
15
- issues: ReadonlyArray<{
16
- message: string;
17
- }>;
16
+ issues: ReadonlyArray<SchemaIssue>;
18
17
  } | Promise<{
19
18
  value: TOut;
20
19
  issues?: undefined;
21
20
  } | {
22
- issues: ReadonlyArray<{
23
- message: string;
24
- }>;
21
+ issues: ReadonlyArray<SchemaIssue>;
25
22
  }>;
26
23
  types?: {
27
24
  input: TIn;
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,GAAG,GAAG,IAAI;IACnD,WAAW,EAAE;QACZ,OAAO,EAAE,CAAC,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,CACT,KAAK,EAAE,OAAO,KAEZ;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACnC;YAAE,MAAM,EAAE,aAAa,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,GAC9C,OAAO,CACL;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACnC;YAAE,MAAM,EAAE,aAAa,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAC/C,CAAA;QACJ,KAAK,CAAC,EAAE;YAAE,KAAK,EAAE,GAAG,CAAC;YAAC,MAAM,EAAE,IAAI,CAAA;SAAE,CAAA;QACpC,UAAU,EAAE;YACX,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,UAAU,CAAA;YACxC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,UAAU,CAAA;SACzC,CAAA;KACD,CAAA;CACD,CAAA;AAYD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAiBtE;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,IAAI,EAC3C,MAAM,EAAE,SAAS,GACf,UAAU,CAAC,IAAI,CAAC,CAUlB;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAa9D"}
1
+ {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,GAAG,GAAG,IAAI;IACnD,WAAW,EAAE;QACZ,OAAO,EAAE,CAAC,CAAA;QACV,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,EAAE,CACT,KAAK,EAAE,OAAO,KAEZ;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACnC;YAAE,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;SAAE,GACtC,OAAO,CACL;YAAE,KAAK,EAAE,IAAI,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACnC;YAAE,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;SAAE,CACvC,CAAA;QACJ,KAAK,CAAC,EAAE;YAAE,KAAK,EAAE,GAAG,CAAC;YAAC,MAAM,EAAE,IAAI,CAAA;SAAE,CAAA;QACpC,UAAU,EAAE;YACX,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,UAAU,CAAA;YACxC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,UAAU,CAAA;SACzC,CAAA;KACD,CAAA;CACD,CAAA;AAiBD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAiBtE;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,IAAI,EAC3C,MAAM,EAAE,SAAS,GACf,UAAU,CAAC,IAAI,CAAC,CAUlB;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAa9D"}
@@ -2,8 +2,13 @@ import { JsonSchemaCoercer } from '@orpc/json-schema';
2
2
  import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4';
3
3
  const converter = new ZodToJsonSchemaConverter();
4
4
  const coercer = new JsonSchemaCoercer();
5
- function toJsonSchema(schema, strategy) {
6
- return converter.convert(schema, { strategy })[1];
5
+ /** Converted on first use: an app building many tools at import pays per tool used. */
6
+ function lazyJsonSchema(schema, strategy) {
7
+ let converted;
8
+ return () => {
9
+ converted ??= converter.convert(schema, { strategy })[1];
10
+ return converted;
11
+ };
7
12
  }
8
13
  /**
9
14
  * Tool input that validates like the procedure but returns the RAW input for
@@ -14,30 +19,30 @@ function toJsonSchema(schema, strategy) {
14
19
  * so values are coerced back before validating.
15
20
  */
16
21
  export function rawInputSchema(schema) {
17
- const jsonSchema = toJsonSchema(schema, 'input');
22
+ const jsonSchema = lazyJsonSchema(schema, 'input');
18
23
  return {
19
24
  '~standard': {
20
25
  version: 1,
21
26
  vendor: 'orpc-fn',
22
27
  validate: (value) => {
23
- const coerced = coercer.coerce(jsonSchema, value);
28
+ const coerced = coercer.coerce(jsonSchema(), value);
24
29
  const finish = (result) => (result.issues ? { issues: result.issues } : { value: coerced });
25
30
  const result = schema['~standard'].validate(coerced);
26
31
  return result instanceof Promise ? result.then(finish) : finish(result);
27
32
  },
28
- jsonSchema: { input: () => jsonSchema, output: () => jsonSchema }
33
+ jsonSchema: { input: jsonSchema, output: jsonSchema }
29
34
  }
30
35
  };
31
36
  }
32
37
  /** Tool output the procedure already validated: described, passed through. */
33
38
  export function passThroughOutputSchema(schema) {
34
- const jsonSchema = toJsonSchema(schema, 'output');
39
+ const jsonSchema = lazyJsonSchema(schema, 'output');
35
40
  return {
36
41
  '~standard': {
37
42
  version: 1,
38
43
  vendor: 'orpc-fn',
39
44
  validate: (value) => ({ value: value }),
40
- jsonSchema: { input: () => jsonSchema, output: () => jsonSchema }
45
+ jsonSchema: { input: jsonSchema, output: jsonSchema }
41
46
  }
42
47
  };
43
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AA6BzD,MAAM,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAA;AAChD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAA;AAEvC,SAAS,YAAY,CACpB,MAAiB,EACjB,QAA4B;IAE5B,OAAO,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAe,CAAA;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAM,MAAiB;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO;QACN,WAAW,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAQ,CAAA;gBACxD,MAAM,MAAM,GAAG,CACd,MAA+D,EAC9D,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;gBACrE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBACpD,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACxE,CAAC;YACD,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;SACjE;KACD,CAAA;AACF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CACtC,MAAiB;IAEjB,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACjD,OAAO;QACN,WAAW,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAa,EAAE,CAAC;YAC/C,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;SACjE;KACD,CAAA;AACF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAA;IAC1C,OAAO,CACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,KAAK,CACV,CAAC,MAAM,EAAE,EAAE,CACV,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CACD,CAAA;AACF,CAAC","sourcesContent":["import type { AnySchema } from '@orpc/contract'\nimport { JsonSchemaCoercer } from '@orpc/json-schema'\nimport { ZodToJsonSchemaConverter } from '@orpc/zod/zod4'\n\nexport type JsonSchema = Record<string, unknown>\n\n/**\n * A Standard Schema with JSON Schema attached, as MCP SDKs and Mastra expect.\n * `TIn` is what is validated and what `validate` returns.\n */\nexport type ToolSchema<TIn = unknown, TOut = TIn> = {\n\t'~standard': {\n\t\tversion: 1\n\t\tvendor: string\n\t\tvalidate: (\n\t\t\tvalue: unknown\n\t\t) =>\n\t\t\t| { value: TOut; issues?: undefined }\n\t\t\t| { issues: ReadonlyArray<{ message: string }> }\n\t\t\t| Promise<\n\t\t\t\t\t| { value: TOut; issues?: undefined }\n\t\t\t\t\t| { issues: ReadonlyArray<{ message: string }> }\n\t\t\t >\n\t\ttypes?: { input: TIn; output: TOut }\n\t\tjsonSchema: {\n\t\t\tinput: (options?: unknown) => JsonSchema\n\t\t\toutput: (options?: unknown) => JsonSchema\n\t\t}\n\t}\n}\n\nconst converter = new ZodToJsonSchemaConverter()\nconst coercer = new JsonSchemaCoercer()\n\nfunction toJsonSchema(\n\tschema: AnySchema,\n\tstrategy: 'input' | 'output'\n): JsonSchema {\n\treturn converter.convert(schema, { strategy })[1] as JsonSchema\n}\n\n/**\n * Tool input that validates like the procedure but returns the RAW input for\n * the procedure's own input schema to parse. Transforms run in both passes\n * but never on their own output, which handing over the parsed value would do. Zod's JSON Schema export rejects types like\n * `z.date()`; oRPC's converter gives the same JSON Schema as the OpenAPI docs\n * (dates become string/date-time), and clients send those dates as strings,\n * so values are coerced back before validating.\n */\nexport function rawInputSchema<TIn>(schema: AnySchema): ToolSchema<TIn> {\n\tconst jsonSchema = toJsonSchema(schema, 'input')\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'orpc-fn',\n\t\t\tvalidate: (value) => {\n\t\t\t\tconst coerced = coercer.coerce(jsonSchema, value) as TIn\n\t\t\t\tconst finish = (\n\t\t\t\t\tresult: Awaited<ReturnType<AnySchema['~standard']['validate']>>\n\t\t\t\t) => (result.issues ? { issues: result.issues } : { value: coerced })\n\t\t\t\tconst result = schema['~standard'].validate(coerced)\n\t\t\t\treturn result instanceof Promise ? result.then(finish) : finish(result)\n\t\t\t},\n\t\t\tjsonSchema: { input: () => jsonSchema, output: () => jsonSchema }\n\t\t}\n\t}\n}\n\n/** Tool output the procedure already validated: described, passed through. */\nexport function passThroughOutputSchema<TOut>(\n\tschema: AnySchema\n): ToolSchema<TOut> {\n\tconst jsonSchema = toJsonSchema(schema, 'output')\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'orpc-fn',\n\t\t\tvalidate: (value) => ({ value: value as TOut }),\n\t\t\tjsonSchema: { input: () => jsonSchema, output: () => jsonSchema }\n\t\t}\n\t}\n}\n\n/** Tool protocols permit unions only when every branch accepts an object. */\nexport function isObjectJsonSchema(schema: JsonSchema): boolean {\n\tif (schema.type === 'object') return true\n\tconst union = schema.anyOf ?? schema.oneOf\n\treturn (\n\t\tArray.isArray(union) &&\n\t\tunion.length > 0 &&\n\t\tunion.every(\n\t\t\t(branch) =>\n\t\t\t\ttypeof branch === 'object' &&\n\t\t\t\tbranch !== null &&\n\t\t\t\tisObjectJsonSchema(branch)\n\t\t)\n\t)\n}\n"]}
1
+ {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AA8BzD,MAAM,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAA;AAChD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAA;AAEvC,uFAAuF;AACvF,SAAS,cAAc,CACtB,MAAiB,EACjB,QAA4B;IAE5B,IAAI,SAAiC,CAAA;IACrC,OAAO,GAAG,EAAE;QACX,SAAS,KAAK,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAe,CAAA;QACtE,OAAO,SAAS,CAAA;IACjB,CAAC,CAAA;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAM,MAAiB;IACpD,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClD,OAAO;QACN,WAAW,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,CAAQ,CAAA;gBAC1D,MAAM,MAAM,GAAG,CACd,MAA+D,EAC9D,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;gBACrE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBACpD,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACxE,CAAC;YACD,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;SACrD;KACD,CAAA;AACF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CACtC,MAAiB;IAEjB,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACnD,OAAO;QACN,WAAW,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAa,EAAE,CAAC;YAC/C,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE;SACrD;KACD,CAAA;AACF,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAA;IAC1C,OAAO,CACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,KAAK,CACV,CAAC,MAAM,EAAE,EAAE,CACV,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,kBAAkB,CAAC,MAAM,CAAC,CAC3B,CACD,CAAA;AACF,CAAC","sourcesContent":["import type { AnySchema } from '@orpc/contract'\nimport { JsonSchemaCoercer } from '@orpc/json-schema'\nimport { ZodToJsonSchemaConverter } from '@orpc/zod/zod4'\nimport type { SchemaIssue } from './issues.js'\n\nexport type JsonSchema = Record<string, unknown>\n\n/**\n * A Standard Schema with JSON Schema attached, as MCP SDKs and Mastra expect.\n * `TIn` is what is validated and what `validate` returns.\n */\nexport type ToolSchema<TIn = unknown, TOut = TIn> = {\n\t'~standard': {\n\t\tversion: 1\n\t\tvendor: string\n\t\tvalidate: (\n\t\t\tvalue: unknown\n\t\t) =>\n\t\t\t| { value: TOut; issues?: undefined }\n\t\t\t| { issues: ReadonlyArray<SchemaIssue> }\n\t\t\t| Promise<\n\t\t\t\t\t| { value: TOut; issues?: undefined }\n\t\t\t\t\t| { issues: ReadonlyArray<SchemaIssue> }\n\t\t\t >\n\t\ttypes?: { input: TIn; output: TOut }\n\t\tjsonSchema: {\n\t\t\tinput: (options?: unknown) => JsonSchema\n\t\t\toutput: (options?: unknown) => JsonSchema\n\t\t}\n\t}\n}\n\nconst converter = new ZodToJsonSchemaConverter()\nconst coercer = new JsonSchemaCoercer()\n\n/** Converted on first use: an app building many tools at import pays per tool used. */\nfunction lazyJsonSchema(\n\tschema: AnySchema,\n\tstrategy: 'input' | 'output'\n): () => JsonSchema {\n\tlet converted: JsonSchema | undefined\n\treturn () => {\n\t\tconverted ??= converter.convert(schema, { strategy })[1] as JsonSchema\n\t\treturn converted\n\t}\n}\n\n/**\n * Tool input that validates like the procedure but returns the RAW input for\n * the procedure's own input schema to parse. Transforms run in both passes\n * but never on their own output, which handing over the parsed value would do. Zod's JSON Schema export rejects types like\n * `z.date()`; oRPC's converter gives the same JSON Schema as the OpenAPI docs\n * (dates become string/date-time), and clients send those dates as strings,\n * so values are coerced back before validating.\n */\nexport function rawInputSchema<TIn>(schema: AnySchema): ToolSchema<TIn> {\n\tconst jsonSchema = lazyJsonSchema(schema, 'input')\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'orpc-fn',\n\t\t\tvalidate: (value) => {\n\t\t\t\tconst coerced = coercer.coerce(jsonSchema(), value) as TIn\n\t\t\t\tconst finish = (\n\t\t\t\t\tresult: Awaited<ReturnType<AnySchema['~standard']['validate']>>\n\t\t\t\t) => (result.issues ? { issues: result.issues } : { value: coerced })\n\t\t\t\tconst result = schema['~standard'].validate(coerced)\n\t\t\t\treturn result instanceof Promise ? result.then(finish) : finish(result)\n\t\t\t},\n\t\t\tjsonSchema: { input: jsonSchema, output: jsonSchema }\n\t\t}\n\t}\n}\n\n/** Tool output the procedure already validated: described, passed through. */\nexport function passThroughOutputSchema<TOut>(\n\tschema: AnySchema\n): ToolSchema<TOut> {\n\tconst jsonSchema = lazyJsonSchema(schema, 'output')\n\treturn {\n\t\t'~standard': {\n\t\t\tversion: 1,\n\t\t\tvendor: 'orpc-fn',\n\t\t\tvalidate: (value) => ({ value: value as TOut }),\n\t\t\tjsonSchema: { input: jsonSchema, output: jsonSchema }\n\t\t}\n\t}\n}\n\n/** Tool protocols permit unions only when every branch accepts an object. */\nexport function isObjectJsonSchema(schema: JsonSchema): boolean {\n\tif (schema.type === 'object') return true\n\tconst union = schema.anyOf ?? schema.oneOf\n\treturn (\n\t\tArray.isArray(union) &&\n\t\tunion.length > 0 &&\n\t\tunion.every(\n\t\t\t(branch) =>\n\t\t\t\ttypeof branch === 'object' &&\n\t\t\t\tbranch !== null &&\n\t\t\t\tisObjectJsonSchema(branch)\n\t\t)\n\t)\n}\n"]}
@@ -5,6 +5,8 @@
5
5
  * publisher on the old format keeps working during a rolling deploy.
6
6
  */
7
7
  export declare function encodePayload(value: unknown, id?: string): string;
8
+ /** A comparable serialization of a snapshot; undefined when it holds files. */
9
+ export declare function snapshotKey(value: unknown): string | undefined;
8
10
  export declare function decodePayload(payload: string): unknown;
9
11
  /** IDs distinguish replay/live overlap; legacy payloads remain readable. */
10
12
  export declare function decodeMessage(payload: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/live/codec.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,OAAO,EACd,EAAE,GAAE,MAA4B,GAC9B,MAAM,CAMR;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAWtD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;CACd,CAUA"}
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/live/codec.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,OAAO,EACd,EAAE,GAAE,MAA4B,GAC9B,MAAM,CAMR;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;CACd,CAcA"}
@@ -14,25 +14,30 @@ export function encodePayload(value, id = crypto.randomUUID()) {
14
14
  }
15
15
  return JSON.stringify({ [MARKER]: 2, id, json, meta });
16
16
  }
17
+ /** A comparable serialization of a snapshot; undefined when it holds files. */
18
+ export function snapshotKey(value) {
19
+ const [json, meta, maps, blobs] = serializer.serialize(value);
20
+ if (maps.length > 0 || blobs.length > 0)
21
+ return undefined;
22
+ return JSON.stringify([json, meta]);
23
+ }
17
24
  export function decodePayload(payload) {
18
- const parsed = JSON.parse(payload);
19
- if (typeof parsed === 'object' &&
20
- parsed !== null &&
21
- [1, 2].includes(Number(parsed[MARKER]))) {
22
- const { json, meta } = parsed;
23
- return serializer.deserialize(json, meta);
24
- }
25
- return parsed;
25
+ return decodeMessage(payload).value;
26
26
  }
27
27
  /** IDs distinguish replay/live overlap; legacy payloads remain readable. */
28
28
  export function decodeMessage(payload) {
29
- const envelope = JSON.parse(payload);
30
- const id = typeof envelope === 'object' &&
31
- envelope !== null &&
32
- envelope[MARKER] === 2 &&
33
- typeof envelope.id === 'string'
34
- ? envelope.id
35
- : undefined;
36
- return { id, value: decodePayload(payload) };
29
+ const parsed = JSON.parse(payload);
30
+ if (typeof parsed !== 'object' || parsed === null)
31
+ return { id: undefined, value: parsed };
32
+ const envelope = parsed;
33
+ const version = Number(envelope[MARKER]);
34
+ if (version !== 1 && version !== 2)
35
+ return { id: undefined, value: parsed };
36
+ return {
37
+ id: version === 2 && typeof envelope.id === 'string'
38
+ ? envelope.id
39
+ : undefined,
40
+ value: serializer.deserialize(envelope.json, envelope.meta)
41
+ };
37
42
  }
38
43
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/live/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,MAAM,UAAU,GAAG,IAAI,yBAAyB,EAAE,CAAA;AAClD,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC5B,KAAc,EACd,EAAE,GAAW,MAAM,CAAC,UAAU,EAAE;IAEhC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,IACC,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAE,MAAkC,CAAC,MAAM,CAAC,CAAC,CAAC,EACnE,CAAC;QACF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAqC,CAAA;QAC5D,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,MAAM,CAAA;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,OAAe;IAI5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAA;IAC/C,MAAM,EAAE,GACP,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QAChB,QAAoC,CAAC,MAAM,CAAC,KAAK,CAAC;QACnD,OAAQ,QAAoC,CAAC,EAAE,KAAK,QAAQ;QAC3D,CAAC,CAAE,QAA2B,CAAC,EAAE;QACjC,CAAC,CAAC,SAAS,CAAA;IACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAA;AAC7C,CAAC","sourcesContent":["import { StandardRPCJsonSerializer } from '@orpc/client/standard'\n\nconst serializer = new StandardRPCJsonSerializer()\nconst MARKER = 'orpc-fn'\n\n/**\n * Wire format for pub/sub payloads: oRPC's own JSON serializer, so values\n * plain JSON loses (`Date`, `Map`, `Set`, `BigInt`, `URL`, `undefined`) arrive\n * intact. Payloads without the envelope are read as plain JSON, so a\n * publisher on the old format keeps working during a rolling deploy.\n */\nexport function encodePayload(\n\tvalue: unknown,\n\tid: string = crypto.randomUUID()\n): string {\n\tconst [json, meta, maps, blobs] = serializer.serialize(value)\n\tif (maps.length > 0 || blobs.length > 0) {\n\t\tthrow new TypeError('orpc-fn: pub/sub events cannot contain files or blobs')\n\t}\n\treturn JSON.stringify({ [MARKER]: 2, id, json, meta })\n}\n\nexport function decodePayload(payload: string): unknown {\n\tconst parsed: unknown = JSON.parse(payload)\n\tif (\n\t\ttypeof parsed === 'object' &&\n\t\tparsed !== null &&\n\t\t[1, 2].includes(Number((parsed as Record<string, unknown>)[MARKER]))\n\t) {\n\t\tconst { json, meta } = parsed as { json: unknown; meta: [] }\n\t\treturn serializer.deserialize(json, meta)\n\t}\n\treturn parsed\n}\n\n/** IDs distinguish replay/live overlap; legacy payloads remain readable. */\nexport function decodeMessage(payload: string): {\n\tid: string | undefined\n\tvalue: unknown\n} {\n\tconst envelope = JSON.parse(payload) as unknown\n\tconst id =\n\t\ttypeof envelope === 'object' &&\n\t\tenvelope !== null &&\n\t\t(envelope as Record<string, unknown>)[MARKER] === 2 &&\n\t\ttypeof (envelope as Record<string, unknown>).id === 'string'\n\t\t\t? (envelope as { id: string }).id\n\t\t\t: undefined\n\treturn { id, value: decodePayload(payload) }\n}\n"]}
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/live/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,MAAM,UAAU,GAAG,IAAI,yBAAyB,EAAE,CAAA;AAClD,MAAM,MAAM,GAAG,SAAS,CAAA;AAExB;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC5B,KAAc,EACd,EAAE,GAAW,MAAM,CAAC,UAAU,EAAE;IAEhC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAA;AACpC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,OAAe;IAI5C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAChD,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAiC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IACxC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC3E,OAAO;QACN,EAAE,EACD,OAAO,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ;YAC/C,CAAC,CAAC,QAAQ,CAAC,EAAE;YACb,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAU,CAAC;KACjE,CAAA;AACF,CAAC","sourcesContent":["import { StandardRPCJsonSerializer } from '@orpc/client/standard'\n\nconst serializer = new StandardRPCJsonSerializer()\nconst MARKER = 'orpc-fn'\n\n/**\n * Wire format for pub/sub payloads: oRPC's own JSON serializer, so values\n * plain JSON loses (`Date`, `Map`, `Set`, `BigInt`, `URL`, `undefined`) arrive\n * intact. Payloads without the envelope are read as plain JSON, so a\n * publisher on the old format keeps working during a rolling deploy.\n */\nexport function encodePayload(\n\tvalue: unknown,\n\tid: string = crypto.randomUUID()\n): string {\n\tconst [json, meta, maps, blobs] = serializer.serialize(value)\n\tif (maps.length > 0 || blobs.length > 0) {\n\t\tthrow new TypeError('orpc-fn: pub/sub events cannot contain files or blobs')\n\t}\n\treturn JSON.stringify({ [MARKER]: 2, id, json, meta })\n}\n\n/** A comparable serialization of a snapshot; undefined when it holds files. */\nexport function snapshotKey(value: unknown): string | undefined {\n\tconst [json, meta, maps, blobs] = serializer.serialize(value)\n\tif (maps.length > 0 || blobs.length > 0) return undefined\n\treturn JSON.stringify([json, meta])\n}\n\nexport function decodePayload(payload: string): unknown {\n\treturn decodeMessage(payload).value\n}\n\n/** IDs distinguish replay/live overlap; legacy payloads remain readable. */\nexport function decodeMessage(payload: string): {\n\tid: string | undefined\n\tvalue: unknown\n} {\n\tconst parsed: unknown = JSON.parse(payload)\n\tif (typeof parsed !== 'object' || parsed === null)\n\t\treturn { id: undefined, value: parsed }\n\tconst envelope = parsed as Record<string, unknown>\n\tconst version = Number(envelope[MARKER])\n\tif (version !== 1 && version !== 2) return { id: undefined, value: parsed }\n\treturn {\n\t\tid:\n\t\t\tversion === 2 && typeof envelope.id === 'string'\n\t\t\t\t? envelope.id\n\t\t\t\t: undefined,\n\t\tvalue: serializer.deserialize(envelope.json, envelope.meta as [])\n\t}\n}\n"]}
@@ -2,7 +2,6 @@ import type { AnySchema, ErrorMap, Schema } from '@orpc/contract';
2
2
  import { type AnyProcedure } from '@orpc/server';
3
3
  import type { ZodType, z } from 'zod';
4
4
  import { RAW_INPUT } from '../timing.js';
5
- import type { FnLogger } from '../logger.js';
6
5
  import type { FnContext, FnDefinition, FnProcedure, FnRouteOptions, HandlerParams, MaybePromise, ProcedureKey } from '../types.js';
7
6
  import type { AuthFn, Channel, ChannelDefinition, ChannelOptions, ChannelQueueOptions, ObjectSchema, PublisherConfig } from './pub-sub.js';
8
7
  declare const fnLivePatchMarker: unique symbol;
@@ -43,6 +42,11 @@ export type FnLiveConfig<TDef extends FnDefinition, TInput, TEventSchema extends
43
42
  authFn?: AuthFn<TInput, FnContext<TDef, TKey>>;
44
43
  /** Batch events arriving within this window into one snapshot update. */
45
44
  coalesceMs?: number;
45
+ /**
46
+ * Without a transformer, skip a rerun's snapshot when it serializes the
47
+ * same as the last one sent. Default: true.
48
+ */
49
+ skipUnchanged?: boolean;
46
50
  /** Maximum events collected in one coalescing batch (default 1000). */
47
51
  maxBatchSize?: number;
48
52
  /**
@@ -75,8 +79,6 @@ export type FnLiveReturn<TDef extends FnDefinition, TKey extends ProcedureKey<TD
75
79
  context: FnContext<TDef, TKey>;
76
80
  }) => string;
77
81
  getPublishChannelName: (event: z.output<TEventSchema>) => string;
78
- /** @deprecated Prefer the separate required-input resolver methods. */
79
- getChannelName: (params: Partial<z.output<TInput>> | Partial<z.output<TEventSchema>>, context?: FnContext<TDef, TKey>) => string;
80
82
  };
81
83
  /**
82
84
  * A route plus a subscribe route that streams its result: the initial
@@ -100,18 +102,6 @@ export interface FnLive<TDef extends FnDefinition> {
100
102
  live: FnLiveConfig<TDef, z.output<TInput>, TEventSchema, TOutput, NoInfer<TKey>, TEmit, TErrors>;
101
103
  } & FnRouteOptions<TDef, TKey, z.output<TInput>, TErrors>): FnLiveReturn<TDef, TKey, TInput, Schema<TOutput, TOutput>, TOutput, TEventSchema, TEmit, TErrors>;
102
104
  }
103
- /**
104
- * Fail a live subscription whose initial snapshot could not be built.
105
- *
106
- * An expected client failure - an `ORPCError` with a 4xx status, e.g. the
107
- * subscribed resource was not found or access was refused - reaches the
108
- * subscriber unchanged and is NOT logged as a server fault. Only 5xx and
109
- * unknown failures are logged. Unknown errors are wrapped as
110
- * `INTERNAL_SERVER_ERROR`.
111
- */
112
- export declare function throwInitialSnapshotError(err: unknown, liveName: string, logger: Pick<FnLogger, 'error'>,
113
- /** `createFn`'s `isExpectedError`; default: a 4xx `ORPCError`. */
114
- isExpected?: (error: unknown) => boolean): never;
115
105
  /**
116
106
  * Drives a live subscription: yields the initial snapshot, then folds each
117
107
  * inbound event into the running snapshot via `apply`, yielding after every
@@ -139,7 +129,6 @@ type RuntimeParams = Record<string, unknown> & {
139
129
  input: Record<string, unknown>;
140
130
  context: unknown;
141
131
  signal: AbortSignal | undefined;
142
- logger: FnLogger;
143
132
  call: (procedure: AnyProcedure, input: unknown) => Promise<unknown>;
144
133
  [RAW_INPUT]: unknown;
145
134
  };
@@ -153,6 +142,7 @@ type RuntimeLiveConfig = Omit<ChannelOptions, 'name'> & {
153
142
  shouldUpdate?: (params: RuntimeParams & Record<string, unknown>) => unknown;
154
143
  coalesceMs?: number;
155
144
  maxBatchSize?: number;
145
+ skipUnchanged?: boolean;
156
146
  summary?: string;
157
147
  description?: string;
158
148
  };
@@ -178,9 +168,6 @@ export declare function createFnLive(runtime: {
178
168
  procedure: AnyProcedure;
179
169
  subscribe: AnyProcedure;
180
170
  publish: (data: unknown) => Promise<void>;
181
- getChannelName: (params: {
182
- [x: string]: unknown;
183
- }, context?: unknown) => string;
184
171
  getSubscriptionChannelName: (params: {
185
172
  input: {
186
173
  [x: string]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"fn-live.d.ts","sourceRoot":"","sources":["../../src/live/fn-live.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fn-live.d.ts","sourceRoot":"","sources":["../../src/live/fn-live.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ORPCError } from '@orpc/server';
2
2
  import { RAW_INPUT } from '../timing.js';
3
3
  import { LIVE_GAP, positiveInteger } from './lifecycle.js';
4
- import { errorMessageOf } from '../otel.js';
4
+ import { snapshotKey } from './codec.js';
5
5
  /** Marks a coalesce window that ended before the next event arrived. */
6
6
  const TIMEOUT = Symbol('timeout');
7
7
  const fnLivePatchMarker = Symbol('fnLive.patch');
@@ -11,26 +11,6 @@ export function fnLivePatch(state, emit) {
11
11
  function isFnLivePatch(value) {
12
12
  return (typeof value === 'object' && value !== null && fnLivePatchMarker in value);
13
13
  }
14
- /**
15
- * Fail a live subscription whose initial snapshot could not be built.
16
- *
17
- * An expected client failure - an `ORPCError` with a 4xx status, e.g. the
18
- * subscribed resource was not found or access was refused - reaches the
19
- * subscriber unchanged and is NOT logged as a server fault. Only 5xx and
20
- * unknown failures are logged. Unknown errors are wrapped as
21
- * `INTERNAL_SERVER_ERROR`.
22
- */
23
- export function throwInitialSnapshotError(err, liveName, logger,
24
- /** `createFn`'s `isExpectedError`; default: a 4xx `ORPCError`. */
25
- isExpected = (error) => error instanceof ORPCError && error.status < 500) {
26
- if (!isExpected(err)) {
27
- logger.error('fnLive initial snapshot failed', {
28
- name: liveName,
29
- err: errorMessageOf(err)
30
- });
31
- }
32
- throw toSnapshotError(err, liveName);
33
- }
34
14
  /** An `ORPCError` passes through; anything else becomes INTERNAL_SERVER_ERROR. */
35
15
  function toSnapshotError(err, liveName) {
36
16
  if (err instanceof ORPCError)
@@ -207,6 +187,7 @@ export function createFnLive(runtime) {
207
187
  live.reauthorize !== true &&
208
188
  !(await live.reauthorize({
209
189
  input: params.input,
190
+ context: params.context,
210
191
  ctx: params.context
211
192
  })))
212
193
  throw new ORPCError('FORBIDDEN');
@@ -235,6 +216,8 @@ export function createFnLive(runtime) {
235
216
  }
236
217
  return validate(live.stateSchema, next);
237
218
  };
219
+ // What the client last received, to skip a rerun that changed nothing.
220
+ let sent;
238
221
  const applyBatch = live.transformerFn
239
222
  ? undefined
240
223
  : async (events, previous) => {
@@ -245,7 +228,17 @@ export function createFnLive(runtime) {
245
228
  !live.shouldUpdate ||
246
229
  (await live.shouldUpdate({ ...params, event, previous })))
247
230
  invalidated = true;
248
- return invalidated ? rerun() : undefined;
231
+ if (!invalidated)
232
+ return undefined;
233
+ const next = await rerun();
234
+ if (live.skipUnchanged === false)
235
+ return next;
236
+ sent ??= snapshotKey(previous);
237
+ const key = snapshotKey(next);
238
+ if (key !== undefined && key === sent)
239
+ return undefined;
240
+ sent = key;
241
+ return next;
249
242
  };
250
243
  yield* streamLiveSnapshots({
251
244
  source: subscription.events,
@@ -267,7 +260,6 @@ export function createFnLive(runtime) {
267
260
  procedure,
268
261
  subscribe,
269
262
  publish: channel.publish,
270
- getChannelName: channel.getChannelName,
271
263
  getSubscriptionChannelName: channel.getSubscriptionChannelName,
272
264
  getPublishChannelName: channel.getPublishChannelName
273
265
  };