orpc-fn 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -276,7 +276,6 @@ On native, calls go through `expo/fetch`, the only fetch that streams there. The
276
276
 
277
277
  ## Docs
278
278
 
279
- - [Migrating an app from an in-repo `lib/fn`](docs/migration.md)
280
279
  - [Decisions: what oRPC already ships and why this exists](docs/decisions.md)
281
280
  - [Releasing](docs/releasing.md)
282
281
  - [Independent core, tenant, revision, MCP and Expo examples](examples/adoption/README.md)
@@ -1 +1 @@
1
- {"version":3,"file":"create-fn.d.ts","sourceRoot":"","sources":["../src/create-fn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-fn.d.ts","sourceRoot":"","sources":["../src/create-fn.ts"],"names":[],"mappings":"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"}
package/dist/create-fn.js CHANGED
@@ -9,7 +9,7 @@ import { createFnLive } from './live/fn-live.js';
9
9
  import { createLiveRuntime } from './live/pub-sub.js';
10
10
  import { createDefaultLogger, protectLogger } from './logger.js';
11
11
  import { readFnMeta } from './meta.js';
12
- import { createTracing, errorMessageOf } from './otel.js';
12
+ import { createTracing, errorAttributes, errorMessageOf } from './otel.js';
13
13
  import { RAW_INPUT, REQUEST_TIMING } from './timing.js';
14
14
  import { createRouter } from './router.js';
15
15
  import { RESERVED_OPTION_KEYS } from './types.js';
@@ -243,12 +243,7 @@ export function createFn(options) {
243
243
  procedure: event.procedure,
244
244
  duration_ms: event.durationMs,
245
245
  status: success ? 'success' : 'failed',
246
- ...(error === undefined
247
- ? {}
248
- : {
249
- error_type: error instanceof Error ? error.name : typeof error,
250
- error_message: errorMessageOf(error)
251
- })
246
+ ...(error === undefined ? {} : errorAttributes(error))
252
247
  });
253
248
  };
254
249
  const live = createLiveRuntime({
@@ -1 +1 @@
1
- {"version":3,"file":"create-fn.js","sourceRoot":"","sources":["../src/create-fn.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype BuilderChain,\n\tcreateProcedureAssembler\n} from './assemble-procedure.js'\nimport { isAsyncIteratorObject } from './stream.js'\nimport { normalizeRoute } from './route-options.js'\nimport { type AnyProcedure, ORPCError, os } from '@orpc/server'\nimport { procedureDefinition } from './compatibility.js'\nimport { type BoundCall, createBoundCall } from './bound-call.js'\nimport { isExpectedClientError } from './expected-client-error.js'\nimport { createFnLive, type FnLive } from './live/fn-live.js'\nimport {\n\ttype CreatePublisher,\n\ttype CreatePubSub,\n\tcreateLiveRuntime,\n\ttype PubSubRuntimeOptions\n} from './live/pub-sub.js'\nimport {\n\tcreateDefaultLogger,\n\tprotectLogger,\n\ttype FnLogger,\n\ttype LogAttributes\n} from './logger.js'\nimport { readFnMeta } from './meta.js'\nimport {\n\ttype AttributeValue,\n\tcreateTracing,\n\terrorMessageOf,\n\ttype OtelApiLike,\n\ttype SpanLike,\n\ttype SpanOf\n} from './otel.js'\nimport { RAW_INPUT, REQUEST_TIMING, type InvocationTiming } from './timing.js'\nimport { createRouter } from './router.js'\nimport {\n\ttype ProcedureHookParams,\n\ttype CompletedHookEvent,\n\ttype CurrentContextOf,\n\ttype BuilderLike,\n\ttype FiniteExtras,\n\ttype ScopedExtrasGuard,\n\ttype Fn,\n\ttype FnCompletedEvent,\n\ttype FnDefinition,\n\ttype Guard,\n\ttype GuardParams,\n\ttype MaybePromise,\n\ttype RejectKeys,\n\tRESERVED_OPTION_KEYS,\n\ttype ReservedOptionKey\n} from './types.js'\n\n/** `CreateFnOptions` with the generics erased: what the implementation reads. */\ntype RuntimeOptions = {\n\tprocedures: Record<string, BuilderChain>\n\tdefault?: string\n\textras?: (params: Record<string, unknown>) => unknown\n\textrasByProcedure?: Record<\n\t\tstring,\n\t\t(params: Record<string, unknown>) => unknown\n\t>\n\tguards?: Record<\n\t\tstring,\n\t\t(value: unknown, params: GuardParams<unknown, unknown>) => unknown\n\t>\n\totel?: OtelApiLike\n\tlogger?: (scope: string, span: SpanLike | undefined) => FnLogger\n\tspanAttributes?: (params: {\n\t\tcontext: unknown\n\t\tname: string\n\t\tprocedure: string\n\t\tmeta: Record<string, unknown>\n\t}) => Record<string, AttributeValue | undefined>\n\tonCompleted?: (event: FnCompletedEvent) => LogAttributes | undefined\n\tisExpectedError?: (error: unknown) => boolean\n\tpubsub?: PubSubRuntimeOptions\n}\n\nexport type CreateFnOptions<\n\tTProcedures extends Record<string, BuilderLike>,\n\tTDefault extends keyof TProcedures & string,\n\tTExtras extends object,\n\tTGuards,\n\tTMeta extends object,\n\tTTag extends string,\n\tTOtel extends OtelApiLike | undefined,\n\tTLogger extends FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n> = {\n\t/** Named oRPC builders, e.g. `{ public: os.$context<Ctx>(), protected: authed }`. */\n\tprocedures: TProcedures\n\t/**\n\t * Builder used when a route omits `procedure`. Leave it out to make every\n\t * route name its procedure, so none gets one by accident.\n\t */\n\tdefault?: TDefault\n\t/** Per-call values merged into every handler's params; may be async. */\n\textras?: (\n\t\tparams: ProcedureHookParams<\n\t\t\tTProcedures,\n\t\t\t{\n\t\t\t\tspan: SpanOf<TOtel> | undefined\n\t\t\t\tsignal: AbortSignal | undefined\n\t\t\t\tname: string\n\t\t\t}\n\t\t>\n\t) => MaybePromise<TExtras>\n\textrasByProcedure?: {\n\t\t[K in keyof TScoped & keyof TProcedures]: (params: {\n\t\t\tcontext: CurrentContextOf<TProcedures[K]>\n\t\t\tspan: SpanOf<TOtel> | undefined\n\t\t\tsignal: AbortSignal | undefined\n\t\t\tname: string\n\t\t\tprocedure: K\n\t\t}) => MaybePromise<TScoped[K] & ScopedExtrasGuard<NoInfer<TScoped[K]>>>\n\t}\n\t/**\n\t * Checks run before the handler; each key becomes a typed `fn()` option.\n\t * Keys must not reuse route options. False denies, true or void allows.\n\t */\n\tguards?: TGuards &\n\t\tRecord<\n\t\t\tstring,\n\t\t\tGuard<\n\t\t\t\tnever,\n\t\t\t\tProcedureHookParams<\n\t\t\t\t\tTProcedures,\n\t\t\t\t\tOmit<GuardParams<unknown, TMeta>, 'context' | 'procedure'>\n\t\t\t\t>\n\t\t\t>\n\t\t> &\n\t\tRejectKeys<\n\t\t\tNoInfer<TGuards>,\n\t\t\tReservedOptionKey,\n\t\t\t'orpc-fn: this guard name is a route option'\n\t\t>\n\t/**\n\t * Typed route metadata contract: `meta: defineMeta<AppMeta>()`.\n\t * Route declarations place values inside their own `meta` object.\n\t */\n\tmeta?: TMeta\n\t/** Allowed route tags: `tags: ['internal', 'external']`. */\n\ttags?: readonly TTag[]\n\t/** `import * as otel from '@opentelemetry/api'`. Omit for no tracing. */\n\totel?: TOtel\n\tlogger?: (scope: string, span: SpanOf<TOtel> | undefined) => TLogger\n\t/** Extra span attributes per call; undefined values are skipped. */\n\tspanAttributes?: (\n\t\tparams: ProcedureHookParams<\n\t\t\tTProcedures,\n\t\t\t{ name: string; meta: Partial<TMeta> }\n\t\t>\n\t) => Record<string, AttributeValue | undefined>\n\t/** Called after the procedure (or stream) settles; returned attributes join the `fn.completed` log. */\n\tonCompleted?: (\n\t\tevent: CompletedHookEvent<TProcedures, SpanOf<TOtel>>\n\t\t// biome-ignore lint/suspicious/noConfusingVoidType: lets hooks that return nothing type-check\n\t) => LogAttributes | undefined | void\n\t/** Errors that are the caller's fault, logged at `warn`. Default: 4xx `ORPCError` or `AbortError`. */\n\tisExpectedError?: (error: unknown) => boolean\n\t/** Needed for `fnLive` and `createPubSub`. */\n\tpubsub?: PubSubRuntimeOptions\n}\n\ntype Definition<\n\tTProcedures extends Record<string, BuilderLike>,\n\tTDefault extends string,\n\tTExtras extends object,\n\tTGuards,\n\tTMeta extends object,\n\tTTag extends string,\n\tTOtel,\n\tTLogger extends FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n> = {\n\tprocedures: TProcedures\n\tdefault: TDefault\n\textras: TExtras\n\textrasByProcedure: TScoped\n\tguards: TGuards\n\tmeta: TMeta\n\ttag: TTag\n\tspan: SpanOf<TOtel>\n\tlogger: TLogger\n}\n\nexport type FnFactory<TDef extends FnDefinition> = {\n\tfn: Fn<TDef>\n\tfnLive: FnLive<TDef>\n\tcreatePubSub: CreatePubSub<TDef>\n\tcreatePublisher: CreatePublisher\n\tcreateRouter: typeof createRouter\n\treadMeta: typeof readFnMeta\n\t/**\n\t * A `call` outside any handler (seeders, scripts, tests), traced with this\n\t * instance's OpenTelemetry.\n\t */\n\tcreateCall: <TContext>(\n\t\tcontext: TContext,\n\t\tsignal?: AbortSignal\n\t) => BoundCall<TContext>\n\t/** Terminal, idempotent shutdown: close streams and await owned resources. */\n\tshutdown: () => Promise<void>\n\tdrainPubSubSubscribers: () => number\n\tactivePubSubSubscriberCount: () => number\n}\n\n/**\n * Builds the app's `fn` and friends once. Everything app-specific (auth,\n * context, database, queues, i18n, permissions) is injected here.\n */\nexport function createFn<\n\tconst TProcedures extends Record<string, BuilderLike>,\n\tTDefault extends keyof TProcedures & string = never,\n\tTExtras extends object = Record<never, never>,\n\tTGuards extends object = Record<never, never>,\n\tTMeta extends object = Record<never, never>,\n\tconst TTag extends string = string,\n\tTOtel extends OtelApiLike | undefined = undefined,\n\tTLogger extends FnLogger = FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n>(\n\toptions: CreateFnOptions<\n\t\tTProcedures,\n\t\tTDefault,\n\t\tTExtras,\n\t\tTGuards,\n\t\tTMeta,\n\t\tTTag,\n\t\tTOtel,\n\t\tTLogger,\n\t\tTScoped\n\t> &\n\t\tFiniteExtras<NoInfer<TExtras>>\n): FnFactory<\n\tDefinition<\n\t\tTProcedures,\n\t\tTDefault,\n\t\tTExtras,\n\t\tTGuards,\n\t\tTMeta,\n\t\tTTag,\n\t\tTOtel,\n\t\tTLogger,\n\t\tTScoped\n\t>\n> {\n\tconst runtime = options as unknown as RuntimeOptions\n\tconst tracing = createTracing(runtime.otel)\n\tconst defaultLogger = protectLogger(createDefaultLogger('fn'))\n\tconst createLogger = (\n\t\tscope: string,\n\t\tspan: SpanLike | undefined\n\t): FnLogger => {\n\t\ttry {\n\t\t\treturn protectLogger(\n\t\t\t\truntime.logger?.(scope, span) ??\n\t\t\t\t\t(scope === 'fn' ? defaultLogger : createDefaultLogger(scope))\n\t\t\t)\n\t\t} catch {\n\t\t\treturn defaultLogger\n\t\t}\n\t}\n\tconst isExpectedError = runtime.isExpectedError ?? isExpectedClientError\n\tconst guards = runtime.guards ?? {}\n\tconst isGuard = (option: string) => Object.hasOwn(guards, option)\n\tfor (const guard of Object.keys(guards)) {\n\t\tif (typeof guards[guard] !== 'function')\n\t\t\tthrow new TypeError(`orpc-fn: guard ${guard} must be a function`)\n\t\tif ((RESERVED_OPTION_KEYS as readonly string[]).includes(guard)) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: guard \"${guard}\" reuses a route option name; rename it`\n\t\t\t)\n\t\t}\n\t}\n\tif (runtime.default && !Object.hasOwn(runtime.procedures, runtime.default))\n\t\tthrow new TypeError(`orpc-fn: unknown default procedure ${runtime.default}`)\n\tfor (const [key, builder] of Object.entries(runtime.procedures)) {\n\t\tconst def = procedureDefinition(builder)\n\t\tif (def?.inputSchema !== undefined || def?.outputSchema !== undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: procedure \"${key}\" sets an input or output schema; set schemas on routes instead`\n\t\t\t)\n\t\t}\n\t}\n\n\tconst resolveKey = (procedure: string | undefined, name: string) => {\n\t\tconst key = procedure ?? runtime.default\n\t\tif (key === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: \"${name}\" needs a procedure; createFn has no default`\n\t\t\t)\n\t\t}\n\t\treturn key\n\t}\n\n\tconst buildProcedure = createProcedureAssembler(\n\t\truntime.procedures,\n\t\tresolveKey\n\t)\n\n\tconst invocation = Symbol('orpc-fn.invocation')\n\ttype Invocation = {\n\t\tspan: SpanLike | undefined\n\t\tlogger: FnLogger\n\t\tinput: unknown\n\t\tcontext: unknown\n\t\thandlerStarted: boolean\n\t\trawInput: unknown\n\t}\n\t// The overload-to-runtime boundary is adapted once at the returned factory.\n\tconst fn = (routeOptions: Record<string, unknown>): AnyProcedure => {\n\t\tconst {\n\t\t\thandler,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\tname,\n\t\t\tprocedure,\n\t\t\tmeta,\n\t\t\tstream,\n\t\t\terrors,\n\t\t\tguardResolvers,\n\t\t\troute,\n\t\t\tguardChecks\n\t\t} = normalizeRoute(routeOptions, isGuard)\n\t\tconst key = resolveKey(procedure, name)\n\t\tconst built = buildProcedure({\n\t\t\tname,\n\t\t\tprocedure: key,\n\t\t\troute,\n\t\t\tmeta,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\tstream,\n\t\t\t...(errors ? { errors } : {}),\n\t\t\thandler: async (params) => {\n\t\t\t\tconst { context, signal } = params\n\t\t\t\tconst state = context[invocation] as Invocation\n\t\t\t\tconst { [invocation]: _invocation, ...observedContext } = context\n\t\t\t\tstate.context = observedContext\n\t\t\t\tstate.input = params.input\n\t\t\t\tstate.handlerStarted = true\n\t\t\t\ttry {\n\t\t\t\t\tconst attributes = runtime.spanAttributes?.({\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\tmeta\n\t\t\t\t\t})\n\t\t\t\t\tfor (const [attribute, value] of Object.entries(attributes ?? {}))\n\t\t\t\t\t\tif (value !== undefined) state.span?.setAttribute(attribute, value)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tstate.logger.warn('spanAttributes hook failed', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tconst resolvedChecks = [...guardChecks]\n\t\t\t\tfor (const [guard, resolver] of Object.entries(guardResolvers)) {\n\t\t\t\t\tconst value = await resolver({ input: params.input, context, signal })\n\t\t\t\t\tif (value !== undefined) resolvedChecks.push([guard, value])\n\t\t\t\t}\n\t\t\t\tfor (const [guard, value] of resolvedChecks) {\n\t\t\t\t\tconst result = await guards[guard]?.(value, {\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tinput: params.input,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\tmeta,\n\t\t\t\t\t\tsignal\n\t\t\t\t\t})\n\t\t\t\t\tif (result === false)\n\t\t\t\t\t\tthrow new ORPCError('FORBIDDEN', {\n\t\t\t\t\t\t\tmessage: `Guard \"${guard}\" denied this call`\n\t\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && result !== true)\n\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t`orpc-fn: guard \"${guard}\" must return void or boolean`\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst extraParams = {\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan: state.span,\n\t\t\t\t\tsignal,\n\t\t\t\t\tname,\n\t\t\t\t\tprocedure: key\n\t\t\t\t}\n\t\t\t\tconst shared = await runtime.extras?.(extraParams)\n\t\t\t\tconst scoped = await runtime.extrasByProcedure?.[key]?.(extraParams)\n\t\t\t\tconst extras = {\n\t\t\t\t\t...(shared as object | undefined),\n\t\t\t\t\t...(scoped as object | undefined)\n\t\t\t\t}\n\t\t\t\tif (extras && typeof extras === 'object') {\n\t\t\t\t\tfor (const reserved of [\n\t\t\t\t\t\t'input',\n\t\t\t\t\t\t'context',\n\t\t\t\t\t\t'call',\n\t\t\t\t\t\t'signal',\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t'logger',\n\t\t\t\t\t\t'errors',\n\t\t\t\t\t\t'lastEventId'\n\t\t\t\t\t]) {\n\t\t\t\t\t\tif (Object.hasOwn(extras, reserved))\n\t\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t\t`orpc-fn: extra \"${reserved}\" shadows a handler parameter`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn handler({\n\t\t\t\t\t...(extras as object | undefined),\n\t\t\t\t\tinput: params.input,\n\t\t\t\t\tcontext,\n\t\t\t\t\tcall: createBoundCall(context, signal, tracing),\n\t\t\t\t\tsignal,\n\t\t\t\t\tspan: state.span,\n\t\t\t\t\tlogger: state.logger,\n\t\t\t\t\terrors: params.errors,\n\t\t\t\t\tlastEventId: params.lastEventId,\n\t\t\t\t\t[RAW_INPUT]: state.rawInput\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\t// Prepending middleware shifts oRPC's validation indexes, covering auth,\n\t\t// input validation, output validation, and the final stream lifetime.\n\t\treturn os\n\t\t\t.use(async ({ context, next }, rawInput) => {\n\t\t\t\tconst started = performance.now()\n\t\t\t\tconst state: Invocation = {\n\t\t\t\t\tspan: undefined,\n\t\t\t\t\tlogger: defaultLogger,\n\t\t\t\t\tinput: undefined,\n\t\t\t\t\tcontext,\n\t\t\t\t\thandlerStarted: false,\n\t\t\t\t\trawInput\n\t\t\t\t}\n\t\t\t\tconst result = await tracing.inSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t'SERVER',\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\tstate.span = span\n\t\t\t\t\t\tstate.logger = createLogger('fn', span)\n\t\t\t\t\t\tspan?.setAttribute('fn.operation', name)\n\t\t\t\t\t\tspan?.setAttribute('fn.procedure', key)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await next({ context: { [invocation]: state } })\n\t\t\t\t\t\t\tif (isAsyncIteratorObject(result.output) !== stream) {\n\t\t\t\t\t\t\t\tif (isAsyncIteratorObject(result.output)) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tawait result.output.return?.()\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\t/* Release the unexpected stream. */\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t\t\t`orpc-fn: ${name} returned a result inconsistent with stream; declare stream: true for iterators`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result.output\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tconst timing = (context as Record<symbol, unknown>)[\n\t\t\t\t\t\t\t\tREQUEST_TIMING\n\t\t\t\t\t\t\t] as InvocationTiming | undefined\n\t\t\t\t\t\t\tif (timing && !(context as Record<symbol, unknown>)[invocation]) {\n\t\t\t\t\t\t\t\ttiming.procedureMs += performance.now() - started\n\t\t\t\t\t\t\t\ttiming.calls++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t(span, ...error) => {\n\t\t\t\t\t\tconst durationMs =\n\t\t\t\t\t\t\tMath.round((performance.now() - started) * 100) / 100\n\t\t\t\t\t\tspan?.setAttribute('fn.duration_ms', durationMs)\n\t\t\t\t\t\tlogCompleted(state.logger, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\tsuccess: error.length === 0,\n\t\t\t\t\t\t\terror: error[0],\n\t\t\t\t\t\t\tinput: state.input,\n\t\t\t\t\t\t\tcontext: state.context,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\thandlerStarted: state.handlerStarted\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\treturn { output: result, context }\n\t\t\t})\n\t\t\t.router({ route: built }).route\n\t}\n\n\tconst logCompleted = (logger: FnLogger, event: FnCompletedEvent) => {\n\t\tconst { error, success } = event\n\t\tlet extra: LogAttributes | undefined\n\t\ttry {\n\t\t\textra = runtime.onCompleted?.(event)\n\t\t} catch (hookError) {\n\t\t\tlogger.warn('onCompleted hook failed', {\n\t\t\t\terror: errorMessageOf(hookError)\n\t\t\t})\n\t\t}\n\t\tlet expected = false\n\t\ttry {\n\t\t\texpected = isExpectedError(error)\n\t\t} catch {\n\t\t\texpected = isExpectedClientError(error)\n\t\t}\n\t\tconst level = success ? 'info' : expected ? 'warn' : 'error'\n\t\tlogger[level]('fn.completed', {\n\t\t\t...extra,\n\t\t\tevent: 'fn.completed',\n\t\t\toperation: event.name,\n\t\t\tprocedure: event.procedure,\n\t\t\tduration_ms: event.durationMs,\n\t\t\tstatus: success ? 'success' : 'failed',\n\t\t\t...(error === undefined\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\terror_type: error instanceof Error ? error.name : typeof error,\n\t\t\t\t\t\terror_message: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t})\n\t}\n\n\tconst live = createLiveRuntime({\n\t\tfn,\n\t\ttracing,\n\t\tcreateLogger,\n\t\tpubsub: runtime.pubsub\n\t})\n\n\t// The runtimes are untyped; `Fn`, `FnLive`, `CreatePubSub` and\n\t// `CreatePublisher` are their typed surface.\n\treturn {\n\t\tfn,\n\t\tfnLive: createFnLive({\n\t\t\tfn,\n\t\t\tcreateChannel: live.createChannel,\n\t\t\tcreateLogger,\n\t\t\tisGuard\n\t\t}),\n\t\tcreatePubSub: live.createPubSub,\n\t\tcreatePublisher: live.createPublisher,\n\t\tcreateRouter,\n\t\treadMeta: readFnMeta,\n\t\tcreateCall: <TContext>(context: TContext, signal?: AbortSignal) =>\n\t\t\tcreateBoundCall(context, signal, tracing),\n\t\tshutdown: live.shutdown,\n\t\tdrainPubSubSubscribers: live.drainPubSubSubscribers,\n\t\tactivePubSubSubscriberCount: live.activePubSubSubscriberCount\n\t} as unknown as FnFactory<\n\t\tDefinition<\n\t\t\tTProcedures,\n\t\t\tTDefault,\n\t\t\tTExtras,\n\t\t\tTGuards,\n\t\t\tTMeta,\n\t\t\tTTag,\n\t\t\tTOtel,\n\t\t\tTLogger,\n\t\t\tTScoped\n\t\t>\n\t>\n}\n"]}
1
+ {"version":3,"file":"create-fn.js","sourceRoot":"","sources":["../src/create-fn.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype BuilderChain,\n\tcreateProcedureAssembler\n} from './assemble-procedure.js'\nimport { isAsyncIteratorObject } from './stream.js'\nimport { normalizeRoute } from './route-options.js'\nimport { type AnyProcedure, ORPCError, os } from '@orpc/server'\nimport { procedureDefinition } from './compatibility.js'\nimport { type BoundCall, createBoundCall } from './bound-call.js'\nimport { isExpectedClientError } from './expected-client-error.js'\nimport { createFnLive, type FnLive } from './live/fn-live.js'\nimport {\n\ttype CreatePublisher,\n\ttype CreatePubSub,\n\tcreateLiveRuntime,\n\ttype PubSubRuntimeOptions\n} from './live/pub-sub.js'\nimport {\n\tcreateDefaultLogger,\n\tprotectLogger,\n\ttype FnLogger,\n\ttype LogAttributes\n} from './logger.js'\nimport { readFnMeta } from './meta.js'\nimport {\n\ttype AttributeValue,\n\tcreateTracing,\n\terrorAttributes,\n\terrorMessageOf,\n\ttype OtelApiLike,\n\ttype SpanLike,\n\ttype SpanOf\n} from './otel.js'\nimport { RAW_INPUT, REQUEST_TIMING, type InvocationTiming } from './timing.js'\nimport { createRouter } from './router.js'\nimport {\n\ttype ProcedureHookParams,\n\ttype CompletedHookEvent,\n\ttype CurrentContextOf,\n\ttype BuilderLike,\n\ttype FiniteExtras,\n\ttype ScopedExtrasGuard,\n\ttype Fn,\n\ttype FnCompletedEvent,\n\ttype FnDefinition,\n\ttype Guard,\n\ttype GuardParams,\n\ttype MaybePromise,\n\ttype RejectKeys,\n\tRESERVED_OPTION_KEYS,\n\ttype ReservedOptionKey\n} from './types.js'\n\n/** `CreateFnOptions` with the generics erased: what the implementation reads. */\ntype RuntimeOptions = {\n\tprocedures: Record<string, BuilderChain>\n\tdefault?: string\n\textras?: (params: Record<string, unknown>) => unknown\n\textrasByProcedure?: Record<\n\t\tstring,\n\t\t(params: Record<string, unknown>) => unknown\n\t>\n\tguards?: Record<\n\t\tstring,\n\t\t(value: unknown, params: GuardParams<unknown, unknown>) => unknown\n\t>\n\totel?: OtelApiLike\n\tlogger?: (scope: string, span: SpanLike | undefined) => FnLogger\n\tspanAttributes?: (params: {\n\t\tcontext: unknown\n\t\tname: string\n\t\tprocedure: string\n\t\tmeta: Record<string, unknown>\n\t}) => Record<string, AttributeValue | undefined>\n\tonCompleted?: (event: FnCompletedEvent) => LogAttributes | undefined\n\tisExpectedError?: (error: unknown) => boolean\n\tpubsub?: PubSubRuntimeOptions\n}\n\nexport type CreateFnOptions<\n\tTProcedures extends Record<string, BuilderLike>,\n\tTDefault extends keyof TProcedures & string,\n\tTExtras extends object,\n\tTGuards,\n\tTMeta extends object,\n\tTTag extends string,\n\tTOtel extends OtelApiLike | undefined,\n\tTLogger extends FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n> = {\n\t/** Named oRPC builders, e.g. `{ public: os.$context<Ctx>(), protected: authed }`. */\n\tprocedures: TProcedures\n\t/**\n\t * Builder used when a route omits `procedure`. Leave it out to make every\n\t * route name its procedure, so none gets one by accident.\n\t */\n\tdefault?: TDefault\n\t/** Per-call values merged into every handler's params; may be async. */\n\textras?: (\n\t\tparams: ProcedureHookParams<\n\t\t\tTProcedures,\n\t\t\t{\n\t\t\t\tspan: SpanOf<TOtel> | undefined\n\t\t\t\tsignal: AbortSignal | undefined\n\t\t\t\tname: string\n\t\t\t}\n\t\t>\n\t) => MaybePromise<TExtras>\n\textrasByProcedure?: {\n\t\t[K in keyof TScoped & keyof TProcedures]: (params: {\n\t\t\tcontext: CurrentContextOf<TProcedures[K]>\n\t\t\tspan: SpanOf<TOtel> | undefined\n\t\t\tsignal: AbortSignal | undefined\n\t\t\tname: string\n\t\t\tprocedure: K\n\t\t}) => MaybePromise<TScoped[K] & ScopedExtrasGuard<NoInfer<TScoped[K]>>>\n\t}\n\t/**\n\t * Checks run before the handler; each key becomes a typed `fn()` option.\n\t * Keys must not reuse route options. False denies, true or void allows.\n\t */\n\tguards?: TGuards &\n\t\tRecord<\n\t\t\tstring,\n\t\t\tGuard<\n\t\t\t\tnever,\n\t\t\t\tProcedureHookParams<\n\t\t\t\t\tTProcedures,\n\t\t\t\t\tOmit<GuardParams<unknown, TMeta>, 'context' | 'procedure'>\n\t\t\t\t>\n\t\t\t>\n\t\t> &\n\t\tRejectKeys<\n\t\t\tNoInfer<TGuards>,\n\t\t\tReservedOptionKey,\n\t\t\t'orpc-fn: this guard name is a route option'\n\t\t>\n\t/**\n\t * Typed route metadata contract: `meta: defineMeta<AppMeta>()`.\n\t * Route declarations place values inside their own `meta` object.\n\t */\n\tmeta?: TMeta\n\t/** Allowed route tags: `tags: ['internal', 'external']`. */\n\ttags?: readonly TTag[]\n\t/** `import * as otel from '@opentelemetry/api'`. Omit for no tracing. */\n\totel?: TOtel\n\tlogger?: (scope: string, span: SpanOf<TOtel> | undefined) => TLogger\n\t/** Extra span attributes per call; undefined values are skipped. */\n\tspanAttributes?: (\n\t\tparams: ProcedureHookParams<\n\t\t\tTProcedures,\n\t\t\t{ name: string; meta: Partial<TMeta> }\n\t\t>\n\t) => Record<string, AttributeValue | undefined>\n\t/** Called after the procedure (or stream) settles; returned attributes join the `fn.completed` log. */\n\tonCompleted?: (\n\t\tevent: CompletedHookEvent<TProcedures, SpanOf<TOtel>>\n\t\t// biome-ignore lint/suspicious/noConfusingVoidType: lets hooks that return nothing type-check\n\t) => LogAttributes | undefined | void\n\t/** Errors that are the caller's fault, logged at `warn`. Default: 4xx `ORPCError` or `AbortError`. */\n\tisExpectedError?: (error: unknown) => boolean\n\t/** Needed for `fnLive` and `createPubSub`. */\n\tpubsub?: PubSubRuntimeOptions\n}\n\ntype Definition<\n\tTProcedures extends Record<string, BuilderLike>,\n\tTDefault extends string,\n\tTExtras extends object,\n\tTGuards,\n\tTMeta extends object,\n\tTTag extends string,\n\tTOtel,\n\tTLogger extends FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n> = {\n\tprocedures: TProcedures\n\tdefault: TDefault\n\textras: TExtras\n\textrasByProcedure: TScoped\n\tguards: TGuards\n\tmeta: TMeta\n\ttag: TTag\n\tspan: SpanOf<TOtel>\n\tlogger: TLogger\n}\n\nexport type FnFactory<TDef extends FnDefinition> = {\n\tfn: Fn<TDef>\n\tfnLive: FnLive<TDef>\n\tcreatePubSub: CreatePubSub<TDef>\n\tcreatePublisher: CreatePublisher\n\tcreateRouter: typeof createRouter\n\treadMeta: typeof readFnMeta\n\t/**\n\t * A `call` outside any handler (seeders, scripts, tests), traced with this\n\t * instance's OpenTelemetry.\n\t */\n\tcreateCall: <TContext>(\n\t\tcontext: TContext,\n\t\tsignal?: AbortSignal\n\t) => BoundCall<TContext>\n\t/** Terminal, idempotent shutdown: close streams and await owned resources. */\n\tshutdown: () => Promise<void>\n\tdrainPubSubSubscribers: () => number\n\tactivePubSubSubscriberCount: () => number\n}\n\n/**\n * Builds the app's `fn` and friends once. Everything app-specific (auth,\n * context, database, queues, i18n, permissions) is injected here.\n */\nexport function createFn<\n\tconst TProcedures extends Record<string, BuilderLike>,\n\tTDefault extends keyof TProcedures & string = never,\n\tTExtras extends object = Record<never, never>,\n\tTGuards extends object = Record<never, never>,\n\tTMeta extends object = Record<never, never>,\n\tconst TTag extends string = string,\n\tTOtel extends OtelApiLike | undefined = undefined,\n\tTLogger extends FnLogger = FnLogger,\n\tTScoped extends Partial<Record<keyof TProcedures, object>> = Record<\n\t\tnever,\n\t\tnever\n\t>\n>(\n\toptions: CreateFnOptions<\n\t\tTProcedures,\n\t\tTDefault,\n\t\tTExtras,\n\t\tTGuards,\n\t\tTMeta,\n\t\tTTag,\n\t\tTOtel,\n\t\tTLogger,\n\t\tTScoped\n\t> &\n\t\tFiniteExtras<NoInfer<TExtras>>\n): FnFactory<\n\tDefinition<\n\t\tTProcedures,\n\t\tTDefault,\n\t\tTExtras,\n\t\tTGuards,\n\t\tTMeta,\n\t\tTTag,\n\t\tTOtel,\n\t\tTLogger,\n\t\tTScoped\n\t>\n> {\n\tconst runtime = options as unknown as RuntimeOptions\n\tconst tracing = createTracing(runtime.otel)\n\tconst defaultLogger = protectLogger(createDefaultLogger('fn'))\n\tconst createLogger = (\n\t\tscope: string,\n\t\tspan: SpanLike | undefined\n\t): FnLogger => {\n\t\ttry {\n\t\t\treturn protectLogger(\n\t\t\t\truntime.logger?.(scope, span) ??\n\t\t\t\t\t(scope === 'fn' ? defaultLogger : createDefaultLogger(scope))\n\t\t\t)\n\t\t} catch {\n\t\t\treturn defaultLogger\n\t\t}\n\t}\n\tconst isExpectedError = runtime.isExpectedError ?? isExpectedClientError\n\tconst guards = runtime.guards ?? {}\n\tconst isGuard = (option: string) => Object.hasOwn(guards, option)\n\tfor (const guard of Object.keys(guards)) {\n\t\tif (typeof guards[guard] !== 'function')\n\t\t\tthrow new TypeError(`orpc-fn: guard ${guard} must be a function`)\n\t\tif ((RESERVED_OPTION_KEYS as readonly string[]).includes(guard)) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: guard \"${guard}\" reuses a route option name; rename it`\n\t\t\t)\n\t\t}\n\t}\n\tif (runtime.default && !Object.hasOwn(runtime.procedures, runtime.default))\n\t\tthrow new TypeError(`orpc-fn: unknown default procedure ${runtime.default}`)\n\tfor (const [key, builder] of Object.entries(runtime.procedures)) {\n\t\tconst def = procedureDefinition(builder)\n\t\tif (def?.inputSchema !== undefined || def?.outputSchema !== undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: procedure \"${key}\" sets an input or output schema; set schemas on routes instead`\n\t\t\t)\n\t\t}\n\t}\n\n\tconst resolveKey = (procedure: string | undefined, name: string) => {\n\t\tconst key = procedure ?? runtime.default\n\t\tif (key === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`orpc-fn: \"${name}\" needs a procedure; createFn has no default`\n\t\t\t)\n\t\t}\n\t\treturn key\n\t}\n\n\tconst buildProcedure = createProcedureAssembler(\n\t\truntime.procedures,\n\t\tresolveKey\n\t)\n\n\tconst invocation = Symbol('orpc-fn.invocation')\n\ttype Invocation = {\n\t\tspan: SpanLike | undefined\n\t\tlogger: FnLogger\n\t\tinput: unknown\n\t\tcontext: unknown\n\t\thandlerStarted: boolean\n\t\trawInput: unknown\n\t}\n\t// The overload-to-runtime boundary is adapted once at the returned factory.\n\tconst fn = (routeOptions: Record<string, unknown>): AnyProcedure => {\n\t\tconst {\n\t\t\thandler,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\tname,\n\t\t\tprocedure,\n\t\t\tmeta,\n\t\t\tstream,\n\t\t\terrors,\n\t\t\tguardResolvers,\n\t\t\troute,\n\t\t\tguardChecks\n\t\t} = normalizeRoute(routeOptions, isGuard)\n\t\tconst key = resolveKey(procedure, name)\n\t\tconst built = buildProcedure({\n\t\t\tname,\n\t\t\tprocedure: key,\n\t\t\troute,\n\t\t\tmeta,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\tstream,\n\t\t\t...(errors ? { errors } : {}),\n\t\t\thandler: async (params) => {\n\t\t\t\tconst { context, signal } = params\n\t\t\t\tconst state = context[invocation] as Invocation\n\t\t\t\tconst { [invocation]: _invocation, ...observedContext } = context\n\t\t\t\tstate.context = observedContext\n\t\t\t\tstate.input = params.input\n\t\t\t\tstate.handlerStarted = true\n\t\t\t\ttry {\n\t\t\t\t\tconst attributes = runtime.spanAttributes?.({\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\tmeta\n\t\t\t\t\t})\n\t\t\t\t\tfor (const [attribute, value] of Object.entries(attributes ?? {}))\n\t\t\t\t\t\tif (value !== undefined) state.span?.setAttribute(attribute, value)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tstate.logger.warn('spanAttributes hook failed', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tconst resolvedChecks = [...guardChecks]\n\t\t\t\tfor (const [guard, resolver] of Object.entries(guardResolvers)) {\n\t\t\t\t\tconst value = await resolver({ input: params.input, context, signal })\n\t\t\t\t\tif (value !== undefined) resolvedChecks.push([guard, value])\n\t\t\t\t}\n\t\t\t\tfor (const [guard, value] of resolvedChecks) {\n\t\t\t\t\tconst result = await guards[guard]?.(value, {\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tinput: params.input,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\tmeta,\n\t\t\t\t\t\tsignal\n\t\t\t\t\t})\n\t\t\t\t\tif (result === false)\n\t\t\t\t\t\tthrow new ORPCError('FORBIDDEN', {\n\t\t\t\t\t\t\tmessage: `Guard \"${guard}\" denied this call`\n\t\t\t\t\t\t})\n\t\t\t\t\tif (result !== undefined && result !== true)\n\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t`orpc-fn: guard \"${guard}\" must return void or boolean`\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tconst extraParams = {\n\t\t\t\t\tcontext,\n\t\t\t\t\tspan: state.span,\n\t\t\t\t\tsignal,\n\t\t\t\t\tname,\n\t\t\t\t\tprocedure: key\n\t\t\t\t}\n\t\t\t\tconst shared = await runtime.extras?.(extraParams)\n\t\t\t\tconst scoped = await runtime.extrasByProcedure?.[key]?.(extraParams)\n\t\t\t\tconst extras = {\n\t\t\t\t\t...(shared as object | undefined),\n\t\t\t\t\t...(scoped as object | undefined)\n\t\t\t\t}\n\t\t\t\tif (extras && typeof extras === 'object') {\n\t\t\t\t\tfor (const reserved of [\n\t\t\t\t\t\t'input',\n\t\t\t\t\t\t'context',\n\t\t\t\t\t\t'call',\n\t\t\t\t\t\t'signal',\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t'logger',\n\t\t\t\t\t\t'errors',\n\t\t\t\t\t\t'lastEventId'\n\t\t\t\t\t]) {\n\t\t\t\t\t\tif (Object.hasOwn(extras, reserved))\n\t\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t\t`orpc-fn: extra \"${reserved}\" shadows a handler parameter`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn handler({\n\t\t\t\t\t...(extras as object | undefined),\n\t\t\t\t\tinput: params.input,\n\t\t\t\t\tcontext,\n\t\t\t\t\tcall: createBoundCall(context, signal, tracing),\n\t\t\t\t\tsignal,\n\t\t\t\t\tspan: state.span,\n\t\t\t\t\tlogger: state.logger,\n\t\t\t\t\terrors: params.errors,\n\t\t\t\t\tlastEventId: params.lastEventId,\n\t\t\t\t\t[RAW_INPUT]: state.rawInput\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\t// Prepending middleware shifts oRPC's validation indexes, covering auth,\n\t\t// input validation, output validation, and the final stream lifetime.\n\t\treturn os\n\t\t\t.use(async ({ context, next }, rawInput) => {\n\t\t\t\tconst started = performance.now()\n\t\t\t\tconst state: Invocation = {\n\t\t\t\t\tspan: undefined,\n\t\t\t\t\tlogger: defaultLogger,\n\t\t\t\t\tinput: undefined,\n\t\t\t\t\tcontext,\n\t\t\t\t\thandlerStarted: false,\n\t\t\t\t\trawInput\n\t\t\t\t}\n\t\t\t\tconst result = await tracing.inSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t'SERVER',\n\t\t\t\t\tasync (span) => {\n\t\t\t\t\t\tstate.span = span\n\t\t\t\t\t\tstate.logger = createLogger('fn', span)\n\t\t\t\t\t\tspan?.setAttribute('fn.operation', name)\n\t\t\t\t\t\tspan?.setAttribute('fn.procedure', key)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await next({ context: { [invocation]: state } })\n\t\t\t\t\t\t\tif (isAsyncIteratorObject(result.output) !== stream) {\n\t\t\t\t\t\t\t\tif (isAsyncIteratorObject(result.output)) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tawait result.output.return?.()\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\t/* Release the unexpected stream. */\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t\t\t\t`orpc-fn: ${name} returned a result inconsistent with stream; declare stream: true for iterators`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn result.output\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tconst timing = (context as Record<symbol, unknown>)[\n\t\t\t\t\t\t\t\tREQUEST_TIMING\n\t\t\t\t\t\t\t] as InvocationTiming | undefined\n\t\t\t\t\t\t\tif (timing && !(context as Record<symbol, unknown>)[invocation]) {\n\t\t\t\t\t\t\t\ttiming.procedureMs += performance.now() - started\n\t\t\t\t\t\t\t\ttiming.calls++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t(span, ...error) => {\n\t\t\t\t\t\tconst durationMs =\n\t\t\t\t\t\t\tMath.round((performance.now() - started) * 100) / 100\n\t\t\t\t\t\tspan?.setAttribute('fn.duration_ms', durationMs)\n\t\t\t\t\t\tlogCompleted(state.logger, {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tprocedure: key,\n\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\tsuccess: error.length === 0,\n\t\t\t\t\t\t\terror: error[0],\n\t\t\t\t\t\t\tinput: state.input,\n\t\t\t\t\t\t\tcontext: state.context,\n\t\t\t\t\t\t\tspan,\n\t\t\t\t\t\t\tmeta,\n\t\t\t\t\t\t\thandlerStarted: state.handlerStarted\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\treturn { output: result, context }\n\t\t\t})\n\t\t\t.router({ route: built }).route\n\t}\n\n\tconst logCompleted = (logger: FnLogger, event: FnCompletedEvent) => {\n\t\tconst { error, success } = event\n\t\tlet extra: LogAttributes | undefined\n\t\ttry {\n\t\t\textra = runtime.onCompleted?.(event)\n\t\t} catch (hookError) {\n\t\t\tlogger.warn('onCompleted hook failed', {\n\t\t\t\terror: errorMessageOf(hookError)\n\t\t\t})\n\t\t}\n\t\tlet expected = false\n\t\ttry {\n\t\t\texpected = isExpectedError(error)\n\t\t} catch {\n\t\t\texpected = isExpectedClientError(error)\n\t\t}\n\t\tconst level = success ? 'info' : expected ? 'warn' : 'error'\n\t\tlogger[level]('fn.completed', {\n\t\t\t...extra,\n\t\t\tevent: 'fn.completed',\n\t\t\toperation: event.name,\n\t\t\tprocedure: event.procedure,\n\t\t\tduration_ms: event.durationMs,\n\t\t\tstatus: success ? 'success' : 'failed',\n\t\t\t...(error === undefined ? {} : errorAttributes(error))\n\t\t})\n\t}\n\n\tconst live = createLiveRuntime({\n\t\tfn,\n\t\ttracing,\n\t\tcreateLogger,\n\t\tpubsub: runtime.pubsub\n\t})\n\n\t// The runtimes are untyped; `Fn`, `FnLive`, `CreatePubSub` and\n\t// `CreatePublisher` are their typed surface.\n\treturn {\n\t\tfn,\n\t\tfnLive: createFnLive({\n\t\t\tfn,\n\t\t\tcreateChannel: live.createChannel,\n\t\t\tcreateLogger,\n\t\t\tisGuard\n\t\t}),\n\t\tcreatePubSub: live.createPubSub,\n\t\tcreatePublisher: live.createPublisher,\n\t\tcreateRouter,\n\t\treadMeta: readFnMeta,\n\t\tcreateCall: <TContext>(context: TContext, signal?: AbortSignal) =>\n\t\t\tcreateBoundCall(context, signal, tracing),\n\t\tshutdown: live.shutdown,\n\t\tdrainPubSubSubscribers: live.drainPubSubSubscribers,\n\t\tactivePubSubSubscriberCount: live.activePubSubSubscriberCount\n\t} as unknown as FnFactory<\n\t\tDefinition<\n\t\t\tTProcedures,\n\t\t\tTDefault,\n\t\t\tTExtras,\n\t\t\tTGuards,\n\t\t\tTMeta,\n\t\t\tTTag,\n\t\t\tTOtel,\n\t\t\tTLogger,\n\t\t\tTScoped\n\t\t>\n\t>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ORPCError } from '@orpc/server';
2
- import { errorMessageOf } from '../otel.js';
2
+ import { errorAttributes, errorMessageOf } from '../otel.js';
3
3
  import { decodeMessage, encodePayload } from './codec.js';
4
4
  import { LIVE_GAP, positiveInteger, safely, waitFor } from './lifecycle.js';
5
5
  // ═══════════════════════════════════════════════════════════════════════════
@@ -361,8 +361,9 @@ export function createLiveRuntime(options) {
361
361
  name: config.name,
362
362
  channel
363
363
  });
364
- logger.warn(`Dropped malformed message on ${channel}`, {
365
- error: errorMessageOf(error)
364
+ logger.warn('pubsub.message_dropped', {
365
+ channel,
366
+ ...errorAttributes(error)
366
367
  });
367
368
  }
368
369
  }
@@ -377,7 +378,8 @@ export function createLiveRuntime(options) {
377
378
  return;
378
379
  const delayMs = getResubscribeDelayMs(attempt);
379
380
  attempt++;
380
- logger.warn(`Scheduling resubscribe for ${channel}`, {
381
+ logger.warn('pubsub.resubscribe_scheduled', {
382
+ channel,
381
383
  reason,
382
384
  attempt,
383
385
  delayMs
@@ -403,8 +405,9 @@ export function createLiveRuntime(options) {
403
405
  connected = false;
404
406
  markPending();
405
407
  }
406
- logger.error(`Subscription to ${channel} lost`, {
407
- error: error.message
408
+ logger.error('pubsub.subscription_lost', {
409
+ channel,
410
+ ...errorAttributes(error)
408
411
  });
409
412
  scheduleResubscribe('lost');
410
413
  }, {
@@ -440,11 +443,12 @@ export function createLiveRuntime(options) {
440
443
  connectedOnce = true;
441
444
  markReady();
442
445
  attempt = 0;
443
- logger.info(`Subscribed to ${channel}`);
446
+ logger.debug('pubsub.subscribed', { channel });
444
447
  }
445
448
  catch (error) {
446
- logger.error(`Failed to subscribe to ${channel}`, {
447
- error: errorMessageOf(error)
449
+ logger.error('pubsub.subscribe_failed', {
450
+ channel,
451
+ ...errorAttributes(error)
448
452
  });
449
453
  scheduleResubscribe('subscribe-failed');
450
454
  }
@@ -541,7 +545,7 @@ export function createLiveRuntime(options) {
541
545
  tracing.end(span, error);
542
546
  throw error;
543
547
  }
544
- subscriberLogger.info(`Subscribing to ${channelName}`);
548
+ subscriberLogger.debug('pubsub.subscribing', { channel: channelName });
545
549
  let messageCount = 0;
546
550
  let droppedCount = 0;
547
551
  const delivery = createSubscriberDelivery({
@@ -655,7 +659,8 @@ export function createLiveRuntime(options) {
655
659
  span?.setAttribute('pubsub.message_count', messageCount);
656
660
  span?.setAttribute('pubsub.dropped_count', droppedCount);
657
661
  tracing.end(span, ...error);
658
- subscriberLogger.info(`Unsubscribed from ${channelName}`, {
662
+ subscriberLogger.debug('pubsub.unsubscribed', {
663
+ channel: channelName,
659
664
  messageCount,
660
665
  droppedCount,
661
666
  durationMs: Math.round(durationMs)
@@ -704,7 +709,10 @@ export function createLiveRuntime(options) {
704
709
  }
705
710
  catch (error) {
706
711
  replayGap = true;
707
- subscriberLogger.warn(`Failed to replay backlog for ${channelName}`, { error: errorMessageOf(error) });
712
+ subscriberLogger.warn('pubsub.replay_failed', {
713
+ channel: channelName,
714
+ ...errorAttributes(error)
715
+ });
708
716
  }
709
717
  }
710
718
  for (const { data, id } of replaying ?? [])
@@ -1 +1 @@
1
- {"version":3,"file":"pub-sub.js","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Schema } from '@orpc/contract'\nimport { ORPCError } from '@orpc/server'\nimport type { ZodObject, ZodRawShape, ZodType, z } from 'zod'\nimport type { FnLogger } from '../logger.js'\nimport { errorMessageOf, type SpanLike, type Tracing } from '../otel.js'\nimport type {\n\tGuardOptions,\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tMaybePromise,\n\tProcedureKey,\n\tProcedureOption\n} from '../types.js'\nimport { decodeMessage, encodePayload } from './codec.js'\nimport { LIVE_GAP, positiveInteger, safely, waitFor } from './lifecycle.js'\nimport type {\n\tBacklogOptions,\n\tPubSubMessage,\n\tPubSubTransport\n} from './transport.js'\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n//\n// Publishers pass an event schema's INPUT (`z.input`); subscribers, filters\n// and channel resolvers see its OUTPUT (`z.output`). The raw input travels on\n// the wire and every receiver parses it once.\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Any Zod object schema, including `.strict()`, `.passthrough()` and `.catchall()`. */\nexport type ObjectSchema = ZodObject<ZodRawShape, z.core.$ZodObjectConfig>\n\n/**\n * A static channel name, or one derived from (partial) subscriber input or\n * event data.\n */\nexport type ChannelDefinition<TInput, TEventData, TContext = unknown> =\n\t| string\n\t| {\n\t\t\tsubscribe: (params: { input: TInput; context: TContext }) => string\n\t\t\tpublish: (event: TEventData) => string\n\t }\n\t| ((\n\t\t\tparams: Partial<TInput> | Partial<TEventData>,\n\t\t\tcontext?: TContext\n\t ) => string)\n\n/** Decides whether one event reaches one subscriber. */\nexport type FilterFn<TInput, TEventData> = (params: {\n\tinput: TInput\n\tdata: TEventData\n}) => MaybePromise<boolean>\n\n/**\n * Checked when a subscription opens, before anything is sent. `true` allows\n * everyone; a function returns false (or throws) to refuse with FORBIDDEN.\n */\nexport type AuthFn<TInput, TContext> =\n\t| ((params: { input: TInput; ctx: TContext }) => MaybePromise<boolean>)\n\t| true\n\nexport type PublisherConfig = {\n\t/** Required name for tracing (e.g. 'chat.messages'). */\n\tname: string\n\t/**\n\t * Store recent events in a backlog list; new subscribers receive it before\n\t * live events. Default: false\n\t */\n\tuseBacklog?: boolean\n\t/** Maximum backlog items to keep (default: 50). */\n\tbacklogSize?: number\n\t/** Backlog TTL in seconds (default: 30). */\n\tbacklogTtl?: number\n\t/**\n\t * Also publish every payload to this channel (with its own backlog when\n\t * `useBacklog`). Subscribers still use `channel`. Equal to the primary\n\t * channel means no duplicate work.\n\t */\n\tmirrorChannel?: string\n}\n\n/** Per-definition overrides of the factory queue bounds. */\nexport type ChannelQueueOptions = {\n\tmaxQueueSize?: number\n\tmaxIngressSize?: number\n\tmaxReplaySize?: number\n}\n\n/** Synchronous observational events; failures cannot interrupt delivery. */\nexport type PubSubMetric = { name: string; channel: string } & (\n\t| {\n\t\t\ttype: 'queue'\n\t\t\tstage: 'ingress' | 'replay' | 'delivery'\n\t\t\tdepth: number\n\t\t\tlimit: number\n\t }\n\t| { type: 'drop'; stage: 'ingress' | 'replay' | 'delivery'; count: number }\n\t| { type: 'reconnect' }\n\t| { type: 'parseError'; stage: 'ingress' | 'replay'; error: unknown }\n)\n\nexport type PubSubOptions<\n\tTDef extends FnDefinition,\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef>\n> = PublisherConfig &\n\tChannelQueueOptions & {\n\t\tchannel: ChannelDefinition<\n\t\t\tz.output<TInputSchema>,\n\t\t\tz.output<TEventSchema>,\n\t\t\tFnContext<TDef, TKey>\n\t\t>\n\t\t/** What the subscriber provides. */\n\t\tinputSchema: TInputSchema\n\t\t/** What gets published. */\n\t\teventSchema: TEventSchema\n\t\tfilterFn?: FilterFn<z.output<TInputSchema>, z.output<TEventSchema>>\n\t\tauthFn?: AuthFn<z.output<TInputSchema>, FnContext<TDef, TKey>>\n\t\t/**\n\t\t * When a slow subscriber's queue overflows (drop-oldest), enqueue this\n\t\t * marker INSTEAD of the new event so the subscriber resyncs from its\n\t\t * cursor. A wholly dropped item leaves no per-item gap a consumer could\n\t\t * detect, so the marker is the only reliable live signal of loss. Return\n\t\t * null to skip.\n\t\t */\n\t\toverflowMarker?: (\n\t\t\tinput: z.output<TInputSchema>\n\t\t) => z.output<TEventSchema> | null\n\t\ttags?: TDef['tag'][]\n\t\tsummary?: string\n\t\tdescription?: string\n\t}\n\nexport type PubSub<\n\tTDef extends FnDefinition,\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef>\n> = {\n\tsubscribe: FnProcedure<\n\t\tTDef,\n\t\tTKey,\n\t\tTInputSchema,\n\t\tSchema<\n\t\t\tAsyncGenerator<z.output<TEventSchema>, void, unknown>,\n\t\t\tAsyncGenerator<z.output<TEventSchema>, void, unknown>\n\t\t>\n\t>\n\tpublish: (data: z.input<TEventSchema>) => Promise<void>\n\t/** Publish a batch in one atomic round-trip; items may target different channels. */\n\tpublishMany: (items: readonly z.input<TEventSchema>[]) => Promise<void>\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: z.output<TInputSchema>\n\t\tcontext: FnContext<TDef, TKey>\n\t}) => string\n\tgetPublishChannelName: (event: z.output<TEventSchema>) => string\n\t/** @deprecated Prefer the separate required-input resolver methods. */\n\tgetChannelName: (\n\t\tparams: Partial<z.output<TInputSchema>> | Partial<z.output<TEventSchema>>,\n\t\tcontext?: FnContext<TDef, TKey>\n\t) => string\n}\n\nexport type CreatePubSub<TDef extends FnDefinition> = <\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef> = TDef['default']\n>(\n\toptions: PubSubOptions<TDef, TInputSchema, TEventSchema, NoInfer<TKey>> &\n\t\tGuardOptions<TDef['guards']> &\n\t\tPick<\n\t\t\tFnRouteOptions<TDef, TKey, z.output<TInputSchema>>,\n\t\t\t'meta' | 'guardResolvers'\n\t\t> &\n\t\t/** Which `procedures` builder the subscribe route uses. */ ProcedureOption<\n\t\t\tTDef,\n\t\t\tTKey\n\t\t>\n) => PubSub<TDef, TInputSchema, TEventSchema, TKey>\n\nexport type PublisherOptions<TEventSchema extends ZodType> = PublisherConfig & {\n\t/** Static channel name, or a resolver over (partial) parsed event data. */\n\tchannel: string | ((params: Partial<z.output<TEventSchema>>) => string)\n\teventSchema: TEventSchema\n}\n\nexport type Publisher<TEventSchema extends ZodType> = {\n\tpublish: (data: z.input<TEventSchema>) => Promise<void>\n\tpublishMany: (items: readonly z.input<TEventSchema>[]) => Promise<void>\n\tgetChannelName: (params: Partial<z.output<TEventSchema>>) => string\n}\n\n/**\n * Publish-only counterpart to `createPubSub`, for buses whose subscribe side\n * lives elsewhere (e.g. an `fnLive` route sharing the channel and schema).\n */\nexport type CreatePublisher = <TEventSchema extends ZodType>(\n\toptions: PublisherOptions<TEventSchema>\n) => Publisher<TEventSchema>\n\nexport type PubSubRuntimeOptions = {\n\t/** Queue depths, drops, successful reconnects and parse failures. */\n\tonMetric?: (event: PubSubMetric) => void\n\t/**\n\t * The broker, or a function creating it on first use so importing routes\n\t * opens no connection: `transport: () => bunRedisTransport(getRedis())`.\n\t */\n\ttransport: PubSubTransport | (() => PubSubTransport)\n\t/**\n\t * Called per event dropped from ingress, replay or delivery queues.\n\t * Delivery drops count events before subscriber filtering.\n\t */\n\tonDrop?: (count: number, info: { name: string; channel: string }) => void\n\t/** Per-subscriber queue bound before drop-oldest (default: 1000). */\n\tmaxQueueSize?: number\n\t/** Pending raw messages per channel, before asynchronous parsing. */\n\tmaxIngressSize?: number\n\t/** Buffered live messages during replay. */\n\tmaxReplaySize?: number\n\t/** Broker subscription and backlog wait bound (default 10000ms). */\n\tinitializationTimeoutMs?: number\n\t/** Applied to channels, mirrors and therefore backlog keys. */\n\tnamespace?: string\n\t/** Close this transport only when its ownership is explicitly transferred. */\n\townsTransport?: boolean\n}\n\n/** @internal */\nexport type LiveRuntimeOptions = {\n\tfn: (options: Record<string, unknown>) => import('@orpc/server').AnyProcedure\n\ttracing: Tracing\n\tcreateLogger: (scope: string, span: SpanLike | undefined) => FnLogger\n\tpubsub?: PubSubRuntimeOptions | undefined\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Bounded queue\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Bounded drop-oldest FIFO with \"one overflow marker per overflow episode\"\n * semantics.\n *\n * On the FIRST overflow of an episode the oldest message is dropped and the\n * marker from `createOverflowMarker` is enqueued INSTEAD of the new event - the\n * subscriber's resync-from-cursor recovers the loss. While that marker is still\n * queued, further overflows drop the oldest NON-marker message (the marker\n * itself is never displaced) and enqueue the new event WITHOUT a second marker:\n * the pending marker's resync already covers every drop that happens before it\n * is delivered. Without this dedupe a sustained overflow converges the whole\n * queue to markers - one full snapshot re-run per queued slot. Dequeuing the\n * marker ends the episode; the next overflow starts a fresh one.\n *\n * `createOverflowMarker` absent (or returning null) falls back to plain\n * drop-oldest with the new event enqueued.\n */\nexport function createBoundedEventQueue<T>(opts: {\n\tmaxSize: number\n\tcreateOverflowMarker?: () => T | null\n\t/** Called once per dropped message (metrics/counters). */\n\tonDrop?: () => void\n\tonDepth?: (depth: number) => void\n}) {\n\tpositiveInteger(opts.maxSize, 'maxSize')\n\tconst items: T[] = []\n\t// The queued marker while an overflow episode is open. Created once per\n\t// episode, so identity is the exact \"is this the pending marker?\" test.\n\tlet pendingOverflowMarker: T | null = null\n\n\treturn {\n\t\tget length() {\n\t\t\treturn items.length\n\t\t},\n\t\tenqueue(data: T): void {\n\t\t\ttry {\n\t\t\t\tif (items.length >= opts.maxSize) {\n\t\t\t\t\tif (pendingOverflowMarker !== null) {\n\t\t\t\t\t\t// Episode already signalled: drop the oldest non-marker message\n\t\t\t\t\t\t// and enqueue WITHOUT a second marker.\n\t\t\t\t\t\tconst dropIndex = items[0] === pendingOverflowMarker ? 1 : 0\n\t\t\t\t\t\tif (dropIndex >= items.length) {\n\t\t\t\t\t\t\t// Degenerate maxSize: the queue is just the pending marker, so\n\t\t\t\t\t\t\t// the new event is the drop - the marker's resync covers it.\n\t\t\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems.splice(dropIndex, 1)\n\t\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\t\titems.push(data)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\titems.shift()\n\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\tconst marker = opts.createOverflowMarker?.() ?? null\n\t\t\t\t\tif (marker !== null) {\n\t\t\t\t\t\tpendingOverflowMarker = marker\n\t\t\t\t\t\titems.push(marker)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titems.push(data)\n\t\t\t} finally {\n\t\t\t\tsafely(() => opts.onDepth?.(items.length))\n\t\t\t}\n\t\t},\n\t\tdequeue(): T | undefined {\n\t\t\tconst next = items.shift()\n\t\t\tsafely(() => opts.onDepth?.(items.length))\n\t\t\tif (next !== undefined && next === pendingOverflowMarker) {\n\t\t\t\tpendingOverflowMarker = null\n\t\t\t}\n\t\t\treturn next\n\t\t}\n\t}\n}\n\n/**\n * One subscriber's ordered, bounded delivery. Events wait in a bounded\n * drop-oldest queue (see {@link createBoundedEventQueue}) BEFORE the\n * subscriber's filter runs; the filter runs in order as the consumer reads,\n * so a slow async filter neither reorders events nor lets pending work grow\n * past `maxSize`. Overflow markers skip the filter.\n */\nexport function createSubscriberDelivery<T>(options: {\n\tmaxSize: number\n\taccept?: ((data: T) => MaybePromise<boolean>) | undefined\n\toverflowMarker?: (() => T | null) | undefined\n\tonFilterError: (error: unknown) => void\n\tonDrop: () => void\n\tonDepth?: (depth: number) => void\n}) {\n\ttype Item = { data: T; marker: boolean }\n\tconst queue = createBoundedEventQueue<Item>({\n\t\tmaxSize: options.maxSize,\n\t\tcreateOverflowMarker: () => {\n\t\t\tconst marker = options.overflowMarker?.() ?? null\n\t\t\treturn marker === null ? null : { data: marker, marker: true }\n\t\t},\n\t\tonDrop: options.onDrop,\n\t\t...(options.onDepth ? { onDepth: options.onDepth } : {})\n\t})\n\tlet closed = false\n\tlet failure: unknown\n\tlet wake: (() => void) | null = null\n\tconst notify = () => {\n\t\twake?.()\n\t\twake = null\n\t}\n\n\tasync function* events(): AsyncGenerator<T, void, unknown> {\n\t\twhile (!closed) {\n\t\t\tconst item = queue.dequeue()\n\t\t\tif (!item) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\twake = resolve\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!item.marker && options.accept) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.accept(item.data))) continue\n\t\t\t\t} catch (error) {\n\t\t\t\t\tsafely(() => options.onFilterError(error))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (closed) break\n\t\t\t}\n\t\t\tyield item.data\n\t\t}\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\treturn {\n\t\tpush(data: T, marker = false) {\n\t\t\tif (closed) return\n\t\t\tqueue.enqueue({ data, marker })\n\t\t\tnotify()\n\t\t},\n\t\tevents: events(),\n\t\t/** Stop delivering; a parked read ends at once. */\n\t\tclose(error?: unknown) {\n\t\t\tif (closed) return\n\t\t\tfailure = error\n\t\t\tclosed = true\n\t\t\tsafely(() => options.onDepth?.(0))\n\t\t\tnotify()\n\t\t}\n\t}\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Runtime (internal: the typed surface is what `createFn` returns)\n// ═══════════════════════════════════════════════════════════════════════════\n\nconst DEFAULT_MAX_QUEUE_SIZE = 1000\n\n// Exponential resubscribe backoff with jitter so reconnecting subscribers don't stampede the broker.\nconst RESUBSCRIBE_BASE_DELAY_MS = 1000\nconst RESUBSCRIBE_MAX_DELAY_MS = 30_000\nconst RESUBSCRIBE_MAX_JITTER_MS = 250\n\nfunction getResubscribeDelayMs(attempt: number): number {\n\tconst base = Math.min(\n\t\tRESUBSCRIBE_BASE_DELAY_MS * 2 ** attempt,\n\t\tRESUBSCRIBE_MAX_DELAY_MS\n\t)\n\treturn base + Math.floor(Math.random() * RESUBSCRIBE_MAX_JITTER_MS)\n}\n\ntype Input = Record<string, unknown>\n\ntype LocalSubscriber = {\n\tisActive: () => boolean\n\tpush: (data: unknown, id?: string) => void\n\tgap: () => void\n\tfail: (error: unknown) => void\n}\n\ntype Hub = {\n\tsubscribers: Set<LocalSubscriber>\n\t/** Resolves after a successful broker subscription (or closure). */\n\tready: Promise<void>\n\tclose: () => void\n}\n\n/** An open subscription: registered, authorized and subscribed. */\nexport type LiveSubscription = {\n\t/** Live events, after the backlog replay. Ends when closed or aborted. */\n\tevents: AsyncGenerator<unknown, void, unknown>\n\t/** Release everything; safe to call more than once, and before `events` runs. */\n\tclose: () => void\n\tisClosed: () => boolean\n}\n\n/** @internal Untyped options; `PubSubOptions` is the typed surface. */\nexport type ChannelOptions = PublisherConfig &\n\tChannelQueueOptions & {\n\t\tchannel: ChannelDefinition<Input, unknown>\n\t\teventSchema: ZodType\n\t\tfilterFn?: FilterFn<Input, unknown>\n\t\tauthFn?: AuthFn<Input, unknown>\n\t\toverflowMarker?: (input: Input) => unknown\n\t}\n\n/** @internal */\nexport type Channel = {\n\t/** Authorize and subscribe; resolves once events can be delivered. */\n\topen: (options: {\n\t\tinput: Input\n\t\tcontext: unknown\n\t\tsignal: AbortSignal | undefined\n\t\trecoverGaps?: boolean\n\t}) => Promise<LiveSubscription>\n\tpublish: (data: unknown) => Promise<void>\n\tpublishMany: (items: readonly unknown[]) => Promise<void>\n\tgetChannelName: (params: Input, context?: unknown) => string\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: Input\n\t\tcontext: unknown\n\t}) => string\n\tgetPublishChannelName: (event: Input) => string\n}\n\nconst resolveChannel = (\n\tchannel: ChannelDefinition<Input, unknown>,\n\tparams: Input,\n\tcontext?: unknown,\n\tpublishing = false\n) => {\n\tif (typeof channel === 'string') return channel\n\tif (typeof channel === 'function') return channel(params, context)\n\treturn publishing\n\t\t? channel.publish(params)\n\t\t: channel.subscribe({ input: params, context })\n}\n\n/** @internal */\nexport function createLiveRuntime(options: LiveRuntimeOptions) {\n\tconst { tracing, createLogger } = options\n\tconst logger = createLogger('pubsub', undefined)\n\tlet terminated = false\n\tlet shutdownPromise: Promise<void> | undefined\n\tconst releases = new Set<Promise<void>>()\n\tconst pendingInitialization = new Set<() => void>()\n\tconst pendingOpens = new Set<Promise<LiveSubscription>>()\n\tconst defaultMaxQueue = positiveInteger(\n\t\toptions.pubsub?.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n\t\t'maxQueueSize'\n\t)\n\tconst defaultMaxIngress = positiveInteger(\n\t\toptions.pubsub?.maxIngressSize ?? defaultMaxQueue,\n\t\t'maxIngressSize'\n\t)\n\tconst defaultMaxReplay = positiveInteger(\n\t\toptions.pubsub?.maxReplaySize ?? defaultMaxQueue,\n\t\t'maxReplaySize'\n\t)\n\tconst initializationTimeout = positiveInteger(\n\t\toptions.pubsub?.initializationTimeoutMs ?? 10000,\n\t\t'initializationTimeoutMs'\n\t)\n\tconst metric = (event: PubSubMetric) =>\n\t\tsafely(() => options.pubsub?.onMetric?.(event))\n\tconst namespace = options.pubsub?.namespace\n\tconst qualify = (name: string) => (namespace ? `${namespace}:${name}` : name)\n\tconst assertOpen = () => {\n\t\tif (terminated)\n\t\t\tthrow new ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\tmessage: 'Live runtime has shut down'\n\t\t\t})\n\t}\n\tconst releaseTransport = (release: (() => Promise<void>) | null) => {\n\t\tif (!release) return\n\t\tconst task = Promise.resolve(release()).catch((error) => {\n\t\t\tlogger.warn('Failed to release subscription', {\n\t\t\t\terror: errorMessageOf(error)\n\t\t\t})\n\t\t})\n\t\treleases.add(task)\n\t\tvoid task.finally(() => releases.delete(task))\n\t}\n\n\t// Deploy drain: every open subscription registers its close here. On\n\t// SIGTERM the app ends them deliberately instead of letting the socket die\n\t// with the process: the generator returns, oRPC closes the SSE response and\n\t// the client's backoff reconnects to the new deployment.\n\tconst activeSubscriberCleanups = new Set<() => void>()\n\n\tlet transport: PubSubTransport | undefined\n\tconst requireTransport = () => {\n\t\tif (!options.pubsub) {\n\t\t\tthrow new Error(\n\t\t\t\t'orpc-fn: live routes need a transport, pass createFn({ pubsub: { transport } })'\n\t\t\t)\n\t\t}\n\t\tif (transport) return transport\n\t\t// A lazy transport is never created during or after shutdown.\n\t\tassertOpen()\n\t\tconst configured = options.pubsub.transport\n\t\ttransport = typeof configured === 'function' ? configured() : configured\n\t\treturn transport\n\t}\n\n\t/**\n\t * Shared publish pipeline: validate the raw event, resolve the channel from\n\t * the parsed event, then publish the raw event (atomically maintaining the\n\t * backlog when enabled) inside a producer span.\n\t */\n\tfunction createChannelPublisher(\n\t\tconfig: PublisherConfig & {\n\t\t\teventSchema: ZodType\n\t\t\tgetChannelName: (data: Input) => string\n\t\t}\n\t) {\n\t\tconst { name, eventSchema, getChannelName } = config\n\t\tconst mirrorChannel = config.mirrorChannel\n\t\t\t? qualify(config.mirrorChannel)\n\t\t\t: undefined\n\t\tif (config.backlogSize !== undefined)\n\t\t\tpositiveInteger(config.backlogSize, 'backlogSize')\n\t\tif (config.backlogTtl !== undefined)\n\t\t\tpositiveInteger(config.backlogTtl, 'backlogTtl')\n\t\tconst backlog: BacklogOptions | undefined = config.useBacklog\n\t\t\t? { size: config.backlogSize ?? 50, ttlSeconds: config.backlogTtl ?? 30 }\n\t\t\t: undefined\n\n\t\tconst toMessages = async (items: readonly unknown[]) => {\n\t\t\tconst messages: PubSubMessage[] = []\n\t\t\tfor (const item of items) {\n\t\t\t\tconst data = (await eventSchema.parseAsync(item)) as Input\n\t\t\t\tconst channel = getChannelName(data)\n\t\t\t\tconst payload = encodePayload(item)\n\t\t\t\tmessages.push({ channel, payload })\n\t\t\t\tif (mirrorChannel && mirrorChannel !== channel) {\n\t\t\t\t\tmessages.push({ channel: mirrorChannel, payload })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn messages\n\t\t}\n\n\t\tconst send = (\n\t\t\toperation: 'publish' | 'publishMany',\n\t\t\titems: readonly unknown[]\n\t\t) =>\n\t\t\ttracing.inSpan(`${name}:${operation}`, 'PRODUCER', async (span) => {\n\t\t\t\tassertOpen()\n\t\t\t\tconst startTime = performance.now()\n\t\t\t\ttry {\n\t\t\t\t\tspan?.setAttribute('pubsub.operation', operation)\n\t\t\t\t\tspan?.setAttribute('pubsub.name', name)\n\t\t\t\t\tspan?.setAttribute('pubsub.batch_size', items.length)\n\t\t\t\t\tconst messages = await toMessages(items)\n\t\t\t\t\tconst first = messages[0]\n\t\t\t\t\tif (first) {\n\t\t\t\t\t\tspan?.setAttribute('pubsub.channel', first.channel)\n\t\t\t\t\t\tspan?.setAttribute('pubsub.payload_size', first.payload.length)\n\t\t\t\t\t}\n\t\t\t\t\tawait requireTransport().publish(messages, backlog)\n\t\t\t\t} finally {\n\t\t\t\t\tspan?.setAttribute(\n\t\t\t\t\t\t'pubsub.duration_ms',\n\t\t\t\t\t\tperformance.now() - startTime\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\n\t\treturn {\n\t\t\tpublish: (data: unknown) => send('publish', [data]),\n\t\t\tpublishMany: async (items: readonly unknown[]) => {\n\t\t\t\tif (items.length > 0) await send('publishMany', items)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Hubs for one pub/sub definition, keyed by channel. Many subscribers can\n\t * share a channel (an org with many open tabs); one hub decodes and parses\n\t * each payload once and fans the event out to every local subscriber,\n\t * applying each subscriber's own filter. The hub also owns the broker\n\t * subscription and its resubscribe backoff.\n\t */\n\tfunction createChannelHubs(config: {\n\t\teventSchema: ZodType\n\t\tname: string\n\t\tmaxIngress: number\n\t}) {\n\t\tconst { eventSchema } = config\n\t\tconst hubs = new Map<string, Hub>()\n\n\t\tconst createHub = (channel: string): Hub => {\n\t\t\tconst subscribers = new Set<LocalSubscriber>()\n\t\t\tlet closed = false\n\t\t\tlet unsubscribe: (() => Promise<void>) | null = null\n\t\t\tlet attempt = 0\n\t\t\tlet timer: ReturnType<typeof setTimeout> | null = null\n\t\t\tlet markReady = () => {}\n\t\t\tlet connectedOnce = false\n\t\t\tlet connected = false\n\t\t\tlet ready: Promise<void>\n\t\t\tconst markPending = () => {\n\t\t\t\tready = new Promise<void>((resolve) => {\n\t\t\t\t\tmarkReady = resolve\n\t\t\t\t})\n\t\t\t}\n\t\t\tmarkPending()\n\n\t\t\tlet parsing = false\n\t\t\tconst ingress = createBoundedEventQueue<string>({\n\t\t\t\tmaxSize: config.maxIngress,\n\t\t\t\tonDepth: (depth) =>\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tlimit: config.maxIngress,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t}),\n\t\t\t\tonDrop: () => {\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t})\n\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name: config.name, channel })\n\t\t\t\t\t)\n\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst parsePending = async () => {\n\t\t\t\tif (parsing) return\n\t\t\t\tparsing = true\n\t\t\t\ttry {\n\t\t\t\t\twhile (!closed) {\n\t\t\t\t\t\tconst raw = ingress.dequeue()\n\t\t\t\t\t\tif (raw === undefined) break\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst message = decodeMessage(raw)\n\t\t\t\t\t\t\tconst parsed = await eventSchema.parseAsync(message.value)\n\t\t\t\t\t\t\tif (closed) break\n\t\t\t\t\t\t\tfor (const sub of [...subscribers])\n\t\t\t\t\t\t\t\tif (sub.isActive()) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsub.push(parsed, message.id)\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\t\ttype: 'parseError',\n\t\t\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\t\t\tchannel\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tlogger.warn(`Dropped malformed message on ${channel}`, {\n\t\t\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tparsing = false\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst release = releaseTransport\n\n\t\t\tconst scheduleResubscribe = (reason: string) => {\n\t\t\t\tif (closed || timer) return\n\t\t\t\tconst delayMs = getResubscribeDelayMs(attempt)\n\t\t\t\tattempt++\n\t\t\t\tlogger.warn(`Scheduling resubscribe for ${channel}`, {\n\t\t\t\t\treason,\n\t\t\t\t\tattempt,\n\t\t\t\t\tdelayMs\n\t\t\t\t})\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = null\n\t\t\t\t\tif (closed) return\n\t\t\t\t\trelease(unsubscribe)\n\t\t\t\t\tunsubscribe = null\n\t\t\t\t\tvoid connect()\n\t\t\t\t}, delayMs)\n\t\t\t}\n\n\t\t\tconst connect = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst next = await requireTransport().subscribe(\n\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t(raw) => {\n\t\t\t\t\t\t\tif (closed) return\n\t\t\t\t\t\t\tingress.enqueue(raw)\n\t\t\t\t\t\t\tvoid parsePending()\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\tif (connected) {\n\t\t\t\t\t\t\t\tconnected = false\n\t\t\t\t\t\t\t\tmarkPending()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlogger.error(`Subscription to ${channel} lost`, {\n\t\t\t\t\t\t\t\terror: error.message\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tscheduleResubscribe('lost')\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonReconnect: () => {\n\t\t\t\t\t\t\t\tif (closed) return\n\t\t\t\t\t\t\t\tmetric({ type: 'reconnect', name: config.name, channel })\n\t\t\t\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\tif (closed) return release(next)\n\t\t\t\t\tunsubscribe = next\n\t\t\t\t\tconnected = true\n\t\t\t\t\tif (connectedOnce) {\n\t\t\t\t\t\tmetric({ type: 'reconnect', name: config.name, channel })\n\t\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconnectedOnce = true\n\t\t\t\t\tmarkReady()\n\t\t\t\t\tattempt = 0\n\t\t\t\t\tlogger.info(`Subscribed to ${channel}`)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(`Failed to subscribe to ${channel}`, {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t\t\t\tscheduleResubscribe('subscribe-failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid connect()\n\n\t\t\treturn {\n\t\t\t\tsubscribers,\n\t\t\t\tget ready() {\n\t\t\t\t\treturn ready\n\t\t\t\t},\n\t\t\t\tclose: () => {\n\t\t\t\t\tclosed = true\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tlimit: config.maxIngress,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t})\n\t\t\t\t\tif (timer) clearTimeout(timer)\n\t\t\t\t\ttimer = null\n\t\t\t\t\tmarkReady()\n\t\t\t\t\trelease(unsubscribe)\n\t\t\t\t\tunsubscribe = null\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn function addLocalSubscriber(\n\t\t\tchannel: string,\n\t\t\tsubscriber: LocalSubscriber\n\t\t) {\n\t\t\tlet hub = hubs.get(channel)\n\t\t\tif (!hub) {\n\t\t\t\thub = createHub(channel)\n\t\t\t\thubs.set(channel, hub)\n\t\t\t}\n\t\t\thub.subscribers.add(subscriber)\n\t\t\tconst current = hub\n\t\t\treturn {\n\t\t\t\tready: current.ready,\n\t\t\t\tremove: () => {\n\t\t\t\t\tcurrent.subscribers.delete(subscriber)\n\t\t\t\t\tif (current.subscribers.size === 0 && hubs.get(channel) === current) {\n\t\t\t\t\t\tcurrent.close()\n\t\t\t\t\t\thubs.delete(channel)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Publish and open subscriptions on one channel definition. */\n\tfunction createChannel(channelOptions: ChannelOptions): Channel {\n\t\tconst {\n\t\t\tname,\n\t\t\tchannel,\n\t\t\teventSchema,\n\t\t\tfilterFn,\n\t\t\tauthFn,\n\t\t\toverflowMarker,\n\t\t\tuseBacklog = false\n\t\t} = channelOptions\n\n\t\tconst getChannelName = (params: Input, context?: unknown) =>\n\t\t\tqualify(resolveChannel(channel, params, context))\n\t\tconst getPublishChannel = (params: Input) =>\n\t\t\tqualify(resolveChannel(channel, params, undefined, true))\n\t\tconst maxQueue = positiveInteger(\n\t\t\tchannelOptions.maxQueueSize ?? defaultMaxQueue,\n\t\t\t'maxQueueSize'\n\t\t)\n\t\tconst maxIngress = positiveInteger(\n\t\t\tchannelOptions.maxIngressSize ?? defaultMaxIngress,\n\t\t\t'maxIngressSize'\n\t\t)\n\t\tconst maxReplay = positiveInteger(\n\t\t\tchannelOptions.maxReplaySize ?? defaultMaxReplay,\n\t\t\t'maxReplaySize'\n\t\t)\n\t\tconst addLocalSubscriber = createChannelHubs({\n\t\t\teventSchema,\n\t\t\tname,\n\t\t\tmaxIngress\n\t\t})\n\n\t\tconst openInternal: Channel['open'] = async ({\n\t\t\tinput,\n\t\t\tcontext,\n\t\t\tsignal,\n\t\t\trecoverGaps = false\n\t\t}) => {\n\t\t\tassertOpen()\n\t\t\tsignal?.throwIfAborted()\n\t\t\tconst initializing = new AbortController()\n\t\t\tconst transport = requireTransport()\n\t\t\tconst channelName = getChannelName(input, context)\n\t\t\tconst startTime = performance.now()\n\t\t\tconst span = tracing.startSpan(`${name}:subscribe`, 'SERVER', {\n\t\t\t\t'pubsub.channel': channelName,\n\t\t\t\t'pubsub.operation': 'subscribe',\n\t\t\t\t'pubsub.name': name\n\t\t\t})\n\t\t\tconst subscriberLogger = createLogger('pubsub', span)\n\t\t\tconst cancelInitialization = () =>\n\t\t\t\tinitializing.abort(\n\t\t\t\t\tsignal?.reason ?? new Error('Subscription initialization stopped')\n\t\t\t\t)\n\t\t\tpendingInitialization.add(cancelInitialization)\n\t\t\tsignal?.addEventListener('abort', cancelInitialization, { once: true })\n\t\t\tconst finishInitialization = () => {\n\t\t\t\tpendingInitialization.delete(cancelInitialization)\n\t\t\t\tsignal?.removeEventListener('abort', cancelInitialization)\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tauthFn !== undefined &&\n\t\t\t\t\tauthFn !== true &&\n\t\t\t\t\t!(await waitFor(\n\t\t\t\t\t\tPromise.resolve(authFn({ input, ctx: context })),\n\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t))\n\t\t\t\t) {\n\t\t\t\t\tthrow new ORPCError('FORBIDDEN', {\n\t\t\t\t\t\tmessage: 'You do not have access to this subscription'\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tfinishInitialization()\n\t\t\t\ttracing.end(span, error)\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tsubscriberLogger.info(`Subscribing to ${channelName}`)\n\n\t\t\tlet messageCount = 0\n\t\t\tlet droppedCount = 0\n\t\t\tconst delivery = createSubscriberDelivery<unknown>({\n\t\t\t\tmaxSize: maxQueue,\n\t\t\t\tonDepth: (depth) =>\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'delivery',\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tlimit: maxQueue,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t}),\n\t\t\t\taccept:\n\t\t\t\t\tfilterFn &&\n\t\t\t\t\t((data) => (data === LIVE_GAP ? true : filterFn({ input, data }))),\n\t\t\t\toverflowMarker: recoverGaps\n\t\t\t\t\t? () => LIVE_GAP\n\t\t\t\t\t: overflowMarker && (() => overflowMarker(input)),\n\t\t\t\tonFilterError: (error) =>\n\t\t\t\t\tsubscriberLogger.error('Error processing message', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t}),\n\t\t\t\tonDrop: () => {\n\t\t\t\t\tdroppedCount++\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tstage: 'delivery',\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t})\n\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name, channel: channelName })\n\t\t\t\t\t)\n\t\t\t\t\tif (!recoverGaps && !overflowMarker)\n\t\t\t\t\t\tqueueMicrotask(() =>\n\t\t\t\t\t\t\tclose(\n\t\t\t\t\t\t\t\tnew ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\t\t\t\tmessage: 'Subscription queue overflow; reconnect and resync'\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tlet replaying: Array<{ data: unknown; id: string | undefined }> | null =\n\t\t\t\tuseBacklog ? [] : null\n\t\t\tlet replayGap = false\n\t\t\tconst seen = new Set<string>()\n\t\t\tconst dedupe = (id: string | undefined) => {\n\t\t\t\tif (!id) return false\n\t\t\t\tif (seen.has(id)) return true\n\t\t\t\tseen.add(id)\n\t\t\t\tif (\n\t\t\t\t\tseen.size >\n\t\t\t\t\tMath.max(maxReplay, maxQueue, channelOptions.backlogSize ?? 50) * 2\n\t\t\t\t)\n\t\t\t\t\tseen.delete(seen.values().next().value as string)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst push = (data: unknown, id?: string) => {\n\t\t\t\tmessageCount++\n\t\t\t\tif (replaying) {\n\t\t\t\t\tif (replaying.length >= maxReplay) {\n\t\t\t\t\t\treplaying.shift()\n\t\t\t\t\t\treplayGap = true\n\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t\t})\n\t\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name, channel: channelName })\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treplaying.push({ data, id })\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\tdepth: replaying.length,\n\t\t\t\t\t\tlimit: maxReplay,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t})\n\t\t\t\t} else if (!dedupe(id)) delivery.push(data)\n\t\t\t}\n\t\t\tconst gap = () => {\n\t\t\t\tif (replaying) {\n\t\t\t\t\treplayGap = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (recoverGaps) delivery.push(LIVE_GAP)\n\t\t\t\telse if (overflowMarker) {\n\t\t\t\t\tconst marker = overflowMarker(input)\n\t\t\t\t\tif (marker !== null) delivery.push(marker, true)\n\t\t\t\t} else\n\t\t\t\t\tclose(\n\t\t\t\t\t\tnew ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\t\tmessage: 'Subscription lost events; reconnect and resync'\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t}\n\n\t\t\t// The one way a subscription ends, whatever ends it: abort, drain, the\n\t\t\t// stream finishing, or `close()`. Releases everything at once, even\n\t\t\t// while the stream is parked or not yet read.\n\t\t\tlet closed = false\n\t\t\tconst close = (...error: [] | [unknown]) => {\n\t\t\t\tif (closed) return\n\t\t\t\tclosed = true\n\t\t\t\tinitializing.abort(error[0] ?? new Error('Subscription closed'))\n\t\t\t\tdelivery.close(error[0])\n\t\t\t\tactiveSubscriberCleanups.delete(stop)\n\t\t\t\tsignal?.removeEventListener('abort', stop)\n\t\t\t\tlocal.remove()\n\t\t\t\tconst durationMs = performance.now() - startTime\n\t\t\t\tspan?.setAttribute('pubsub.duration_ms', durationMs)\n\t\t\t\tspan?.setAttribute('pubsub.message_count', messageCount)\n\t\t\t\tspan?.setAttribute('pubsub.dropped_count', droppedCount)\n\t\t\t\ttracing.end(span, ...error)\n\t\t\t\tsubscriberLogger.info(`Unsubscribed from ${channelName}`, {\n\t\t\t\t\tmessageCount,\n\t\t\t\t\tdroppedCount,\n\t\t\t\t\tdurationMs: Math.round(durationMs)\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst stop = () => close()\n\t\t\tconst local = addLocalSubscriber(channelName, {\n\t\t\t\tisActive: () => !closed,\n\t\t\t\tpush,\n\t\t\t\tgap,\n\t\t\t\tfail: (error) => close(error)\n\t\t\t})\n\t\t\tactiveSubscriberCleanups.add(stop)\n\t\t\tsignal?.addEventListener('abort', stop)\n\t\t\tif (signal?.aborted) close()\n\n\t\t\ttry {\n\t\t\t\tawait waitFor(local.ready, initializationTimeout, initializing.signal)\n\t\t\t\tif (replaying && !closed) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = await waitFor(\n\t\t\t\t\t\t\ttransport.readBacklog(channelName),\n\t\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t\t)\n\t\t\t\t\t\tspan?.setAttribute('pubsub.backlog_count', items.length)\n\t\t\t\t\t\tfor (const raw of items.slice(-maxReplay)) {\n\t\t\t\t\t\t\tif (closed) break\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst message = decodeMessage(raw)\n\t\t\t\t\t\t\t\tif (!dedupe(message.id)) {\n\t\t\t\t\t\t\t\t\tmessageCount++\n\t\t\t\t\t\t\t\t\tdelivery.push(\n\t\t\t\t\t\t\t\t\t\tawait waitFor(\n\t\t\t\t\t\t\t\t\t\t\teventSchema.parseAsync(message.value),\n\t\t\t\t\t\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\t\t\ttype: 'parseError',\n\t\t\t\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t/* Malformed backlog entries are skipped. */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (items.length > maxReplay) replayGap = true\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treplayGap = true\n\t\t\t\t\t\tsubscriberLogger.warn(\n\t\t\t\t\t\t\t`Failed to replay backlog for ${channelName}`,\n\t\t\t\t\t\t\t{ error: errorMessageOf(error) }\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const { data, id } of replaying ?? [])\n\t\t\t\t\tif (!dedupe(id)) delivery.push(data)\n\t\t\t\treplaying = null\n\t\t\t\tmetric({\n\t\t\t\t\ttype: 'queue',\n\t\t\t\t\tstage: 'replay',\n\t\t\t\t\tdepth: 0,\n\t\t\t\t\tlimit: maxReplay,\n\t\t\t\t\tname,\n\t\t\t\t\tchannel: channelName\n\t\t\t\t})\n\t\t\t\tif (replayGap && !closed) gap()\n\t\t\t} catch (error) {\n\t\t\t\tif (!closed) {\n\t\t\t\t\tclose(error)\n\t\t\t\t\tthrow new ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\tmessage: 'Unable to establish subscription',\n\t\t\t\t\t\tcause: error\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tfinishInitialization()\n\t\t\t}\n\n\t\t\tasync function* events() {\n\t\t\t\ttry {\n\t\t\t\t\tyield* delivery.events\n\t\t\t\t} finally {\n\t\t\t\t\tclose()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { events: events(), close: () => close(), isClosed: () => closed }\n\t\t}\n\n\t\tconst { publish, publishMany } = createChannelPublisher({\n\t\t\t...channelOptions,\n\t\t\tgetChannelName: getPublishChannel\n\t\t})\n\n\t\tconst open: Channel['open'] = (params) => {\n\t\t\tconst task = openInternal(params)\n\t\t\tpendingOpens.add(task)\n\t\t\tvoid task.then(\n\t\t\t\t() => pendingOpens.delete(task),\n\t\t\t\t() => pendingOpens.delete(task)\n\t\t\t)\n\t\t\treturn task\n\t\t}\n\t\treturn {\n\t\t\topen,\n\t\t\tpublish,\n\t\t\tpublishMany,\n\t\t\tgetChannelName,\n\t\t\tgetSubscriptionChannelName: ({ input, context }) =>\n\t\t\t\tgetChannelName(input, context),\n\t\t\tgetPublishChannelName: getPublishChannel\n\t\t}\n\t}\n\n\tfunction createPubSub(\n\t\tpubsubOptions: ChannelOptions & {\n\t\t\tinputSchema: ZodType\n\t\t\tprocedure?: string\n\t\t\ttags?: string[]\n\t\t\tsummary?: string\n\t\t\tdescription?: string\n\t\t}\n\t) {\n\t\tconst { name } = pubsubOptions\n\t\tconst channel = createChannel(pubsubOptions)\n\n\t\tconst {\n\t\t\tchannel: _channel,\n\t\t\teventSchema: _eventSchema,\n\t\t\tinputSchema,\n\t\t\tfilterFn: _filterFn,\n\t\t\tauthFn: _authFn,\n\t\t\toverflowMarker: _overflowMarker,\n\t\t\tuseBacklog: _useBacklog,\n\t\t\tbacklogSize: _backlogSize,\n\t\t\tbacklogTtl: _backlogTtl,\n\t\t\tmirrorChannel: _mirrorChannel,\n\t\t\tmaxQueueSize: _maxQueueSize,\n\t\t\tmaxIngressSize: _maxIngressSize,\n\t\t\tmaxReplaySize: _maxReplaySize,\n\t\t\t...routeOptions\n\t\t} = pubsubOptions\n\t\tconst subscribe = options.fn({\n\t\t\t...routeOptions,\n\t\t\tname,\n\t\t\tstream: true,\n\t\t\tmethod: 'GET',\n\t\t\tinput: inputSchema,\n\t\t\tsummary: pubsubOptions.summary ?? `Subscribe to ${name}`,\n\t\t\thandler: async function* ({\n\t\t\t\tinput,\n\t\t\t\tcontext,\n\t\t\t\tsignal\n\t\t\t}: {\n\t\t\t\tinput: Input\n\t\t\t\tcontext: unknown\n\t\t\t\tsignal: AbortSignal | undefined\n\t\t\t}) {\n\t\t\t\tyield* (await channel.open({ input, context, signal })).events\n\t\t\t}\n\t\t})\n\n\t\tconst { publish, publishMany, getChannelName } = channel\n\t\treturn {\n\t\t\tsubscribe,\n\t\t\tpublish,\n\t\t\tpublishMany,\n\t\t\tgetChannelName,\n\t\t\tgetSubscriptionChannelName: channel.getSubscriptionChannelName,\n\t\t\tgetPublishChannelName: channel.getPublishChannelName\n\t\t}\n\t}\n\n\tfunction createPublisher(publisherOptions: PublisherOptions<ZodType>) {\n\t\tconst getChannelName = (params: Input) =>\n\t\t\tqualify(resolveChannel(publisherOptions.channel, params, undefined, true))\n\t\tconst { publish, publishMany } = createChannelPublisher({\n\t\t\t...publisherOptions,\n\t\t\tgetChannelName\n\t\t})\n\t\treturn { publish, publishMany, getChannelName }\n\t}\n\n\treturn {\n\t\tcreateChannel,\n\t\tshutdown: () => {\n\t\t\tif (shutdownPromise) return shutdownPromise\n\t\t\tterminated = true\n\t\t\tfor (const cancel of [...pendingInitialization]) safely(cancel)\n\t\t\tfor (const cleanup of [...activeSubscriberCleanups]) safely(cleanup)\n\t\t\tshutdownPromise = (async () => {\n\t\t\t\tawait Promise.allSettled([...pendingOpens])\n\t\t\t\tawait Promise.all([...releases])\n\t\t\t\tif (options.pubsub?.ownsTransport) await transport?.close?.()\n\t\t\t})()\n\t\t\treturn shutdownPromise\n\t\t},\n\t\tcreatePubSub,\n\t\tcreatePublisher,\n\t\t/** Open subscriptions of this instance (drain progress, gauges). */\n\t\tactivePubSubSubscriberCount: () => activeSubscriberCleanups.size,\n\t\t/** End every open subscription; returns how many were closed. */\n\t\tdrainPubSubSubscribers: () => {\n\t\t\tconst cleanups = [...activeSubscriberCleanups]\n\t\t\tactiveSubscriberCleanups.clear()\n\t\t\tfor (const cleanup of cleanups) {\n\t\t\t\ttry {\n\t\t\t\t\tcleanup()\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// A failed cleanup must not stop the drain.\n\t\t\t\t\tlogger.warn('Subscriber cleanup failed during drain', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cleanups.length\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"pub-sub.js","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Schema } from '@orpc/contract'\nimport { ORPCError } from '@orpc/server'\nimport type { ZodObject, ZodRawShape, ZodType, z } from 'zod'\nimport type { FnLogger } from '../logger.js'\nimport {\n\terrorAttributes,\n\terrorMessageOf,\n\ttype SpanLike,\n\ttype Tracing\n} from '../otel.js'\nimport type {\n\tGuardOptions,\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tMaybePromise,\n\tProcedureKey,\n\tProcedureOption\n} from '../types.js'\nimport { decodeMessage, encodePayload } from './codec.js'\nimport { LIVE_GAP, positiveInteger, safely, waitFor } from './lifecycle.js'\nimport type {\n\tBacklogOptions,\n\tPubSubMessage,\n\tPubSubTransport\n} from './transport.js'\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n//\n// Publishers pass an event schema's INPUT (`z.input`); subscribers, filters\n// and channel resolvers see its OUTPUT (`z.output`). The raw input travels on\n// the wire and every receiver parses it once.\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** Any Zod object schema, including `.strict()`, `.passthrough()` and `.catchall()`. */\nexport type ObjectSchema = ZodObject<ZodRawShape, z.core.$ZodObjectConfig>\n\n/**\n * A static channel name, or one derived from (partial) subscriber input or\n * event data.\n */\nexport type ChannelDefinition<TInput, TEventData, TContext = unknown> =\n\t| string\n\t| {\n\t\t\tsubscribe: (params: { input: TInput; context: TContext }) => string\n\t\t\tpublish: (event: TEventData) => string\n\t }\n\t| ((\n\t\t\tparams: Partial<TInput> | Partial<TEventData>,\n\t\t\tcontext?: TContext\n\t ) => string)\n\n/** Decides whether one event reaches one subscriber. */\nexport type FilterFn<TInput, TEventData> = (params: {\n\tinput: TInput\n\tdata: TEventData\n}) => MaybePromise<boolean>\n\n/**\n * Checked when a subscription opens, before anything is sent. `true` allows\n * everyone; a function returns false (or throws) to refuse with FORBIDDEN.\n */\nexport type AuthFn<TInput, TContext> =\n\t| ((params: { input: TInput; ctx: TContext }) => MaybePromise<boolean>)\n\t| true\n\nexport type PublisherConfig = {\n\t/** Required name for tracing (e.g. 'chat.messages'). */\n\tname: string\n\t/**\n\t * Store recent events in a backlog list; new subscribers receive it before\n\t * live events. Default: false\n\t */\n\tuseBacklog?: boolean\n\t/** Maximum backlog items to keep (default: 50). */\n\tbacklogSize?: number\n\t/** Backlog TTL in seconds (default: 30). */\n\tbacklogTtl?: number\n\t/**\n\t * Also publish every payload to this channel (with its own backlog when\n\t * `useBacklog`). Subscribers still use `channel`. Equal to the primary\n\t * channel means no duplicate work.\n\t */\n\tmirrorChannel?: string\n}\n\n/** Per-definition overrides of the factory queue bounds. */\nexport type ChannelQueueOptions = {\n\tmaxQueueSize?: number\n\tmaxIngressSize?: number\n\tmaxReplaySize?: number\n}\n\n/** Synchronous observational events; failures cannot interrupt delivery. */\nexport type PubSubMetric = { name: string; channel: string } & (\n\t| {\n\t\t\ttype: 'queue'\n\t\t\tstage: 'ingress' | 'replay' | 'delivery'\n\t\t\tdepth: number\n\t\t\tlimit: number\n\t }\n\t| { type: 'drop'; stage: 'ingress' | 'replay' | 'delivery'; count: number }\n\t| { type: 'reconnect' }\n\t| { type: 'parseError'; stage: 'ingress' | 'replay'; error: unknown }\n)\n\nexport type PubSubOptions<\n\tTDef extends FnDefinition,\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef>\n> = PublisherConfig &\n\tChannelQueueOptions & {\n\t\tchannel: ChannelDefinition<\n\t\t\tz.output<TInputSchema>,\n\t\t\tz.output<TEventSchema>,\n\t\t\tFnContext<TDef, TKey>\n\t\t>\n\t\t/** What the subscriber provides. */\n\t\tinputSchema: TInputSchema\n\t\t/** What gets published. */\n\t\teventSchema: TEventSchema\n\t\tfilterFn?: FilterFn<z.output<TInputSchema>, z.output<TEventSchema>>\n\t\tauthFn?: AuthFn<z.output<TInputSchema>, FnContext<TDef, TKey>>\n\t\t/**\n\t\t * When a slow subscriber's queue overflows (drop-oldest), enqueue this\n\t\t * marker INSTEAD of the new event so the subscriber resyncs from its\n\t\t * cursor. A wholly dropped item leaves no per-item gap a consumer could\n\t\t * detect, so the marker is the only reliable live signal of loss. Return\n\t\t * null to skip.\n\t\t */\n\t\toverflowMarker?: (\n\t\t\tinput: z.output<TInputSchema>\n\t\t) => z.output<TEventSchema> | null\n\t\ttags?: TDef['tag'][]\n\t\tsummary?: string\n\t\tdescription?: string\n\t}\n\nexport type PubSub<\n\tTDef extends FnDefinition,\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef>\n> = {\n\tsubscribe: FnProcedure<\n\t\tTDef,\n\t\tTKey,\n\t\tTInputSchema,\n\t\tSchema<\n\t\t\tAsyncGenerator<z.output<TEventSchema>, void, unknown>,\n\t\t\tAsyncGenerator<z.output<TEventSchema>, void, unknown>\n\t\t>\n\t>\n\tpublish: (data: z.input<TEventSchema>) => Promise<void>\n\t/** Publish a batch in one atomic round-trip; items may target different channels. */\n\tpublishMany: (items: readonly z.input<TEventSchema>[]) => Promise<void>\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: z.output<TInputSchema>\n\t\tcontext: FnContext<TDef, TKey>\n\t}) => string\n\tgetPublishChannelName: (event: z.output<TEventSchema>) => string\n\t/** @deprecated Prefer the separate required-input resolver methods. */\n\tgetChannelName: (\n\t\tparams: Partial<z.output<TInputSchema>> | Partial<z.output<TEventSchema>>,\n\t\tcontext?: FnContext<TDef, TKey>\n\t) => string\n}\n\nexport type CreatePubSub<TDef extends FnDefinition> = <\n\tTInputSchema extends ObjectSchema,\n\tTEventSchema extends ZodType,\n\tTKey extends ProcedureKey<TDef> = TDef['default']\n>(\n\toptions: PubSubOptions<TDef, TInputSchema, TEventSchema, NoInfer<TKey>> &\n\t\tGuardOptions<TDef['guards']> &\n\t\tPick<\n\t\t\tFnRouteOptions<TDef, TKey, z.output<TInputSchema>>,\n\t\t\t'meta' | 'guardResolvers'\n\t\t> &\n\t\t/** Which `procedures` builder the subscribe route uses. */ ProcedureOption<\n\t\t\tTDef,\n\t\t\tTKey\n\t\t>\n) => PubSub<TDef, TInputSchema, TEventSchema, TKey>\n\nexport type PublisherOptions<TEventSchema extends ZodType> = PublisherConfig & {\n\t/** Static channel name, or a resolver over (partial) parsed event data. */\n\tchannel: string | ((params: Partial<z.output<TEventSchema>>) => string)\n\teventSchema: TEventSchema\n}\n\nexport type Publisher<TEventSchema extends ZodType> = {\n\tpublish: (data: z.input<TEventSchema>) => Promise<void>\n\tpublishMany: (items: readonly z.input<TEventSchema>[]) => Promise<void>\n\tgetChannelName: (params: Partial<z.output<TEventSchema>>) => string\n}\n\n/**\n * Publish-only counterpart to `createPubSub`, for buses whose subscribe side\n * lives elsewhere (e.g. an `fnLive` route sharing the channel and schema).\n */\nexport type CreatePublisher = <TEventSchema extends ZodType>(\n\toptions: PublisherOptions<TEventSchema>\n) => Publisher<TEventSchema>\n\nexport type PubSubRuntimeOptions = {\n\t/** Queue depths, drops, successful reconnects and parse failures. */\n\tonMetric?: (event: PubSubMetric) => void\n\t/**\n\t * The broker, or a function creating it on first use so importing routes\n\t * opens no connection: `transport: () => bunRedisTransport(getRedis())`.\n\t */\n\ttransport: PubSubTransport | (() => PubSubTransport)\n\t/**\n\t * Called per event dropped from ingress, replay or delivery queues.\n\t * Delivery drops count events before subscriber filtering.\n\t */\n\tonDrop?: (count: number, info: { name: string; channel: string }) => void\n\t/** Per-subscriber queue bound before drop-oldest (default: 1000). */\n\tmaxQueueSize?: number\n\t/** Pending raw messages per channel, before asynchronous parsing. */\n\tmaxIngressSize?: number\n\t/** Buffered live messages during replay. */\n\tmaxReplaySize?: number\n\t/** Broker subscription and backlog wait bound (default 10000ms). */\n\tinitializationTimeoutMs?: number\n\t/** Applied to channels, mirrors and therefore backlog keys. */\n\tnamespace?: string\n\t/** Close this transport only when its ownership is explicitly transferred. */\n\townsTransport?: boolean\n}\n\n/** @internal */\nexport type LiveRuntimeOptions = {\n\tfn: (options: Record<string, unknown>) => import('@orpc/server').AnyProcedure\n\ttracing: Tracing\n\tcreateLogger: (scope: string, span: SpanLike | undefined) => FnLogger\n\tpubsub?: PubSubRuntimeOptions | undefined\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Bounded queue\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Bounded drop-oldest FIFO with \"one overflow marker per overflow episode\"\n * semantics.\n *\n * On the FIRST overflow of an episode the oldest message is dropped and the\n * marker from `createOverflowMarker` is enqueued INSTEAD of the new event - the\n * subscriber's resync-from-cursor recovers the loss. While that marker is still\n * queued, further overflows drop the oldest NON-marker message (the marker\n * itself is never displaced) and enqueue the new event WITHOUT a second marker:\n * the pending marker's resync already covers every drop that happens before it\n * is delivered. Without this dedupe a sustained overflow converges the whole\n * queue to markers - one full snapshot re-run per queued slot. Dequeuing the\n * marker ends the episode; the next overflow starts a fresh one.\n *\n * `createOverflowMarker` absent (or returning null) falls back to plain\n * drop-oldest with the new event enqueued.\n */\nexport function createBoundedEventQueue<T>(opts: {\n\tmaxSize: number\n\tcreateOverflowMarker?: () => T | null\n\t/** Called once per dropped message (metrics/counters). */\n\tonDrop?: () => void\n\tonDepth?: (depth: number) => void\n}) {\n\tpositiveInteger(opts.maxSize, 'maxSize')\n\tconst items: T[] = []\n\t// The queued marker while an overflow episode is open. Created once per\n\t// episode, so identity is the exact \"is this the pending marker?\" test.\n\tlet pendingOverflowMarker: T | null = null\n\n\treturn {\n\t\tget length() {\n\t\t\treturn items.length\n\t\t},\n\t\tenqueue(data: T): void {\n\t\t\ttry {\n\t\t\t\tif (items.length >= opts.maxSize) {\n\t\t\t\t\tif (pendingOverflowMarker !== null) {\n\t\t\t\t\t\t// Episode already signalled: drop the oldest non-marker message\n\t\t\t\t\t\t// and enqueue WITHOUT a second marker.\n\t\t\t\t\t\tconst dropIndex = items[0] === pendingOverflowMarker ? 1 : 0\n\t\t\t\t\t\tif (dropIndex >= items.length) {\n\t\t\t\t\t\t\t// Degenerate maxSize: the queue is just the pending marker, so\n\t\t\t\t\t\t\t// the new event is the drop - the marker's resync covers it.\n\t\t\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems.splice(dropIndex, 1)\n\t\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\t\titems.push(data)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\titems.shift()\n\t\t\t\t\tsafely(opts.onDrop)\n\t\t\t\t\tconst marker = opts.createOverflowMarker?.() ?? null\n\t\t\t\t\tif (marker !== null) {\n\t\t\t\t\t\tpendingOverflowMarker = marker\n\t\t\t\t\t\titems.push(marker)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\titems.push(data)\n\t\t\t} finally {\n\t\t\t\tsafely(() => opts.onDepth?.(items.length))\n\t\t\t}\n\t\t},\n\t\tdequeue(): T | undefined {\n\t\t\tconst next = items.shift()\n\t\t\tsafely(() => opts.onDepth?.(items.length))\n\t\t\tif (next !== undefined && next === pendingOverflowMarker) {\n\t\t\t\tpendingOverflowMarker = null\n\t\t\t}\n\t\t\treturn next\n\t\t}\n\t}\n}\n\n/**\n * One subscriber's ordered, bounded delivery. Events wait in a bounded\n * drop-oldest queue (see {@link createBoundedEventQueue}) BEFORE the\n * subscriber's filter runs; the filter runs in order as the consumer reads,\n * so a slow async filter neither reorders events nor lets pending work grow\n * past `maxSize`. Overflow markers skip the filter.\n */\nexport function createSubscriberDelivery<T>(options: {\n\tmaxSize: number\n\taccept?: ((data: T) => MaybePromise<boolean>) | undefined\n\toverflowMarker?: (() => T | null) | undefined\n\tonFilterError: (error: unknown) => void\n\tonDrop: () => void\n\tonDepth?: (depth: number) => void\n}) {\n\ttype Item = { data: T; marker: boolean }\n\tconst queue = createBoundedEventQueue<Item>({\n\t\tmaxSize: options.maxSize,\n\t\tcreateOverflowMarker: () => {\n\t\t\tconst marker = options.overflowMarker?.() ?? null\n\t\t\treturn marker === null ? null : { data: marker, marker: true }\n\t\t},\n\t\tonDrop: options.onDrop,\n\t\t...(options.onDepth ? { onDepth: options.onDepth } : {})\n\t})\n\tlet closed = false\n\tlet failure: unknown\n\tlet wake: (() => void) | null = null\n\tconst notify = () => {\n\t\twake?.()\n\t\twake = null\n\t}\n\n\tasync function* events(): AsyncGenerator<T, void, unknown> {\n\t\twhile (!closed) {\n\t\t\tconst item = queue.dequeue()\n\t\t\tif (!item) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\twake = resolve\n\t\t\t\t})\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!item.marker && options.accept) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.accept(item.data))) continue\n\t\t\t\t} catch (error) {\n\t\t\t\t\tsafely(() => options.onFilterError(error))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (closed) break\n\t\t\t}\n\t\t\tyield item.data\n\t\t}\n\t\tif (failure !== undefined) throw failure\n\t}\n\n\treturn {\n\t\tpush(data: T, marker = false) {\n\t\t\tif (closed) return\n\t\t\tqueue.enqueue({ data, marker })\n\t\t\tnotify()\n\t\t},\n\t\tevents: events(),\n\t\t/** Stop delivering; a parked read ends at once. */\n\t\tclose(error?: unknown) {\n\t\t\tif (closed) return\n\t\t\tfailure = error\n\t\t\tclosed = true\n\t\t\tsafely(() => options.onDepth?.(0))\n\t\t\tnotify()\n\t\t}\n\t}\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Runtime (internal: the typed surface is what `createFn` returns)\n// ═══════════════════════════════════════════════════════════════════════════\n\nconst DEFAULT_MAX_QUEUE_SIZE = 1000\n\n// Exponential resubscribe backoff with jitter so reconnecting subscribers don't stampede the broker.\nconst RESUBSCRIBE_BASE_DELAY_MS = 1000\nconst RESUBSCRIBE_MAX_DELAY_MS = 30_000\nconst RESUBSCRIBE_MAX_JITTER_MS = 250\n\nfunction getResubscribeDelayMs(attempt: number): number {\n\tconst base = Math.min(\n\t\tRESUBSCRIBE_BASE_DELAY_MS * 2 ** attempt,\n\t\tRESUBSCRIBE_MAX_DELAY_MS\n\t)\n\treturn base + Math.floor(Math.random() * RESUBSCRIBE_MAX_JITTER_MS)\n}\n\ntype Input = Record<string, unknown>\n\ntype LocalSubscriber = {\n\tisActive: () => boolean\n\tpush: (data: unknown, id?: string) => void\n\tgap: () => void\n\tfail: (error: unknown) => void\n}\n\ntype Hub = {\n\tsubscribers: Set<LocalSubscriber>\n\t/** Resolves after a successful broker subscription (or closure). */\n\tready: Promise<void>\n\tclose: () => void\n}\n\n/** An open subscription: registered, authorized and subscribed. */\nexport type LiveSubscription = {\n\t/** Live events, after the backlog replay. Ends when closed or aborted. */\n\tevents: AsyncGenerator<unknown, void, unknown>\n\t/** Release everything; safe to call more than once, and before `events` runs. */\n\tclose: () => void\n\tisClosed: () => boolean\n}\n\n/** @internal Untyped options; `PubSubOptions` is the typed surface. */\nexport type ChannelOptions = PublisherConfig &\n\tChannelQueueOptions & {\n\t\tchannel: ChannelDefinition<Input, unknown>\n\t\teventSchema: ZodType\n\t\tfilterFn?: FilterFn<Input, unknown>\n\t\tauthFn?: AuthFn<Input, unknown>\n\t\toverflowMarker?: (input: Input) => unknown\n\t}\n\n/** @internal */\nexport type Channel = {\n\t/** Authorize and subscribe; resolves once events can be delivered. */\n\topen: (options: {\n\t\tinput: Input\n\t\tcontext: unknown\n\t\tsignal: AbortSignal | undefined\n\t\trecoverGaps?: boolean\n\t}) => Promise<LiveSubscription>\n\tpublish: (data: unknown) => Promise<void>\n\tpublishMany: (items: readonly unknown[]) => Promise<void>\n\tgetChannelName: (params: Input, context?: unknown) => string\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: Input\n\t\tcontext: unknown\n\t}) => string\n\tgetPublishChannelName: (event: Input) => string\n}\n\nconst resolveChannel = (\n\tchannel: ChannelDefinition<Input, unknown>,\n\tparams: Input,\n\tcontext?: unknown,\n\tpublishing = false\n) => {\n\tif (typeof channel === 'string') return channel\n\tif (typeof channel === 'function') return channel(params, context)\n\treturn publishing\n\t\t? channel.publish(params)\n\t\t: channel.subscribe({ input: params, context })\n}\n\n/** @internal */\nexport function createLiveRuntime(options: LiveRuntimeOptions) {\n\tconst { tracing, createLogger } = options\n\tconst logger = createLogger('pubsub', undefined)\n\tlet terminated = false\n\tlet shutdownPromise: Promise<void> | undefined\n\tconst releases = new Set<Promise<void>>()\n\tconst pendingInitialization = new Set<() => void>()\n\tconst pendingOpens = new Set<Promise<LiveSubscription>>()\n\tconst defaultMaxQueue = positiveInteger(\n\t\toptions.pubsub?.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE,\n\t\t'maxQueueSize'\n\t)\n\tconst defaultMaxIngress = positiveInteger(\n\t\toptions.pubsub?.maxIngressSize ?? defaultMaxQueue,\n\t\t'maxIngressSize'\n\t)\n\tconst defaultMaxReplay = positiveInteger(\n\t\toptions.pubsub?.maxReplaySize ?? defaultMaxQueue,\n\t\t'maxReplaySize'\n\t)\n\tconst initializationTimeout = positiveInteger(\n\t\toptions.pubsub?.initializationTimeoutMs ?? 10000,\n\t\t'initializationTimeoutMs'\n\t)\n\tconst metric = (event: PubSubMetric) =>\n\t\tsafely(() => options.pubsub?.onMetric?.(event))\n\tconst namespace = options.pubsub?.namespace\n\tconst qualify = (name: string) => (namespace ? `${namespace}:${name}` : name)\n\tconst assertOpen = () => {\n\t\tif (terminated)\n\t\t\tthrow new ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\tmessage: 'Live runtime has shut down'\n\t\t\t})\n\t}\n\tconst releaseTransport = (release: (() => Promise<void>) | null) => {\n\t\tif (!release) return\n\t\tconst task = Promise.resolve(release()).catch((error) => {\n\t\t\tlogger.warn('Failed to release subscription', {\n\t\t\t\terror: errorMessageOf(error)\n\t\t\t})\n\t\t})\n\t\treleases.add(task)\n\t\tvoid task.finally(() => releases.delete(task))\n\t}\n\n\t// Deploy drain: every open subscription registers its close here. On\n\t// SIGTERM the app ends them deliberately instead of letting the socket die\n\t// with the process: the generator returns, oRPC closes the SSE response and\n\t// the client's backoff reconnects to the new deployment.\n\tconst activeSubscriberCleanups = new Set<() => void>()\n\n\tlet transport: PubSubTransport | undefined\n\tconst requireTransport = () => {\n\t\tif (!options.pubsub) {\n\t\t\tthrow new Error(\n\t\t\t\t'orpc-fn: live routes need a transport, pass createFn({ pubsub: { transport } })'\n\t\t\t)\n\t\t}\n\t\tif (transport) return transport\n\t\t// A lazy transport is never created during or after shutdown.\n\t\tassertOpen()\n\t\tconst configured = options.pubsub.transport\n\t\ttransport = typeof configured === 'function' ? configured() : configured\n\t\treturn transport\n\t}\n\n\t/**\n\t * Shared publish pipeline: validate the raw event, resolve the channel from\n\t * the parsed event, then publish the raw event (atomically maintaining the\n\t * backlog when enabled) inside a producer span.\n\t */\n\tfunction createChannelPublisher(\n\t\tconfig: PublisherConfig & {\n\t\t\teventSchema: ZodType\n\t\t\tgetChannelName: (data: Input) => string\n\t\t}\n\t) {\n\t\tconst { name, eventSchema, getChannelName } = config\n\t\tconst mirrorChannel = config.mirrorChannel\n\t\t\t? qualify(config.mirrorChannel)\n\t\t\t: undefined\n\t\tif (config.backlogSize !== undefined)\n\t\t\tpositiveInteger(config.backlogSize, 'backlogSize')\n\t\tif (config.backlogTtl !== undefined)\n\t\t\tpositiveInteger(config.backlogTtl, 'backlogTtl')\n\t\tconst backlog: BacklogOptions | undefined = config.useBacklog\n\t\t\t? { size: config.backlogSize ?? 50, ttlSeconds: config.backlogTtl ?? 30 }\n\t\t\t: undefined\n\n\t\tconst toMessages = async (items: readonly unknown[]) => {\n\t\t\tconst messages: PubSubMessage[] = []\n\t\t\tfor (const item of items) {\n\t\t\t\tconst data = (await eventSchema.parseAsync(item)) as Input\n\t\t\t\tconst channel = getChannelName(data)\n\t\t\t\tconst payload = encodePayload(item)\n\t\t\t\tmessages.push({ channel, payload })\n\t\t\t\tif (mirrorChannel && mirrorChannel !== channel) {\n\t\t\t\t\tmessages.push({ channel: mirrorChannel, payload })\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn messages\n\t\t}\n\n\t\tconst send = (\n\t\t\toperation: 'publish' | 'publishMany',\n\t\t\titems: readonly unknown[]\n\t\t) =>\n\t\t\ttracing.inSpan(`${name}:${operation}`, 'PRODUCER', async (span) => {\n\t\t\t\tassertOpen()\n\t\t\t\tconst startTime = performance.now()\n\t\t\t\ttry {\n\t\t\t\t\tspan?.setAttribute('pubsub.operation', operation)\n\t\t\t\t\tspan?.setAttribute('pubsub.name', name)\n\t\t\t\t\tspan?.setAttribute('pubsub.batch_size', items.length)\n\t\t\t\t\tconst messages = await toMessages(items)\n\t\t\t\t\tconst first = messages[0]\n\t\t\t\t\tif (first) {\n\t\t\t\t\t\tspan?.setAttribute('pubsub.channel', first.channel)\n\t\t\t\t\t\tspan?.setAttribute('pubsub.payload_size', first.payload.length)\n\t\t\t\t\t}\n\t\t\t\t\tawait requireTransport().publish(messages, backlog)\n\t\t\t\t} finally {\n\t\t\t\t\tspan?.setAttribute(\n\t\t\t\t\t\t'pubsub.duration_ms',\n\t\t\t\t\t\tperformance.now() - startTime\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\n\t\treturn {\n\t\t\tpublish: (data: unknown) => send('publish', [data]),\n\t\t\tpublishMany: async (items: readonly unknown[]) => {\n\t\t\t\tif (items.length > 0) await send('publishMany', items)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Hubs for one pub/sub definition, keyed by channel. Many subscribers can\n\t * share a channel (an org with many open tabs); one hub decodes and parses\n\t * each payload once and fans the event out to every local subscriber,\n\t * applying each subscriber's own filter. The hub also owns the broker\n\t * subscription and its resubscribe backoff.\n\t */\n\tfunction createChannelHubs(config: {\n\t\teventSchema: ZodType\n\t\tname: string\n\t\tmaxIngress: number\n\t}) {\n\t\tconst { eventSchema } = config\n\t\tconst hubs = new Map<string, Hub>()\n\n\t\tconst createHub = (channel: string): Hub => {\n\t\t\tconst subscribers = new Set<LocalSubscriber>()\n\t\t\tlet closed = false\n\t\t\tlet unsubscribe: (() => Promise<void>) | null = null\n\t\t\tlet attempt = 0\n\t\t\tlet timer: ReturnType<typeof setTimeout> | null = null\n\t\t\tlet markReady = () => {}\n\t\t\tlet connectedOnce = false\n\t\t\tlet connected = false\n\t\t\tlet ready: Promise<void>\n\t\t\tconst markPending = () => {\n\t\t\t\tready = new Promise<void>((resolve) => {\n\t\t\t\t\tmarkReady = resolve\n\t\t\t\t})\n\t\t\t}\n\t\t\tmarkPending()\n\n\t\t\tlet parsing = false\n\t\t\tconst ingress = createBoundedEventQueue<string>({\n\t\t\t\tmaxSize: config.maxIngress,\n\t\t\t\tonDepth: (depth) =>\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tlimit: config.maxIngress,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t}),\n\t\t\t\tonDrop: () => {\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t})\n\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name: config.name, channel })\n\t\t\t\t\t)\n\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst parsePending = async () => {\n\t\t\t\tif (parsing) return\n\t\t\t\tparsing = true\n\t\t\t\ttry {\n\t\t\t\t\twhile (!closed) {\n\t\t\t\t\t\tconst raw = ingress.dequeue()\n\t\t\t\t\t\tif (raw === undefined) break\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst message = decodeMessage(raw)\n\t\t\t\t\t\t\tconst parsed = await eventSchema.parseAsync(message.value)\n\t\t\t\t\t\t\tif (closed) break\n\t\t\t\t\t\t\tfor (const sub of [...subscribers])\n\t\t\t\t\t\t\t\tif (sub.isActive()) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsub.push(parsed, message.id)\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\t\ttype: 'parseError',\n\t\t\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\t\t\tchannel\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tlogger.warn('pubsub.message_dropped', {\n\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t...errorAttributes(error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tparsing = false\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst release = releaseTransport\n\n\t\t\tconst scheduleResubscribe = (reason: string) => {\n\t\t\t\tif (closed || timer) return\n\t\t\t\tconst delayMs = getResubscribeDelayMs(attempt)\n\t\t\t\tattempt++\n\t\t\t\tlogger.warn('pubsub.resubscribe_scheduled', {\n\t\t\t\t\tchannel,\n\t\t\t\t\treason,\n\t\t\t\t\tattempt,\n\t\t\t\t\tdelayMs\n\t\t\t\t})\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\ttimer = null\n\t\t\t\t\tif (closed) return\n\t\t\t\t\trelease(unsubscribe)\n\t\t\t\t\tunsubscribe = null\n\t\t\t\t\tvoid connect()\n\t\t\t\t}, delayMs)\n\t\t\t}\n\n\t\t\tconst connect = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst next = await requireTransport().subscribe(\n\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t(raw) => {\n\t\t\t\t\t\t\tif (closed) return\n\t\t\t\t\t\t\tingress.enqueue(raw)\n\t\t\t\t\t\t\tvoid parsePending()\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(error) => {\n\t\t\t\t\t\t\tif (connected) {\n\t\t\t\t\t\t\t\tconnected = false\n\t\t\t\t\t\t\t\tmarkPending()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlogger.error('pubsub.subscription_lost', {\n\t\t\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t\t\t...errorAttributes(error)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tscheduleResubscribe('lost')\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonReconnect: () => {\n\t\t\t\t\t\t\t\tif (closed) return\n\t\t\t\t\t\t\t\tmetric({ type: 'reconnect', name: config.name, channel })\n\t\t\t\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\tif (closed) return release(next)\n\t\t\t\t\tunsubscribe = next\n\t\t\t\t\tconnected = true\n\t\t\t\t\tif (connectedOnce) {\n\t\t\t\t\t\tmetric({ type: 'reconnect', name: config.name, channel })\n\t\t\t\t\t\tfor (const sub of [...subscribers]) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tsub.gap()\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tsafely(() => sub.fail(error))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconnectedOnce = true\n\t\t\t\t\tmarkReady()\n\t\t\t\t\tattempt = 0\n\t\t\t\t\tlogger.debug('pubsub.subscribed', { channel })\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error('pubsub.subscribe_failed', {\n\t\t\t\t\t\tchannel,\n\t\t\t\t\t\t...errorAttributes(error)\n\t\t\t\t\t})\n\t\t\t\t\tscheduleResubscribe('subscribe-failed')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid connect()\n\n\t\t\treturn {\n\t\t\t\tsubscribers,\n\t\t\t\tget ready() {\n\t\t\t\t\treturn ready\n\t\t\t\t},\n\t\t\t\tclose: () => {\n\t\t\t\t\tclosed = true\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'ingress',\n\t\t\t\t\t\tdepth: 0,\n\t\t\t\t\t\tlimit: config.maxIngress,\n\t\t\t\t\t\tname: config.name,\n\t\t\t\t\t\tchannel\n\t\t\t\t\t})\n\t\t\t\t\tif (timer) clearTimeout(timer)\n\t\t\t\t\ttimer = null\n\t\t\t\t\tmarkReady()\n\t\t\t\t\trelease(unsubscribe)\n\t\t\t\t\tunsubscribe = null\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn function addLocalSubscriber(\n\t\t\tchannel: string,\n\t\t\tsubscriber: LocalSubscriber\n\t\t) {\n\t\t\tlet hub = hubs.get(channel)\n\t\t\tif (!hub) {\n\t\t\t\thub = createHub(channel)\n\t\t\t\thubs.set(channel, hub)\n\t\t\t}\n\t\t\thub.subscribers.add(subscriber)\n\t\t\tconst current = hub\n\t\t\treturn {\n\t\t\t\tready: current.ready,\n\t\t\t\tremove: () => {\n\t\t\t\t\tcurrent.subscribers.delete(subscriber)\n\t\t\t\t\tif (current.subscribers.size === 0 && hubs.get(channel) === current) {\n\t\t\t\t\t\tcurrent.close()\n\t\t\t\t\t\thubs.delete(channel)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Publish and open subscriptions on one channel definition. */\n\tfunction createChannel(channelOptions: ChannelOptions): Channel {\n\t\tconst {\n\t\t\tname,\n\t\t\tchannel,\n\t\t\teventSchema,\n\t\t\tfilterFn,\n\t\t\tauthFn,\n\t\t\toverflowMarker,\n\t\t\tuseBacklog = false\n\t\t} = channelOptions\n\n\t\tconst getChannelName = (params: Input, context?: unknown) =>\n\t\t\tqualify(resolveChannel(channel, params, context))\n\t\tconst getPublishChannel = (params: Input) =>\n\t\t\tqualify(resolveChannel(channel, params, undefined, true))\n\t\tconst maxQueue = positiveInteger(\n\t\t\tchannelOptions.maxQueueSize ?? defaultMaxQueue,\n\t\t\t'maxQueueSize'\n\t\t)\n\t\tconst maxIngress = positiveInteger(\n\t\t\tchannelOptions.maxIngressSize ?? defaultMaxIngress,\n\t\t\t'maxIngressSize'\n\t\t)\n\t\tconst maxReplay = positiveInteger(\n\t\t\tchannelOptions.maxReplaySize ?? defaultMaxReplay,\n\t\t\t'maxReplaySize'\n\t\t)\n\t\tconst addLocalSubscriber = createChannelHubs({\n\t\t\teventSchema,\n\t\t\tname,\n\t\t\tmaxIngress\n\t\t})\n\n\t\tconst openInternal: Channel['open'] = async ({\n\t\t\tinput,\n\t\t\tcontext,\n\t\t\tsignal,\n\t\t\trecoverGaps = false\n\t\t}) => {\n\t\t\tassertOpen()\n\t\t\tsignal?.throwIfAborted()\n\t\t\tconst initializing = new AbortController()\n\t\t\tconst transport = requireTransport()\n\t\t\tconst channelName = getChannelName(input, context)\n\t\t\tconst startTime = performance.now()\n\t\t\tconst span = tracing.startSpan(`${name}:subscribe`, 'SERVER', {\n\t\t\t\t'pubsub.channel': channelName,\n\t\t\t\t'pubsub.operation': 'subscribe',\n\t\t\t\t'pubsub.name': name\n\t\t\t})\n\t\t\tconst subscriberLogger = createLogger('pubsub', span)\n\t\t\tconst cancelInitialization = () =>\n\t\t\t\tinitializing.abort(\n\t\t\t\t\tsignal?.reason ?? new Error('Subscription initialization stopped')\n\t\t\t\t)\n\t\t\tpendingInitialization.add(cancelInitialization)\n\t\t\tsignal?.addEventListener('abort', cancelInitialization, { once: true })\n\t\t\tconst finishInitialization = () => {\n\t\t\t\tpendingInitialization.delete(cancelInitialization)\n\t\t\t\tsignal?.removeEventListener('abort', cancelInitialization)\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\tauthFn !== undefined &&\n\t\t\t\t\tauthFn !== true &&\n\t\t\t\t\t!(await waitFor(\n\t\t\t\t\t\tPromise.resolve(authFn({ input, ctx: context })),\n\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t))\n\t\t\t\t) {\n\t\t\t\t\tthrow new ORPCError('FORBIDDEN', {\n\t\t\t\t\t\tmessage: 'You do not have access to this subscription'\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tfinishInitialization()\n\t\t\t\ttracing.end(span, error)\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tsubscriberLogger.debug('pubsub.subscribing', { channel: channelName })\n\n\t\t\tlet messageCount = 0\n\t\t\tlet droppedCount = 0\n\t\t\tconst delivery = createSubscriberDelivery<unknown>({\n\t\t\t\tmaxSize: maxQueue,\n\t\t\t\tonDepth: (depth) =>\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'delivery',\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\tlimit: maxQueue,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t}),\n\t\t\t\taccept:\n\t\t\t\t\tfilterFn &&\n\t\t\t\t\t((data) => (data === LIVE_GAP ? true : filterFn({ input, data }))),\n\t\t\t\toverflowMarker: recoverGaps\n\t\t\t\t\t? () => LIVE_GAP\n\t\t\t\t\t: overflowMarker && (() => overflowMarker(input)),\n\t\t\t\tonFilterError: (error) =>\n\t\t\t\t\tsubscriberLogger.error('Error processing message', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t}),\n\t\t\t\tonDrop: () => {\n\t\t\t\t\tdroppedCount++\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\tstage: 'delivery',\n\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t})\n\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name, channel: channelName })\n\t\t\t\t\t)\n\t\t\t\t\tif (!recoverGaps && !overflowMarker)\n\t\t\t\t\t\tqueueMicrotask(() =>\n\t\t\t\t\t\t\tclose(\n\t\t\t\t\t\t\t\tnew ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\t\t\t\tmessage: 'Subscription queue overflow; reconnect and resync'\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tlet replaying: Array<{ data: unknown; id: string | undefined }> | null =\n\t\t\t\tuseBacklog ? [] : null\n\t\t\tlet replayGap = false\n\t\t\tconst seen = new Set<string>()\n\t\t\tconst dedupe = (id: string | undefined) => {\n\t\t\t\tif (!id) return false\n\t\t\t\tif (seen.has(id)) return true\n\t\t\t\tseen.add(id)\n\t\t\t\tif (\n\t\t\t\t\tseen.size >\n\t\t\t\t\tMath.max(maxReplay, maxQueue, channelOptions.backlogSize ?? 50) * 2\n\t\t\t\t)\n\t\t\t\t\tseen.delete(seen.values().next().value as string)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst push = (data: unknown, id?: string) => {\n\t\t\t\tmessageCount++\n\t\t\t\tif (replaying) {\n\t\t\t\t\tif (replaying.length >= maxReplay) {\n\t\t\t\t\t\treplaying.shift()\n\t\t\t\t\t\treplayGap = true\n\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\ttype: 'drop',\n\t\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\t\tcount: 1,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t\t})\n\t\t\t\t\t\tsafely(() =>\n\t\t\t\t\t\t\toptions.pubsub?.onDrop?.(1, { name, channel: channelName })\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treplaying.push({ data, id })\n\t\t\t\t\tmetric({\n\t\t\t\t\t\ttype: 'queue',\n\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\tdepth: replaying.length,\n\t\t\t\t\t\tlimit: maxReplay,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t})\n\t\t\t\t} else if (!dedupe(id)) delivery.push(data)\n\t\t\t}\n\t\t\tconst gap = () => {\n\t\t\t\tif (replaying) {\n\t\t\t\t\treplayGap = true\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (recoverGaps) delivery.push(LIVE_GAP)\n\t\t\t\telse if (overflowMarker) {\n\t\t\t\t\tconst marker = overflowMarker(input)\n\t\t\t\t\tif (marker !== null) delivery.push(marker, true)\n\t\t\t\t} else\n\t\t\t\t\tclose(\n\t\t\t\t\t\tnew ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\t\tmessage: 'Subscription lost events; reconnect and resync'\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t}\n\n\t\t\t// The one way a subscription ends, whatever ends it: abort, drain, the\n\t\t\t// stream finishing, or `close()`. Releases everything at once, even\n\t\t\t// while the stream is parked or not yet read.\n\t\t\tlet closed = false\n\t\t\tconst close = (...error: [] | [unknown]) => {\n\t\t\t\tif (closed) return\n\t\t\t\tclosed = true\n\t\t\t\tinitializing.abort(error[0] ?? new Error('Subscription closed'))\n\t\t\t\tdelivery.close(error[0])\n\t\t\t\tactiveSubscriberCleanups.delete(stop)\n\t\t\t\tsignal?.removeEventListener('abort', stop)\n\t\t\t\tlocal.remove()\n\t\t\t\tconst durationMs = performance.now() - startTime\n\t\t\t\tspan?.setAttribute('pubsub.duration_ms', durationMs)\n\t\t\t\tspan?.setAttribute('pubsub.message_count', messageCount)\n\t\t\t\tspan?.setAttribute('pubsub.dropped_count', droppedCount)\n\t\t\t\ttracing.end(span, ...error)\n\t\t\t\tsubscriberLogger.debug('pubsub.unsubscribed', {\n\t\t\t\t\tchannel: channelName,\n\t\t\t\t\tmessageCount,\n\t\t\t\t\tdroppedCount,\n\t\t\t\t\tdurationMs: Math.round(durationMs)\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst stop = () => close()\n\t\t\tconst local = addLocalSubscriber(channelName, {\n\t\t\t\tisActive: () => !closed,\n\t\t\t\tpush,\n\t\t\t\tgap,\n\t\t\t\tfail: (error) => close(error)\n\t\t\t})\n\t\t\tactiveSubscriberCleanups.add(stop)\n\t\t\tsignal?.addEventListener('abort', stop)\n\t\t\tif (signal?.aborted) close()\n\n\t\t\ttry {\n\t\t\t\tawait waitFor(local.ready, initializationTimeout, initializing.signal)\n\t\t\t\tif (replaying && !closed) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst items = await waitFor(\n\t\t\t\t\t\t\ttransport.readBacklog(channelName),\n\t\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t\t)\n\t\t\t\t\t\tspan?.setAttribute('pubsub.backlog_count', items.length)\n\t\t\t\t\t\tfor (const raw of items.slice(-maxReplay)) {\n\t\t\t\t\t\t\tif (closed) break\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst message = decodeMessage(raw)\n\t\t\t\t\t\t\t\tif (!dedupe(message.id)) {\n\t\t\t\t\t\t\t\t\tmessageCount++\n\t\t\t\t\t\t\t\t\tdelivery.push(\n\t\t\t\t\t\t\t\t\t\tawait waitFor(\n\t\t\t\t\t\t\t\t\t\t\teventSchema.parseAsync(message.value),\n\t\t\t\t\t\t\t\t\t\t\tinitializationTimeout,\n\t\t\t\t\t\t\t\t\t\t\tinitializing.signal\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tmetric({\n\t\t\t\t\t\t\t\t\ttype: 'parseError',\n\t\t\t\t\t\t\t\t\tstage: 'replay',\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tchannel: channelName\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t/* Malformed backlog entries are skipped. */\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (items.length > maxReplay) replayGap = true\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treplayGap = true\n\t\t\t\t\t\tsubscriberLogger.warn('pubsub.replay_failed', {\n\t\t\t\t\t\t\tchannel: channelName,\n\t\t\t\t\t\t\t...errorAttributes(error)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const { data, id } of replaying ?? [])\n\t\t\t\t\tif (!dedupe(id)) delivery.push(data)\n\t\t\t\treplaying = null\n\t\t\t\tmetric({\n\t\t\t\t\ttype: 'queue',\n\t\t\t\t\tstage: 'replay',\n\t\t\t\t\tdepth: 0,\n\t\t\t\t\tlimit: maxReplay,\n\t\t\t\t\tname,\n\t\t\t\t\tchannel: channelName\n\t\t\t\t})\n\t\t\t\tif (replayGap && !closed) gap()\n\t\t\t} catch (error) {\n\t\t\t\tif (!closed) {\n\t\t\t\t\tclose(error)\n\t\t\t\t\tthrow new ORPCError('SERVICE_UNAVAILABLE', {\n\t\t\t\t\t\tmessage: 'Unable to establish subscription',\n\t\t\t\t\t\tcause: error\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tfinishInitialization()\n\t\t\t}\n\n\t\t\tasync function* events() {\n\t\t\t\ttry {\n\t\t\t\t\tyield* delivery.events\n\t\t\t\t} finally {\n\t\t\t\t\tclose()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { events: events(), close: () => close(), isClosed: () => closed }\n\t\t}\n\n\t\tconst { publish, publishMany } = createChannelPublisher({\n\t\t\t...channelOptions,\n\t\t\tgetChannelName: getPublishChannel\n\t\t})\n\n\t\tconst open: Channel['open'] = (params) => {\n\t\t\tconst task = openInternal(params)\n\t\t\tpendingOpens.add(task)\n\t\t\tvoid task.then(\n\t\t\t\t() => pendingOpens.delete(task),\n\t\t\t\t() => pendingOpens.delete(task)\n\t\t\t)\n\t\t\treturn task\n\t\t}\n\t\treturn {\n\t\t\topen,\n\t\t\tpublish,\n\t\t\tpublishMany,\n\t\t\tgetChannelName,\n\t\t\tgetSubscriptionChannelName: ({ input, context }) =>\n\t\t\t\tgetChannelName(input, context),\n\t\t\tgetPublishChannelName: getPublishChannel\n\t\t}\n\t}\n\n\tfunction createPubSub(\n\t\tpubsubOptions: ChannelOptions & {\n\t\t\tinputSchema: ZodType\n\t\t\tprocedure?: string\n\t\t\ttags?: string[]\n\t\t\tsummary?: string\n\t\t\tdescription?: string\n\t\t}\n\t) {\n\t\tconst { name } = pubsubOptions\n\t\tconst channel = createChannel(pubsubOptions)\n\n\t\tconst {\n\t\t\tchannel: _channel,\n\t\t\teventSchema: _eventSchema,\n\t\t\tinputSchema,\n\t\t\tfilterFn: _filterFn,\n\t\t\tauthFn: _authFn,\n\t\t\toverflowMarker: _overflowMarker,\n\t\t\tuseBacklog: _useBacklog,\n\t\t\tbacklogSize: _backlogSize,\n\t\t\tbacklogTtl: _backlogTtl,\n\t\t\tmirrorChannel: _mirrorChannel,\n\t\t\tmaxQueueSize: _maxQueueSize,\n\t\t\tmaxIngressSize: _maxIngressSize,\n\t\t\tmaxReplaySize: _maxReplaySize,\n\t\t\t...routeOptions\n\t\t} = pubsubOptions\n\t\tconst subscribe = options.fn({\n\t\t\t...routeOptions,\n\t\t\tname,\n\t\t\tstream: true,\n\t\t\tmethod: 'GET',\n\t\t\tinput: inputSchema,\n\t\t\tsummary: pubsubOptions.summary ?? `Subscribe to ${name}`,\n\t\t\thandler: async function* ({\n\t\t\t\tinput,\n\t\t\t\tcontext,\n\t\t\t\tsignal\n\t\t\t}: {\n\t\t\t\tinput: Input\n\t\t\t\tcontext: unknown\n\t\t\t\tsignal: AbortSignal | undefined\n\t\t\t}) {\n\t\t\t\tyield* (await channel.open({ input, context, signal })).events\n\t\t\t}\n\t\t})\n\n\t\tconst { publish, publishMany, getChannelName } = channel\n\t\treturn {\n\t\t\tsubscribe,\n\t\t\tpublish,\n\t\t\tpublishMany,\n\t\t\tgetChannelName,\n\t\t\tgetSubscriptionChannelName: channel.getSubscriptionChannelName,\n\t\t\tgetPublishChannelName: channel.getPublishChannelName\n\t\t}\n\t}\n\n\tfunction createPublisher(publisherOptions: PublisherOptions<ZodType>) {\n\t\tconst getChannelName = (params: Input) =>\n\t\t\tqualify(resolveChannel(publisherOptions.channel, params, undefined, true))\n\t\tconst { publish, publishMany } = createChannelPublisher({\n\t\t\t...publisherOptions,\n\t\t\tgetChannelName\n\t\t})\n\t\treturn { publish, publishMany, getChannelName }\n\t}\n\n\treturn {\n\t\tcreateChannel,\n\t\tshutdown: () => {\n\t\t\tif (shutdownPromise) return shutdownPromise\n\t\t\tterminated = true\n\t\t\tfor (const cancel of [...pendingInitialization]) safely(cancel)\n\t\t\tfor (const cleanup of [...activeSubscriberCleanups]) safely(cleanup)\n\t\t\tshutdownPromise = (async () => {\n\t\t\t\tawait Promise.allSettled([...pendingOpens])\n\t\t\t\tawait Promise.all([...releases])\n\t\t\t\tif (options.pubsub?.ownsTransport) await transport?.close?.()\n\t\t\t})()\n\t\t\treturn shutdownPromise\n\t\t},\n\t\tcreatePubSub,\n\t\tcreatePublisher,\n\t\t/** Open subscriptions of this instance (drain progress, gauges). */\n\t\tactivePubSubSubscriberCount: () => activeSubscriberCleanups.size,\n\t\t/** End every open subscription; returns how many were closed. */\n\t\tdrainPubSubSubscribers: () => {\n\t\t\tconst cleanups = [...activeSubscriberCleanups]\n\t\t\tactiveSubscriberCleanups.clear()\n\t\t\tfor (const cleanup of cleanups) {\n\t\t\t\ttry {\n\t\t\t\t\tcleanup()\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// A failed cleanup must not stop the drain.\n\t\t\t\t\tlogger.warn('Subscriber cleanup failed during drain', {\n\t\t\t\t\t\terror: errorMessageOf(error)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn cleanups.length\n\t\t}\n\t}\n}\n"]}
package/dist/otel.d.ts CHANGED
@@ -62,5 +62,10 @@ export type Tracing = {
62
62
  };
63
63
  export declare function createTracing(otel: OtelApiLike | undefined): Tracing;
64
64
  export declare function errorMessageOf(error: unknown): string;
65
+ /** Error fields for a log line, named like the `fn.completed` ones. */
66
+ export declare function errorAttributes(error: unknown): {
67
+ error_type: string;
68
+ error_message: string;
69
+ };
65
70
  export {};
66
71
  //# sourceMappingURL=otel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
package/dist/otel.js CHANGED
@@ -112,6 +112,13 @@ export function createTracing(otel) {
112
112
  export function errorMessageOf(error) {
113
113
  return error instanceof Error ? error.message : String(error);
114
114
  }
115
+ /** Error fields for a log line, named like the `fn.completed` ones. */
116
+ export function errorAttributes(error) {
117
+ return {
118
+ error_type: error instanceof Error ? error.name : typeof error,
119
+ error_message: errorMessageOf(error)
120
+ };
121
+ }
115
122
  function protectSpan(span) {
116
123
  return new Proxy(span, {
117
124
  get(target, key) {
package/dist/otel.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tisAsyncIteratorObject,\n\tonStreamEnd,\n\ttype StreamScope\n} from './stream.js'\n\n/** Attribute values accepted by OpenTelemetry spans. */\nexport type AttributeValue = string | number | boolean\n\n/** The part of an OpenTelemetry `Span` this package uses. */\nexport interface SpanLike {\n\tsetAttribute(key: string, value: AttributeValue): unknown\n\tsetStatus(status: { code: number; message?: string }): unknown\n\trecordException(exception: Error): unknown\n\tend(): unknown\n}\n\ntype SpanOptionsLike = {\n\tkind?: number\n\tattributes?: Record<string, AttributeValue>\n}\n\ninterface TracerLike<TSpan> {\n\tstartActiveSpan<F extends (span: TSpan) => unknown>(\n\t\tname: string,\n\t\toptions: SpanOptionsLike,\n\t\tfn: F\n\t): ReturnType<F>\n\tstartSpan(name: string, options?: SpanOptionsLike): TSpan\n}\n\n/**\n * The part of `@opentelemetry/api` this package uses. Pass the module itself:\n * `import * as otel from '@opentelemetry/api'` then `createFn({ otel })`.\n * Without it no spans are created and handlers receive `span: undefined`.\n */\nexport interface OtelApiLike<TSpan extends SpanLike = SpanLike> {\n\ttrace: { getTracer(name: string): TracerLike<TSpan> }\n\tSpanStatusCode: { OK: number; ERROR: number }\n\tSpanKind: {\n\t\tINTERNAL: number\n\t\tSERVER: number\n\t\tPRODUCER: number\n\t}\n\t/** Restores a span's context for each step of a stream it returned. */\n\tcontext: {\n\t\tactive(): unknown\n\t\twith<T>(context: never, fn: () => T): T\n\t}\n}\n\n/** The span type of an OpenTelemetry API, or `SpanLike` when absent. */\nexport type SpanOf<TOtel> =\n\tTOtel extends OtelApiLike<infer TSpan> ? TSpan : SpanLike\n\n/** Called once when a span's work is done, before the span ends. */\nexport type OnSettled = (\n\tspan: SpanLike | undefined,\n\t...error: [] | [unknown]\n) => void\n\nexport type Tracing = {\n\t/**\n\t * Run `fn` inside an active span: OK when it resolves, ERROR when it throws,\n\t * ended either way. When `fn` resolves to a stream, the span stays open -\n\t * and active for each step of the stream - until the stream ends.\n\t * `onSettled` runs once at that point, before the span ends. Without\n\t * OpenTelemetry `span` is undefined and `onSettled` still runs.\n\t */\n\tinSpan<T>(\n\t\tname: string,\n\t\tkind: 'INTERNAL' | 'SERVER' | 'PRODUCER',\n\t\tfn: (span: SpanLike | undefined) => Promise<T>,\n\t\tonSettled?: OnSettled\n\t): Promise<T>\n\t/** Start a span that the caller ends with `end` (long-lived streams). */\n\tstartSpan(\n\t\tname: string,\n\t\tkind: 'SERVER',\n\t\tattributes: Record<string, AttributeValue>\n\t): SpanLike | undefined\n\t/** Set OK, or ERROR with `error`, and end the span. */\n\tend(span: SpanLike | undefined, error?: unknown): void\n}\n\nexport function createTracing(otel: OtelApiLike | undefined): Tracing {\n\tlet tracer: TracerLike<SpanLike> | undefined\n\ttry {\n\t\ttracer = otel?.trace.getTracer('orpc-fn')\n\t} catch {\n\t\t/* Missing telemetry cannot prevent execution. */\n\t}\n\tconst end: Tracing['end'] = (span, ...error) => {\n\t\tif (!span || !otel) return\n\t\tspan = protectSpan(span)\n\t\tif (error.length === 0) {\n\t\t\tspan.setStatus({ code: otel.SpanStatusCode.OK })\n\t\t} else {\n\t\t\tspan.setStatus({\n\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessageOf(error[0])\n\t\t\t})\n\t\t\tif (error[0] instanceof Error) span.recordException(error[0])\n\t\t}\n\t\tspan.end()\n\t}\n\treturn {\n\t\tinSpan(name, kind, fn, onSettled) {\n\t\t\tconst settle = (span: SpanLike | undefined, ...error: [] | [unknown]) => {\n\t\t\t\ttry {\n\t\t\t\t\tonSettled?.(span, ...error)\n\t\t\t\t} catch {\n\t\t\t\t\t/* Telemetry callbacks cannot replace the original result. */\n\t\t\t\t} finally {\n\t\t\t\t\tend(span, ...error)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst run = async (\n\t\t\t\tspan: SpanLike | undefined,\n\t\t\t\tscope?: StreamScope\n\t\t\t): Promise<Awaited<ReturnType<typeof fn>>> => {\n\t\t\t\tspan = span ? protectSpan(span) : undefined\n\t\t\t\tlet result: Awaited<ReturnType<typeof fn>>\n\t\t\t\ttry {\n\t\t\t\t\tresult = await fn(span)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tsettle(span, error)\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\t\t\t\tif (isAsyncIteratorObject(result)) {\n\t\t\t\t\treturn onStreamEnd(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\t(...error) => settle(span, ...error),\n\t\t\t\t\t\tscope\n\t\t\t\t\t) as typeof result\n\t\t\t\t}\n\t\t\t\tsettle(span)\n\t\t\t\treturn result\n\t\t\t}\n\t\t\tif (!tracer || !otel) return run(undefined)\n\t\t\tlet started: Promise<Awaited<ReturnType<typeof fn>>> | undefined\n\t\t\ttry {\n\t\t\t\treturn tracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t{ kind: otel.SpanKind[kind] },\n\t\t\t\t\t(span) => {\n\t\t\t\t\t\tlet active: unknown\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tactive = otel.context.active()\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t/* Fall back to the span without scope restoration. */\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstarted = run(span, (step) => {\n\t\t\t\t\t\t\tlet completed: { value: ReturnType<typeof step> } | undefined\n\t\t\t\t\t\t\tlet failed: { error: unknown } | undefined\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn otel.context.with(active as never, () => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tconst value = step()\n\t\t\t\t\t\t\t\t\t\tcompleted = { value }\n\t\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tfailed = { error }\n\t\t\t\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tif (completed) return completed.value\n\t\t\t\t\t\t\t\tif (failed) throw failed.error\n\t\t\t\t\t\t\t\treturn step()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn started\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} catch {\n\t\t\t\treturn started ?? run(undefined)\n\t\t\t}\n\t\t},\n\t\tstartSpan(name, kind, attributes) {\n\t\t\tif (!tracer || !otel) return undefined\n\t\t\ttry {\n\t\t\t\treturn protectSpan(\n\t\t\t\t\ttracer.startSpan(name, { kind: otel.SpanKind[kind], attributes })\n\t\t\t\t)\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\tend\n\t}\n}\n\nexport function errorMessageOf(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error)\n}\n\nfunction protectSpan<T extends SpanLike>(span: T): T {\n\treturn new Proxy(span, {\n\t\tget(target, key) {\n\t\t\tconst value = Reflect.get(target, key, target)\n\t\t\tif (typeof value !== 'function') return value\n\t\t\tif (\n\t\t\t\t['setAttribute', 'setStatus', 'recordException', 'end'].includes(\n\t\t\t\t\tString(key)\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn (...args: unknown[]) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn value.apply(target, args)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* Ignore exporter failures. */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\treturn value.bind(target)\n\t\t}\n\t})\n}\n"]}
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tisAsyncIteratorObject,\n\tonStreamEnd,\n\ttype StreamScope\n} from './stream.js'\n\n/** Attribute values accepted by OpenTelemetry spans. */\nexport type AttributeValue = string | number | boolean\n\n/** The part of an OpenTelemetry `Span` this package uses. */\nexport interface SpanLike {\n\tsetAttribute(key: string, value: AttributeValue): unknown\n\tsetStatus(status: { code: number; message?: string }): unknown\n\trecordException(exception: Error): unknown\n\tend(): unknown\n}\n\ntype SpanOptionsLike = {\n\tkind?: number\n\tattributes?: Record<string, AttributeValue>\n}\n\ninterface TracerLike<TSpan> {\n\tstartActiveSpan<F extends (span: TSpan) => unknown>(\n\t\tname: string,\n\t\toptions: SpanOptionsLike,\n\t\tfn: F\n\t): ReturnType<F>\n\tstartSpan(name: string, options?: SpanOptionsLike): TSpan\n}\n\n/**\n * The part of `@opentelemetry/api` this package uses. Pass the module itself:\n * `import * as otel from '@opentelemetry/api'` then `createFn({ otel })`.\n * Without it no spans are created and handlers receive `span: undefined`.\n */\nexport interface OtelApiLike<TSpan extends SpanLike = SpanLike> {\n\ttrace: { getTracer(name: string): TracerLike<TSpan> }\n\tSpanStatusCode: { OK: number; ERROR: number }\n\tSpanKind: {\n\t\tINTERNAL: number\n\t\tSERVER: number\n\t\tPRODUCER: number\n\t}\n\t/** Restores a span's context for each step of a stream it returned. */\n\tcontext: {\n\t\tactive(): unknown\n\t\twith<T>(context: never, fn: () => T): T\n\t}\n}\n\n/** The span type of an OpenTelemetry API, or `SpanLike` when absent. */\nexport type SpanOf<TOtel> =\n\tTOtel extends OtelApiLike<infer TSpan> ? TSpan : SpanLike\n\n/** Called once when a span's work is done, before the span ends. */\nexport type OnSettled = (\n\tspan: SpanLike | undefined,\n\t...error: [] | [unknown]\n) => void\n\nexport type Tracing = {\n\t/**\n\t * Run `fn` inside an active span: OK when it resolves, ERROR when it throws,\n\t * ended either way. When `fn` resolves to a stream, the span stays open -\n\t * and active for each step of the stream - until the stream ends.\n\t * `onSettled` runs once at that point, before the span ends. Without\n\t * OpenTelemetry `span` is undefined and `onSettled` still runs.\n\t */\n\tinSpan<T>(\n\t\tname: string,\n\t\tkind: 'INTERNAL' | 'SERVER' | 'PRODUCER',\n\t\tfn: (span: SpanLike | undefined) => Promise<T>,\n\t\tonSettled?: OnSettled\n\t): Promise<T>\n\t/** Start a span that the caller ends with `end` (long-lived streams). */\n\tstartSpan(\n\t\tname: string,\n\t\tkind: 'SERVER',\n\t\tattributes: Record<string, AttributeValue>\n\t): SpanLike | undefined\n\t/** Set OK, or ERROR with `error`, and end the span. */\n\tend(span: SpanLike | undefined, error?: unknown): void\n}\n\nexport function createTracing(otel: OtelApiLike | undefined): Tracing {\n\tlet tracer: TracerLike<SpanLike> | undefined\n\ttry {\n\t\ttracer = otel?.trace.getTracer('orpc-fn')\n\t} catch {\n\t\t/* Missing telemetry cannot prevent execution. */\n\t}\n\tconst end: Tracing['end'] = (span, ...error) => {\n\t\tif (!span || !otel) return\n\t\tspan = protectSpan(span)\n\t\tif (error.length === 0) {\n\t\t\tspan.setStatus({ code: otel.SpanStatusCode.OK })\n\t\t} else {\n\t\t\tspan.setStatus({\n\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessageOf(error[0])\n\t\t\t})\n\t\t\tif (error[0] instanceof Error) span.recordException(error[0])\n\t\t}\n\t\tspan.end()\n\t}\n\treturn {\n\t\tinSpan(name, kind, fn, onSettled) {\n\t\t\tconst settle = (span: SpanLike | undefined, ...error: [] | [unknown]) => {\n\t\t\t\ttry {\n\t\t\t\t\tonSettled?.(span, ...error)\n\t\t\t\t} catch {\n\t\t\t\t\t/* Telemetry callbacks cannot replace the original result. */\n\t\t\t\t} finally {\n\t\t\t\t\tend(span, ...error)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst run = async (\n\t\t\t\tspan: SpanLike | undefined,\n\t\t\t\tscope?: StreamScope\n\t\t\t): Promise<Awaited<ReturnType<typeof fn>>> => {\n\t\t\t\tspan = span ? protectSpan(span) : undefined\n\t\t\t\tlet result: Awaited<ReturnType<typeof fn>>\n\t\t\t\ttry {\n\t\t\t\t\tresult = await fn(span)\n\t\t\t\t} catch (error) {\n\t\t\t\t\tsettle(span, error)\n\t\t\t\t\tthrow error\n\t\t\t\t}\n\t\t\t\tif (isAsyncIteratorObject(result)) {\n\t\t\t\t\treturn onStreamEnd(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\t(...error) => settle(span, ...error),\n\t\t\t\t\t\tscope\n\t\t\t\t\t) as typeof result\n\t\t\t\t}\n\t\t\t\tsettle(span)\n\t\t\t\treturn result\n\t\t\t}\n\t\t\tif (!tracer || !otel) return run(undefined)\n\t\t\tlet started: Promise<Awaited<ReturnType<typeof fn>>> | undefined\n\t\t\ttry {\n\t\t\t\treturn tracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t{ kind: otel.SpanKind[kind] },\n\t\t\t\t\t(span) => {\n\t\t\t\t\t\tlet active: unknown\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tactive = otel.context.active()\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t/* Fall back to the span without scope restoration. */\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstarted = run(span, (step) => {\n\t\t\t\t\t\t\tlet completed: { value: ReturnType<typeof step> } | undefined\n\t\t\t\t\t\t\tlet failed: { error: unknown } | undefined\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn otel.context.with(active as never, () => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tconst value = step()\n\t\t\t\t\t\t\t\t\t\tcompleted = { value }\n\t\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\tfailed = { error }\n\t\t\t\t\t\t\t\t\t\tthrow error\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tif (completed) return completed.value\n\t\t\t\t\t\t\t\tif (failed) throw failed.error\n\t\t\t\t\t\t\t\treturn step()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn started\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t} catch {\n\t\t\t\treturn started ?? run(undefined)\n\t\t\t}\n\t\t},\n\t\tstartSpan(name, kind, attributes) {\n\t\t\tif (!tracer || !otel) return undefined\n\t\t\ttry {\n\t\t\t\treturn protectSpan(\n\t\t\t\t\ttracer.startSpan(name, { kind: otel.SpanKind[kind], attributes })\n\t\t\t\t)\n\t\t\t} catch {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t},\n\t\tend\n\t}\n}\n\nexport function errorMessageOf(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error)\n}\n\n/** Error fields for a log line, named like the `fn.completed` ones. */\nexport function errorAttributes(error: unknown) {\n\treturn {\n\t\terror_type: error instanceof Error ? error.name : typeof error,\n\t\terror_message: errorMessageOf(error)\n\t}\n}\n\nfunction protectSpan<T extends SpanLike>(span: T): T {\n\treturn new Proxy(span, {\n\t\tget(target, key) {\n\t\t\tconst value = Reflect.get(target, key, target)\n\t\t\tif (typeof value !== 'function') return value\n\t\t\tif (\n\t\t\t\t['setAttribute', 'setStatus', 'recordException', 'end'].includes(\n\t\t\t\t\tString(key)\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn (...args: unknown[]) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn value.apply(target, args)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* Ignore exporter failures. */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\treturn value.bind(target)\n\t\t}\n\t})\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orpc-fn",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Define a backend function once: a typed oRPC procedure with tracing, logging, guards, injected handler extras, nested calls and live queries over Redis.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -172,7 +172,6 @@
172
172
  "ioredis": "5.8.2",
173
173
  "publint": "^0.3.12",
174
174
  "typescript": "^7.0.2",
175
- "typescript-ast": "npm:typescript@5.7.3",
176
175
  "zod": "4.4.3"
177
176
  },
178
177
  "bugs": {
package/src/create-fn.ts CHANGED
@@ -25,6 +25,7 @@ import { readFnMeta } from './meta.js'
25
25
  import {
26
26
  type AttributeValue,
27
27
  createTracing,
28
+ errorAttributes,
28
29
  errorMessageOf,
29
30
  type OtelApiLike,
30
31
  type SpanLike,
@@ -523,12 +524,7 @@ export function createFn<
523
524
  procedure: event.procedure,
524
525
  duration_ms: event.durationMs,
525
526
  status: success ? 'success' : 'failed',
526
- ...(error === undefined
527
- ? {}
528
- : {
529
- error_type: error instanceof Error ? error.name : typeof error,
530
- error_message: errorMessageOf(error)
531
- })
527
+ ...(error === undefined ? {} : errorAttributes(error))
532
528
  })
533
529
  }
534
530
 
@@ -2,7 +2,12 @@ import type { Schema } from '@orpc/contract'
2
2
  import { ORPCError } from '@orpc/server'
3
3
  import type { ZodObject, ZodRawShape, ZodType, z } from 'zod'
4
4
  import type { FnLogger } from '../logger.js'
5
- import { errorMessageOf, type SpanLike, type Tracing } from '../otel.js'
5
+ import {
6
+ errorAttributes,
7
+ errorMessageOf,
8
+ type SpanLike,
9
+ type Tracing
10
+ } from '../otel.js'
6
11
  import type {
7
12
  GuardOptions,
8
13
  FnContext,
@@ -706,8 +711,9 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
706
711
  name: config.name,
707
712
  channel
708
713
  })
709
- logger.warn(`Dropped malformed message on ${channel}`, {
710
- error: errorMessageOf(error)
714
+ logger.warn('pubsub.message_dropped', {
715
+ channel,
716
+ ...errorAttributes(error)
711
717
  })
712
718
  }
713
719
  }
@@ -721,7 +727,8 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
721
727
  if (closed || timer) return
722
728
  const delayMs = getResubscribeDelayMs(attempt)
723
729
  attempt++
724
- logger.warn(`Scheduling resubscribe for ${channel}`, {
730
+ logger.warn('pubsub.resubscribe_scheduled', {
731
+ channel,
725
732
  reason,
726
733
  attempt,
727
734
  delayMs
@@ -749,8 +756,9 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
749
756
  connected = false
750
757
  markPending()
751
758
  }
752
- logger.error(`Subscription to ${channel} lost`, {
753
- error: error.message
759
+ logger.error('pubsub.subscription_lost', {
760
+ channel,
761
+ ...errorAttributes(error)
754
762
  })
755
763
  scheduleResubscribe('lost')
756
764
  },
@@ -784,10 +792,11 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
784
792
  connectedOnce = true
785
793
  markReady()
786
794
  attempt = 0
787
- logger.info(`Subscribed to ${channel}`)
795
+ logger.debug('pubsub.subscribed', { channel })
788
796
  } catch (error) {
789
- logger.error(`Failed to subscribe to ${channel}`, {
790
- error: errorMessageOf(error)
797
+ logger.error('pubsub.subscribe_failed', {
798
+ channel,
799
+ ...errorAttributes(error)
791
800
  })
792
801
  scheduleResubscribe('subscribe-failed')
793
802
  }
@@ -926,7 +935,7 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
926
935
  throw error
927
936
  }
928
937
 
929
- subscriberLogger.info(`Subscribing to ${channelName}`)
938
+ subscriberLogger.debug('pubsub.subscribing', { channel: channelName })
930
939
 
931
940
  let messageCount = 0
932
941
  let droppedCount = 0
@@ -1051,7 +1060,8 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
1051
1060
  span?.setAttribute('pubsub.message_count', messageCount)
1052
1061
  span?.setAttribute('pubsub.dropped_count', droppedCount)
1053
1062
  tracing.end(span, ...error)
1054
- subscriberLogger.info(`Unsubscribed from ${channelName}`, {
1063
+ subscriberLogger.debug('pubsub.unsubscribed', {
1064
+ channel: channelName,
1055
1065
  messageCount,
1056
1066
  droppedCount,
1057
1067
  durationMs: Math.round(durationMs)
@@ -1106,10 +1116,10 @@ export function createLiveRuntime(options: LiveRuntimeOptions) {
1106
1116
  if (items.length > maxReplay) replayGap = true
1107
1117
  } catch (error) {
1108
1118
  replayGap = true
1109
- subscriberLogger.warn(
1110
- `Failed to replay backlog for ${channelName}`,
1111
- { error: errorMessageOf(error) }
1112
- )
1119
+ subscriberLogger.warn('pubsub.replay_failed', {
1120
+ channel: channelName,
1121
+ ...errorAttributes(error)
1122
+ })
1113
1123
  }
1114
1124
  }
1115
1125
  for (const { data, id } of replaying ?? [])
package/src/otel.ts CHANGED
@@ -195,6 +195,14 @@ export function errorMessageOf(error: unknown): string {
195
195
  return error instanceof Error ? error.message : String(error)
196
196
  }
197
197
 
198
+ /** Error fields for a log line, named like the `fn.completed` ones. */
199
+ export function errorAttributes(error: unknown) {
200
+ return {
201
+ error_type: error instanceof Error ? error.name : typeof error,
202
+ error_message: errorMessageOf(error)
203
+ }
204
+ }
205
+
198
206
  function protectSpan<T extends SpanLike>(span: T): T {
199
207
  return new Proxy(span, {
200
208
  get(target, key) {