autotel-adapters 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/cloudflare.cjs +60 -124
  2. package/dist/cloudflare.cjs.map +1 -1
  3. package/dist/cloudflare.d.cts +24 -24
  4. package/dist/cloudflare.d.cts.map +1 -0
  5. package/dist/cloudflare.d.ts +24 -24
  6. package/dist/cloudflare.d.ts.map +1 -0
  7. package/dist/cloudflare.js +69 -3
  8. package/dist/cloudflare.js.map +1 -1
  9. package/dist/core.cjs +94 -74
  10. package/dist/core.cjs.map +1 -1
  11. package/dist/core.d.cts +20 -19
  12. package/dist/core.d.cts.map +1 -0
  13. package/dist/core.d.ts +20 -19
  14. package/dist/core.d.ts.map +1 -0
  15. package/dist/core.js +110 -2
  16. package/dist/core.js.map +1 -1
  17. package/dist/express.cjs +67 -127
  18. package/dist/express.cjs.map +1 -1
  19. package/dist/express.d.cts +24 -24
  20. package/dist/express.d.cts.map +1 -0
  21. package/dist/express.d.ts +24 -24
  22. package/dist/express.d.ts.map +1 -0
  23. package/dist/express.js +78 -3
  24. package/dist/express.js.map +1 -1
  25. package/dist/fastify.cjs +58 -118
  26. package/dist/fastify.cjs.map +1 -1
  27. package/dist/fastify.d.cts +24 -24
  28. package/dist/fastify.d.cts.map +1 -0
  29. package/dist/fastify.d.ts +24 -24
  30. package/dist/fastify.d.ts.map +1 -0
  31. package/dist/fastify.js +69 -3
  32. package/dist/fastify.js.map +1 -1
  33. package/dist/hono.cjs +18 -48
  34. package/dist/hono.cjs.map +1 -1
  35. package/dist/hono.d.cts +6 -6
  36. package/dist/hono.d.cts.map +1 -0
  37. package/dist/hono.d.ts +6 -6
  38. package/dist/hono.d.ts.map +1 -0
  39. package/dist/hono.js +22 -3
  40. package/dist/hono.js.map +1 -1
  41. package/dist/index.cjs +27 -455
  42. package/dist/index.d.cts +9 -11
  43. package/dist/index.d.ts +9 -11
  44. package/dist/index.js +10 -10
  45. package/dist/next.cjs +56 -119
  46. package/dist/next.cjs.map +1 -1
  47. package/dist/next.d.cts +21 -21
  48. package/dist/next.d.cts.map +1 -0
  49. package/dist/next.d.ts +21 -21
  50. package/dist/next.d.ts.map +1 -0
  51. package/dist/next.js +65 -3
  52. package/dist/next.js.map +1 -1
  53. package/dist/nitro.cjs +50 -93
  54. package/dist/nitro.cjs.map +1 -1
  55. package/dist/nitro.d.cts +19 -19
  56. package/dist/nitro.d.cts.map +1 -0
  57. package/dist/nitro.d.ts +19 -19
  58. package/dist/nitro.d.ts.map +1 -0
  59. package/dist/nitro.js +62 -3
  60. package/dist/nitro.js.map +1 -1
  61. package/dist/tanstack.cjs +16 -46
  62. package/dist/tanstack.cjs.map +1 -1
  63. package/dist/tanstack.d.cts +9 -9
  64. package/dist/tanstack.d.cts.map +1 -0
  65. package/dist/tanstack.d.ts +9 -9
  66. package/dist/tanstack.d.ts.map +1 -0
  67. package/dist/tanstack.js +20 -3
  68. package/dist/tanstack.js.map +1 -1
  69. package/package.json +6 -5
  70. package/dist/chunk-2YPL66HM.js +0 -79
  71. package/dist/chunk-2YPL66HM.js.map +0 -1
  72. package/dist/chunk-6TOW47TB.js +0 -70
  73. package/dist/chunk-6TOW47TB.js.map +0 -1
  74. package/dist/chunk-DJ2OU3S6.js +0 -90
  75. package/dist/chunk-DJ2OU3S6.js.map +0 -1
  76. package/dist/chunk-FAHH33UI.js +0 -76
  77. package/dist/chunk-FAHH33UI.js.map +0 -1
  78. package/dist/chunk-HTZFHBTN.js +0 -82
  79. package/dist/chunk-HTZFHBTN.js.map +0 -1
  80. package/dist/chunk-JH5ZTTLF.js +0 -23
  81. package/dist/chunk-JH5ZTTLF.js.map +0 -1
  82. package/dist/chunk-U3U4WH42.js +0 -21
  83. package/dist/chunk-U3U4WH42.js.map +0 -1
  84. package/dist/chunk-VJZDW2DS.js +0 -87
  85. package/dist/chunk-VJZDW2DS.js.map +0 -1
  86. package/dist/index.cjs.map +0 -1
  87. package/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/nitro.ts"],"names":["useLogger","getRequestLogger","parseError","createStructuredError","createDrainPipeline","AsyncLocalStorage","trace"],"mappings":"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","file":"nitro.cjs","sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n trace,\n type ParsedError,\n type RequestLogger,\n type RequestLoggerOptions,\n type RequestLogSnapshot,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\n\nexport interface AdapterUseLoggerOptions<TContext> {\n adapterName: string;\n enrich?: (context: TContext) => Record<string, unknown> | undefined;\n}\n\nexport interface AdapterToolkit<TContext> {\n useLogger: (\n context?: TContext,\n options?: RequestLoggerOptions,\n ) => RequestLogger;\n parseError: (error: unknown) => ParsedError;\n createStructuredError: (input: StructuredErrorInput) => StructuredError;\n createDrainPipeline: <T = unknown>(\n options?: DrainPipelineOptions<T>,\n ) => (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;\n}\n\nexport function createUseLogger<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n) {\n return function useLogger(\n context?: TContext,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger {\n let logger: RequestLogger;\n try {\n logger = getRequestLogger(undefined, requestLoggerOptions);\n } catch {\n throw new Error(\n `[autotel-adapters/${options.adapterName}] No active trace context. ` +\n `Wrap your handler with autotel trace instrumentation before calling useLogger().`,\n );\n }\n\n if (context && options.enrich) {\n const extra = options.enrich(context);\n if (extra && Object.keys(extra).length > 0) {\n logger.set(extra);\n }\n }\n\n return logger;\n };\n}\n\nexport interface RequestRunnerOptions {\n requestLoggerOptions?: RequestLoggerOptions;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n /** Fields merged into the wide event at emit time (e.g. response status). */\n finalize?: () => Record<string, unknown> | undefined;\n}\n\n/**\n * Build a request runner bound to one framework's logger storage. The returned\n * function opens a span, creates a request logger, runs `handler` inside the\n * storage so `useLogger()` resolves it, records thrown errors, and emits one\n * wide event when the handler settles (unless `autoEmit` is `false`).\n */\nexport function createRequestRunner(storage: AsyncLocalStorage<RequestLogger>) {\n return function runRequest<T>(\n spanName: string,\n enrich: (log: RequestLogger) => void,\n handler: () => T | Promise<T>,\n options?: RequestRunnerOptions,\n ): Promise<T> {\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (): Promise<T> => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n enrich(log);\n try {\n return await storage.run(log, () => handler());\n } catch (error) {\n log.error(error instanceof Error ? error : new Error(String(error)));\n throw error;\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow(options?.finalize?.());\n }\n }\n },\n );\n return wrapped();\n };\n}\n\nexport function createAdapterToolkit<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n): AdapterToolkit<TContext> {\n return {\n useLogger: createUseLogger(options),\n parseError,\n createStructuredError,\n createDrainPipeline,\n };\n}\n\n/**\n * Description of a single adapter config field. `env` is the ordered list of\n * environment variables to fall back to.\n */\nexport interface ConfigField<T> {\n key: keyof T & string;\n env?: string[];\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined;\n for (const key of envKeys) {\n const value = process.env[key];\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * Returns true when at least one env-backed field is not provided via\n * `overrides`, meaning runtime config may still contribute and should be\n * probed to preserve precedence (`overrides > runtime > env`).\n *\n * @example\n * ```ts\n * const FIELDS: ConfigField<MyAdapterConfig>[] = [\n * { key: 'token', env: ['MY_ADAPTER_TOKEN'] },\n * { key: 'endpoint', env: ['MY_ADAPTER_URL'] },\n * ]\n *\n * if (shouldProbeRuntime(FIELDS, overrides)) {\n * runtimeConfig = await loadRuntimeConfig()\n * }\n * ```\n */\nexport function shouldProbeRuntime<T>(\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): boolean {\n return fields.some(({ key, env }) => {\n if (!env || env.length === 0) return false;\n if (overrides?.[key] !== undefined) return false;\n return true;\n });\n}\n\n/**\n * Resolve adapter configuration with the standard priority chain:\n *\n * 1. `overrides` passed to the adapter factory\n * 2. `runtimeConfig.autotel.{namespace}.{key}` (if a probe was performed)\n * 3. `runtimeConfig.{namespace}.{key}` (if a probe was performed)\n * 4. `process.env[envKey]` for each env in `field.env`\n *\n * Pass an async `probe` to defer the runtime config lookup so it is only\n * invoked when runtime resolution is needed (i.e. at least one env-backed\n * field is not set by overrides). Adapters that have no probe target may pass\n * `() => Promise.resolve(undefined)`.\n */\nexport async function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides: Partial<T> | undefined,\n probe: () => Promise<Record<string, any> | undefined>,\n): Promise<Partial<T>> {\n const runtimeConfig = shouldProbeRuntime(fields, overrides)\n ? await probe()\n : undefined;\n const autotelNs = runtimeConfig?.autotel?.[namespace];\n const rootNs = runtimeConfig?.[namespace];\n\n const config: Record<string, unknown> = {};\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key] ??\n autotelNs?.[key] ??\n rootNs?.[key] ??\n resolveEnv(env);\n }\n\n return config as Partial<T>;\n}\n\nexport type HeadersLike =\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n\nexport function getHeader(\n headers: HeadersLike | undefined,\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n if ('get' in headers && typeof headers.get === 'function') {\n return headers.get(name) ?? undefined;\n }\n const dictionary = headers as Record<string, string | undefined>;\n const value = dictionary[name] ?? dictionary[name.toLowerCase()];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport type {\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n ParsedError,\n StructuredError,\n StructuredErrorInput,\n DrainPipelineOptions,\n PipelineDrainFn,\n};\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n trace,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger } from './core';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions {\n spanName?: string | ((event: NitroEventLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nfunction enrichFromEvent(\n event?: NitroEventLike,\n): Record<string, unknown> | undefined {\n if (!event) return undefined;\n\n return {\n ...(event.method ? { 'http.request.method': event.method } : {}),\n ...(event.path ? { 'http.route': event.path } : {}),\n ...(typeof event.context?.requestId === 'string'\n ? { 'http.request.id': event.context.requestId }\n : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\nconst nitroLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nexport function useLogger(\n event?: NitroEventLike,\n serviceOrOptions?: string | RequestLoggerOptions,\n): RequestLogger {\n const stored = nitroLoggerStorage.getStore();\n const logger = stored ??\n (\n typeof serviceOrOptions === 'string'\n ? baseUseLogger(event)\n : baseUseLogger(event, serviceOrOptions)\n );\n\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n\n return logger;\n}\n\nexport function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n options?: NitroWithAutotelOptions,\n): (event: TEvent) => Promise<TReturn> {\n return async (event: TEvent): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(event)\n : (options?.spanName ?? `nitro.${event.method ?? 'request'}`);\n\n const wrapped = trace({ name: spanName }, (ctx) => async (innerEvent: TEvent) => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromEvent(innerEvent);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerEvent);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nitroLoggerStorage.run(log, async () =>\n handler(innerEvent),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n });\n\n return await wrapped(event);\n };\n}\n\nexport function createNitroAdapter(options?: NitroWithAutotelOptions) {\n const toolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: (event) => ({\n ...enrichFromEvent(event),\n ...(options?.enrich?.(event) ?? {}),\n }),\n });\n\n return {\n withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n ) => withAutotelEventHandler(handler, options),\n useLogger,\n parseError: toolkit.parseError,\n createStructuredError: toolkit.createStructuredError,\n createDrainPipeline: toolkit.createDrainPipeline,\n };\n}\n\nexport const nitroToolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\n"]}
1
+ {"version":3,"file":"nitro.cjs","names":["createUseLogger","AsyncLocalStorage","createAdapterToolkit"],"sources":["../src/nitro.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n trace,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger } from './core';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions {\n spanName?: string | ((event: NitroEventLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nfunction enrichFromEvent(\n event?: NitroEventLike,\n): Record<string, unknown> | undefined {\n if (!event) return undefined;\n\n return {\n ...(event.method ? { 'http.request.method': event.method } : {}),\n ...(event.path ? { 'http.route': event.path } : {}),\n ...(typeof event.context?.requestId === 'string'\n ? { 'http.request.id': event.context.requestId }\n : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\nconst nitroLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nexport function useLogger(\n event?: NitroEventLike,\n serviceOrOptions?: string | RequestLoggerOptions,\n): RequestLogger {\n const stored = nitroLoggerStorage.getStore();\n const logger = stored ??\n (\n typeof serviceOrOptions === 'string'\n ? baseUseLogger(event)\n : baseUseLogger(event, serviceOrOptions)\n );\n\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n\n return logger;\n}\n\nexport function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n options?: NitroWithAutotelOptions,\n): (event: TEvent) => Promise<TReturn> {\n return async (event: TEvent): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(event)\n : (options?.spanName ?? `nitro.${event.method ?? 'request'}`);\n\n const wrapped = trace({ name: spanName }, (ctx) => async (innerEvent: TEvent) => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromEvent(innerEvent);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerEvent);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nitroLoggerStorage.run(log, async () =>\n handler(innerEvent),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n });\n\n return await wrapped(event);\n };\n}\n\nexport function createNitroAdapter(options?: NitroWithAutotelOptions) {\n const toolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: (event) => ({\n ...enrichFromEvent(event),\n ...(options?.enrich?.(event) ?? {}),\n }),\n });\n\n return {\n withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n ) => withAutotelEventHandler(handler, options),\n useLogger,\n parseError: toolkit.parseError,\n createStructuredError: toolkit.createStructuredError,\n createDrainPipeline: toolkit.createDrainPipeline,\n };\n}\n\nexport const nitroToolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\n"],"mappings":";;;;;;AAuBA,SAAS,gBACP,OACqC;CACrC,IAAI,CAAC,OAAO,OAAO;CAEnB,OAAO;EACL,GAAI,MAAM,SAAS,EAAE,uBAAuB,MAAM,OAAO,IAAI,CAAC;EAC9D,GAAI,MAAM,OAAO,EAAE,cAAc,MAAM,KAAK,IAAI,CAAC;EACjD,GAAI,OAAO,MAAM,SAAS,cAAc,WACpC,EAAE,mBAAmB,MAAM,QAAQ,UAAU,IAC7C,CAAC;CACP;AACF;AAEA,MAAM,gBAAgBA,6BAAgC;CACpD,aAAa;CACb,QAAQ;AACV,CAAC;AACD,MAAM,qBAAqB,IAAIC,mCAAiC;AAEhE,SAAgB,UACd,OACA,kBACe;CAEf,MAAM,SADS,mBAAmB,SACd,MAElB,OAAO,qBAAqB,WACxB,cAAc,KAAK,IACnB,cAAc,OAAO,gBAAgB;CAG3C,IAAI,OAAO,qBAAqB,YAAY,iBAAiB,SAAS,GACpE,OAAO,IAAI,EAAE,SAAS,iBAAiB,CAAC;CAG1C,OAAO;AACT;AAEA,SAAgB,wBACd,SACA,SACqC;CACrC,OAAO,OAAO,UAAoC;EA2BhD,OAAO,yBArBe,EAAE,MAJtB,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,KAAK,IACrB,SAAS,YAAY,SAAS,MAAM,UAAU,YAEd,IAAI,QAAQ,OAAO,eAAuB;GAC/E,MAAM,oCAAuB,KAAK,SAAS,oBAAoB;GAC/D,MAAM,OAAO,gBAAgB,UAAU;GACvC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACrC,IAAI,IAAI,IAAI;GAEd,MAAM,SAAS,SAAS,SAAS,UAAU;GAC3C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAEhB,IAAI;IACF,OAAO,MAAM,mBAAmB,IAAI,KAAK,YACvC,QAAQ,UAAU,CACpB;GACF,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;GAEhB;EACF,CAEmB,CAAC,CAAC,KAAK;CAC5B;AACF;AAEA,SAAgB,mBAAmB,SAAmC;CACpE,MAAM,UAAUC,kCAAqC;EACnD,aAAa;EACb,SAAS,WAAW;GAClB,GAAG,gBAAgB,KAAK;GACxB,GAAI,SAAS,SAAS,KAAK,KAAK,CAAC;EACnC;CACF,CAAC;CAED,OAAO;EACL,0BACE,YACG,wBAAwB,SAAS,OAAO;EAC7C;EACA,YAAY,QAAQ;EACpB,uBAAuB,QAAQ;EAC/B,qBAAqB,QAAQ;CAC/B;AACF;AAEA,MAAa,eAAeA,kCAAqC;CAC/D,aAAa;CACb,QAAQ;AACV,CAAC"}
package/dist/nitro.d.cts CHANGED
@@ -1,29 +1,29 @@
1
- import { AdapterToolkit } from './core.cjs';
2
- import * as autotel from 'autotel';
3
- import { RequestLoggerOptions, RequestLogger } from 'autotel';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.cjs";
2
+ import { RequestLogger, RequestLoggerOptions } from "autotel";
5
3
 
4
+ //#region src/nitro.d.ts
6
5
  interface NitroEventLike {
7
- method?: string;
8
- path?: string;
9
- context?: Record<string, unknown>;
6
+ method?: string;
7
+ path?: string;
8
+ context?: Record<string, unknown>;
10
9
  }
11
10
  interface NitroWithAutotelOptions {
12
- spanName?: string | ((event: NitroEventLike) => string);
13
- requestLoggerOptions?: RequestLoggerOptions;
14
- enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;
15
- /** Emit one wide event automatically when the handler settles. Default `true`. */
16
- autoEmit?: boolean;
11
+ spanName?: string | ((event: NitroEventLike) => string);
12
+ requestLoggerOptions?: RequestLoggerOptions;
13
+ enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;
14
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
15
+ autoEmit?: boolean;
17
16
  }
18
17
  declare function useLogger(event?: NitroEventLike, serviceOrOptions?: string | RequestLoggerOptions): RequestLogger;
19
18
  declare function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>, options?: NitroWithAutotelOptions): (event: TEvent) => Promise<TReturn>;
20
19
  declare function createNitroAdapter(options?: NitroWithAutotelOptions): {
21
- withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>) => (event: TEvent) => Promise<TReturn>;
22
- useLogger: typeof useLogger;
23
- parseError: (error: unknown) => autotel.ParsedError;
24
- createStructuredError: (input: autotel.StructuredErrorInput) => autotel.StructuredError;
25
- createDrainPipeline: <T = unknown>(options?: autotel.DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => autotel.PipelineDrainFn<T>;
20
+ withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>) => (event: TEvent) => Promise<TReturn>;
21
+ useLogger: typeof useLogger;
22
+ parseError: (error: unknown) => import("autotel").ParsedError;
23
+ createStructuredError: (input: import("autotel").StructuredErrorInput) => import("autotel").StructuredError;
24
+ createDrainPipeline: <T = unknown>(options?: import("autotel").DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => import("autotel").PipelineDrainFn<T>;
26
25
  };
27
26
  declare const nitroToolkit: AdapterToolkit<NitroEventLike>;
28
-
29
- export { type NitroEventLike, type NitroWithAutotelOptions, createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
27
+ //#endregion
28
+ export { NitroEventLike, NitroWithAutotelOptions, createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
29
+ //# sourceMappingURL=nitro.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nitro.d.cts","names":[],"sources":["../src/nitro.ts"],"mappings":";;;;UASiB,cAAA;EACf,MAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,uBAAA;EACf,QAAA,cAAsB,KAAA,EAAO,cAAA;EAC7B,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,KAAA,EAAO,cAAA,KAAmB,MAAA;EANpC;EAQA,QAAA;AAAA;AAAA,iBAuBc,SAAA,CACd,KAAA,GAAQ,cAAA,EACR,gBAAA,YAA4B,oBAAA,GAC3B,aAAA;AAAA,iBAgBa,uBAAA,gBAAuC,cAAA,WACrD,OAAA,GAAU,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC9C,OAAA,GAAU,uBAAA,IACR,KAAA,EAAO,MAAA,KAAW,OAAA,CAAQ,OAAA;AAAA,iBAgCd,kBAAA,CAAmB,OAAA,GAAU,uBAAA;2CAUA,cAAA,WAAuB,OAAA,GACpD,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,KAAA,EAAA,MAAA,KAAA,OAAA,CAAA,OAAA;;;;;;cAS/C,YAAA,EAAY,cAAA,CAAA,cAAA"}
package/dist/nitro.d.ts CHANGED
@@ -1,29 +1,29 @@
1
- import { AdapterToolkit } from './core.js';
2
- import * as autotel from 'autotel';
3
- import { RequestLoggerOptions, RequestLogger } from 'autotel';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.js";
2
+ import { RequestLogger, RequestLoggerOptions } from "autotel";
5
3
 
4
+ //#region src/nitro.d.ts
6
5
  interface NitroEventLike {
7
- method?: string;
8
- path?: string;
9
- context?: Record<string, unknown>;
6
+ method?: string;
7
+ path?: string;
8
+ context?: Record<string, unknown>;
10
9
  }
11
10
  interface NitroWithAutotelOptions {
12
- spanName?: string | ((event: NitroEventLike) => string);
13
- requestLoggerOptions?: RequestLoggerOptions;
14
- enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;
15
- /** Emit one wide event automatically when the handler settles. Default `true`. */
16
- autoEmit?: boolean;
11
+ spanName?: string | ((event: NitroEventLike) => string);
12
+ requestLoggerOptions?: RequestLoggerOptions;
13
+ enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;
14
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
15
+ autoEmit?: boolean;
17
16
  }
18
17
  declare function useLogger(event?: NitroEventLike, serviceOrOptions?: string | RequestLoggerOptions): RequestLogger;
19
18
  declare function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>, options?: NitroWithAutotelOptions): (event: TEvent) => Promise<TReturn>;
20
19
  declare function createNitroAdapter(options?: NitroWithAutotelOptions): {
21
- withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>) => (event: TEvent) => Promise<TReturn>;
22
- useLogger: typeof useLogger;
23
- parseError: (error: unknown) => autotel.ParsedError;
24
- createStructuredError: (input: autotel.StructuredErrorInput) => autotel.StructuredError;
25
- createDrainPipeline: <T = unknown>(options?: autotel.DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => autotel.PipelineDrainFn<T>;
20
+ withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(handler: (event: TEvent) => TReturn | Promise<TReturn>) => (event: TEvent) => Promise<TReturn>;
21
+ useLogger: typeof useLogger;
22
+ parseError: (error: unknown) => import("autotel").ParsedError;
23
+ createStructuredError: (input: import("autotel").StructuredErrorInput) => import("autotel").StructuredError;
24
+ createDrainPipeline: <T = unknown>(options?: import("autotel").DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => import("autotel").PipelineDrainFn<T>;
26
25
  };
27
26
  declare const nitroToolkit: AdapterToolkit<NitroEventLike>;
28
-
29
- export { type NitroEventLike, type NitroWithAutotelOptions, createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
27
+ //#endregion
28
+ export { NitroEventLike, NitroWithAutotelOptions, createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
29
+ //# sourceMappingURL=nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nitro.d.ts","names":[],"sources":["../src/nitro.ts"],"mappings":";;;;UASiB,cAAA;EACf,MAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,uBAAA;EACf,QAAA,cAAsB,KAAA,EAAO,cAAA;EAC7B,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,KAAA,EAAO,cAAA,KAAmB,MAAA;EANpC;EAQA,QAAA;AAAA;AAAA,iBAuBc,SAAA,CACd,KAAA,GAAQ,cAAA,EACR,gBAAA,YAA4B,oBAAA,GAC3B,aAAA;AAAA,iBAgBa,uBAAA,gBAAuC,cAAA,WACrD,OAAA,GAAU,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC9C,OAAA,GAAU,uBAAA,IACR,KAAA,EAAO,MAAA,KAAW,OAAA,CAAQ,OAAA;AAAA,iBAgCd,kBAAA,CAAmB,OAAA,GAAU,uBAAA;2CAUA,cAAA,WAAuB,OAAA,GACpD,KAAA,EAAO,MAAA,KAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,KAAA,EAAA,MAAA,KAAA,OAAA,CAAA,OAAA;;;;;;cAS/C,YAAA,EAAY,cAAA,CAAA,cAAA"}
package/dist/nitro.js CHANGED
@@ -1,4 +1,63 @@
1
- export { createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler } from './chunk-FAHH33UI.js';
2
- import './chunk-DJ2OU3S6.js';
3
- //# sourceMappingURL=nitro.js.map
1
+ import { createAdapterToolkit, createUseLogger } from "./core.js";
2
+ import { getRequestLogger, trace } from "autotel";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
4
+
5
+ //#region src/nitro.ts
6
+ function enrichFromEvent(event) {
7
+ if (!event) return void 0;
8
+ return {
9
+ ...event.method ? { "http.request.method": event.method } : {},
10
+ ...event.path ? { "http.route": event.path } : {},
11
+ ...typeof event.context?.requestId === "string" ? { "http.request.id": event.context.requestId } : {}
12
+ };
13
+ }
14
+ const baseUseLogger = createUseLogger({
15
+ adapterName: "nitro",
16
+ enrich: enrichFromEvent
17
+ });
18
+ const nitroLoggerStorage = new AsyncLocalStorage();
19
+ function useLogger(event, serviceOrOptions) {
20
+ const logger = nitroLoggerStorage.getStore() ?? (typeof serviceOrOptions === "string" ? baseUseLogger(event) : baseUseLogger(event, serviceOrOptions));
21
+ if (typeof serviceOrOptions === "string" && serviceOrOptions.length > 0) logger.set({ service: serviceOrOptions });
22
+ return logger;
23
+ }
24
+ function withAutotelEventHandler(handler, options) {
25
+ return async (event) => {
26
+ return await trace({ name: typeof options?.spanName === "function" ? options.spanName(event) : options?.spanName ?? `nitro.${event.method ?? "request"}` }, (ctx) => async (innerEvent) => {
27
+ const log = getRequestLogger(ctx, options?.requestLoggerOptions);
28
+ const auto = enrichFromEvent(innerEvent);
29
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
30
+ const custom = options?.enrich?.(innerEvent);
31
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
32
+ try {
33
+ return await nitroLoggerStorage.run(log, async () => handler(innerEvent));
34
+ } finally {
35
+ if (options?.autoEmit !== false) log.emitNow();
36
+ }
37
+ })(event);
38
+ };
39
+ }
40
+ function createNitroAdapter(options) {
41
+ const toolkit = createAdapterToolkit({
42
+ adapterName: "nitro",
43
+ enrich: (event) => ({
44
+ ...enrichFromEvent(event),
45
+ ...options?.enrich?.(event) ?? {}
46
+ })
47
+ });
48
+ return {
49
+ withAutotelEventHandler: (handler) => withAutotelEventHandler(handler, options),
50
+ useLogger,
51
+ parseError: toolkit.parseError,
52
+ createStructuredError: toolkit.createStructuredError,
53
+ createDrainPipeline: toolkit.createDrainPipeline
54
+ };
55
+ }
56
+ const nitroToolkit = createAdapterToolkit({
57
+ adapterName: "nitro",
58
+ enrich: enrichFromEvent
59
+ });
60
+
61
+ //#endregion
62
+ export { createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
4
63
  //# sourceMappingURL=nitro.js.map
package/dist/nitro.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"nitro.js"}
1
+ {"version":3,"file":"nitro.js","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n trace,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger } from './core';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions {\n spanName?: string | ((event: NitroEventLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nfunction enrichFromEvent(\n event?: NitroEventLike,\n): Record<string, unknown> | undefined {\n if (!event) return undefined;\n\n return {\n ...(event.method ? { 'http.request.method': event.method } : {}),\n ...(event.path ? { 'http.route': event.path } : {}),\n ...(typeof event.context?.requestId === 'string'\n ? { 'http.request.id': event.context.requestId }\n : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\nconst nitroLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nexport function useLogger(\n event?: NitroEventLike,\n serviceOrOptions?: string | RequestLoggerOptions,\n): RequestLogger {\n const stored = nitroLoggerStorage.getStore();\n const logger = stored ??\n (\n typeof serviceOrOptions === 'string'\n ? baseUseLogger(event)\n : baseUseLogger(event, serviceOrOptions)\n );\n\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n\n return logger;\n}\n\nexport function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n options?: NitroWithAutotelOptions,\n): (event: TEvent) => Promise<TReturn> {\n return async (event: TEvent): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(event)\n : (options?.spanName ?? `nitro.${event.method ?? 'request'}`);\n\n const wrapped = trace({ name: spanName }, (ctx) => async (innerEvent: TEvent) => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromEvent(innerEvent);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerEvent);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nitroLoggerStorage.run(log, async () =>\n handler(innerEvent),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n });\n\n return await wrapped(event);\n };\n}\n\nexport function createNitroAdapter(options?: NitroWithAutotelOptions) {\n const toolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: (event) => ({\n ...enrichFromEvent(event),\n ...(options?.enrich?.(event) ?? {}),\n }),\n });\n\n return {\n withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n ) => withAutotelEventHandler(handler, options),\n useLogger,\n parseError: toolkit.parseError,\n createStructuredError: toolkit.createStructuredError,\n createDrainPipeline: toolkit.createDrainPipeline,\n };\n}\n\nexport const nitroToolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\n"],"mappings":";;;;;AAuBA,SAAS,gBACP,OACqC;CACrC,IAAI,CAAC,OAAO,OAAO;CAEnB,OAAO;EACL,GAAI,MAAM,SAAS,EAAE,uBAAuB,MAAM,OAAO,IAAI,CAAC;EAC9D,GAAI,MAAM,OAAO,EAAE,cAAc,MAAM,KAAK,IAAI,CAAC;EACjD,GAAI,OAAO,MAAM,SAAS,cAAc,WACpC,EAAE,mBAAmB,MAAM,QAAQ,UAAU,IAC7C,CAAC;CACP;AACF;AAEA,MAAM,gBAAgB,gBAAgC;CACpD,aAAa;CACb,QAAQ;AACV,CAAC;AACD,MAAM,qBAAqB,IAAI,kBAAiC;AAEhE,SAAgB,UACd,OACA,kBACe;CAEf,MAAM,SADS,mBAAmB,SACd,MAElB,OAAO,qBAAqB,WACxB,cAAc,KAAK,IACnB,cAAc,OAAO,gBAAgB;CAG3C,IAAI,OAAO,qBAAqB,YAAY,iBAAiB,SAAS,GACpE,OAAO,IAAI,EAAE,SAAS,iBAAiB,CAAC;CAG1C,OAAO;AACT;AAEA,SAAgB,wBACd,SACA,SACqC;CACrC,OAAO,OAAO,UAAoC;EA2BhD,OAAO,MArBS,MAAM,EAAE,MAJtB,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,KAAK,IACrB,SAAS,YAAY,SAAS,MAAM,UAAU,YAEd,IAAI,QAAQ,OAAO,eAAuB;GAC/E,MAAM,MAAM,iBAAiB,KAAK,SAAS,oBAAoB;GAC/D,MAAM,OAAO,gBAAgB,UAAU;GACvC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACrC,IAAI,IAAI,IAAI;GAEd,MAAM,SAAS,SAAS,SAAS,UAAU;GAC3C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAEhB,IAAI;IACF,OAAO,MAAM,mBAAmB,IAAI,KAAK,YACvC,QAAQ,UAAU,CACpB;GACF,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;GAEhB;EACF,CAEmB,CAAC,CAAC,KAAK;CAC5B;AACF;AAEA,SAAgB,mBAAmB,SAAmC;CACpE,MAAM,UAAU,qBAAqC;EACnD,aAAa;EACb,SAAS,WAAW;GAClB,GAAG,gBAAgB,KAAK;GACxB,GAAI,SAAS,SAAS,KAAK,KAAK,CAAC;EACnC;CACF,CAAC;CAED,OAAO;EACL,0BACE,YACG,wBAAwB,SAAS,OAAO;EAC7C;EACA,YAAY,QAAQ;EACpB,uBAAuB,QAAQ;EAC/B,qBAAqB,QAAQ;CAC/B;AACF;AAEA,MAAa,eAAe,qBAAqC;CAC/D,aAAa;CACb,QAAQ;AACV,CAAC"}
package/dist/tanstack.cjs CHANGED
@@ -1,53 +1,23 @@
1
- 'use strict';
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_core = require('./core.cjs');
2
3
 
3
- var autotel = require('autotel');
4
-
5
- // src/core.ts
6
- function createUseLogger(options) {
7
- return function useLogger2(context, requestLoggerOptions) {
8
- let logger;
9
- try {
10
- logger = autotel.getRequestLogger(void 0, requestLoggerOptions);
11
- } catch {
12
- throw new Error(
13
- `[autotel-adapters/${options.adapterName}] No active trace context. Wrap your handler with autotel trace instrumentation before calling useLogger().`
14
- );
15
- }
16
- if (context && options.enrich) {
17
- const extra = options.enrich(context);
18
- if (extra && Object.keys(extra).length > 0) {
19
- logger.set(extra);
20
- }
21
- }
22
- return logger;
23
- };
24
- }
25
- function createAdapterToolkit(options) {
26
- return {
27
- useLogger: createUseLogger(options),
28
- parseError: autotel.parseError,
29
- createStructuredError: autotel.createStructuredError,
30
- createDrainPipeline: autotel.createDrainPipeline
31
- };
32
- }
33
-
34
- // src/tanstack.ts
35
- var useLogger = createUseLogger({
36
- adapterName: "tanstack",
37
- enrich: (ctx) => ({
38
- ...ctx.method ? { "http.request.method": ctx.method } : {},
39
- ...ctx.pathname ? { "http.route": ctx.pathname } : {}
40
- })
4
+ //#region src/tanstack.ts
5
+ const useLogger = require_core.createUseLogger({
6
+ adapterName: "tanstack",
7
+ enrich: (ctx) => ({
8
+ ...ctx.method ? { "http.request.method": ctx.method } : {},
9
+ ...ctx.pathname ? { "http.route": ctx.pathname } : {}
10
+ })
41
11
  });
42
- var tanstackToolkit = createAdapterToolkit({
43
- adapterName: "tanstack",
44
- enrich: (ctx) => ({
45
- ...ctx.method ? { "http.request.method": ctx.method } : {},
46
- ...ctx.pathname ? { "http.route": ctx.pathname } : {}
47
- })
12
+ const tanstackToolkit = require_core.createAdapterToolkit({
13
+ adapterName: "tanstack",
14
+ enrich: (ctx) => ({
15
+ ...ctx.method ? { "http.request.method": ctx.method } : {},
16
+ ...ctx.pathname ? { "http.route": ctx.pathname } : {}
17
+ })
48
18
  });
49
19
 
20
+ //#endregion
50
21
  exports.tanstackToolkit = tanstackToolkit;
51
22
  exports.useLogger = useLogger;
52
- //# sourceMappingURL=tanstack.cjs.map
53
23
  //# sourceMappingURL=tanstack.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/tanstack.ts"],"names":["useLogger","getRequestLogger","parseError","createStructuredError","createDrainPipeline"],"mappings":";;;;;AAkCO,SAAS,gBACd,OAAA,EACA;AACA,EAAA,OAAO,SAASA,UAAAA,CACd,OAAA,EACA,oBAAA,EACe;AACf,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAASC,wBAAA,CAAiB,QAAW,oBAAoB,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,QAAQ,WAAW,CAAA,2GAAA;AAAA,OAE1C;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,IAAW,QAAQ,MAAA,EAAQ;AAC7B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AACpC,MAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AA4CO,SAAS,qBACd,OAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,gBAAgB,OAAO,CAAA;AAAA,gBAClCC,kBAAA;AAAA,2BACAC,6BAAA;AAAA,yBACAC;AAAA,GACF;AACF;;;AC/GO,IAAM,YAAY,eAAA,CAGtB;AAAA,EACD,WAAA,EAAa,UAAA;AAAA,EACb,MAAA,EAAQ,CAAC,GAAA,MAAS;AAAA,IAChB,GAAI,IAAI,MAAA,GAAS,EAAE,uBAAuB,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC1D,GAAI,IAAI,QAAA,GAAW,EAAE,cAAc,GAAA,CAAI,QAAA,KAAa;AAAC,GACvD;AACF,CAAC;AAEM,IAAM,kBAAkB,oBAAA,CAG5B;AAAA,EACD,WAAA,EAAa,UAAA;AAAA,EACb,MAAA,EAAQ,CAAC,GAAA,MAAS;AAAA,IAChB,GAAI,IAAI,MAAA,GAAS,EAAE,uBAAuB,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC1D,GAAI,IAAI,QAAA,GAAW,EAAE,cAAc,GAAA,CAAI,QAAA,KAAa;AAAC,GACvD;AACF,CAAC","file":"tanstack.cjs","sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n trace,\n type ParsedError,\n type RequestLogger,\n type RequestLoggerOptions,\n type RequestLogSnapshot,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\n\nexport interface AdapterUseLoggerOptions<TContext> {\n adapterName: string;\n enrich?: (context: TContext) => Record<string, unknown> | undefined;\n}\n\nexport interface AdapterToolkit<TContext> {\n useLogger: (\n context?: TContext,\n options?: RequestLoggerOptions,\n ) => RequestLogger;\n parseError: (error: unknown) => ParsedError;\n createStructuredError: (input: StructuredErrorInput) => StructuredError;\n createDrainPipeline: <T = unknown>(\n options?: DrainPipelineOptions<T>,\n ) => (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;\n}\n\nexport function createUseLogger<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n) {\n return function useLogger(\n context?: TContext,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger {\n let logger: RequestLogger;\n try {\n logger = getRequestLogger(undefined, requestLoggerOptions);\n } catch {\n throw new Error(\n `[autotel-adapters/${options.adapterName}] No active trace context. ` +\n `Wrap your handler with autotel trace instrumentation before calling useLogger().`,\n );\n }\n\n if (context && options.enrich) {\n const extra = options.enrich(context);\n if (extra && Object.keys(extra).length > 0) {\n logger.set(extra);\n }\n }\n\n return logger;\n };\n}\n\nexport interface RequestRunnerOptions {\n requestLoggerOptions?: RequestLoggerOptions;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n /** Fields merged into the wide event at emit time (e.g. response status). */\n finalize?: () => Record<string, unknown> | undefined;\n}\n\n/**\n * Build a request runner bound to one framework's logger storage. The returned\n * function opens a span, creates a request logger, runs `handler` inside the\n * storage so `useLogger()` resolves it, records thrown errors, and emits one\n * wide event when the handler settles (unless `autoEmit` is `false`).\n */\nexport function createRequestRunner(storage: AsyncLocalStorage<RequestLogger>) {\n return function runRequest<T>(\n spanName: string,\n enrich: (log: RequestLogger) => void,\n handler: () => T | Promise<T>,\n options?: RequestRunnerOptions,\n ): Promise<T> {\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (): Promise<T> => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n enrich(log);\n try {\n return await storage.run(log, () => handler());\n } catch (error) {\n log.error(error instanceof Error ? error : new Error(String(error)));\n throw error;\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow(options?.finalize?.());\n }\n }\n },\n );\n return wrapped();\n };\n}\n\nexport function createAdapterToolkit<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n): AdapterToolkit<TContext> {\n return {\n useLogger: createUseLogger(options),\n parseError,\n createStructuredError,\n createDrainPipeline,\n };\n}\n\n/**\n * Description of a single adapter config field. `env` is the ordered list of\n * environment variables to fall back to.\n */\nexport interface ConfigField<T> {\n key: keyof T & string;\n env?: string[];\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined;\n for (const key of envKeys) {\n const value = process.env[key];\n if (value) return value;\n }\n return undefined;\n}\n\n/**\n * Returns true when at least one env-backed field is not provided via\n * `overrides`, meaning runtime config may still contribute and should be\n * probed to preserve precedence (`overrides > runtime > env`).\n *\n * @example\n * ```ts\n * const FIELDS: ConfigField<MyAdapterConfig>[] = [\n * { key: 'token', env: ['MY_ADAPTER_TOKEN'] },\n * { key: 'endpoint', env: ['MY_ADAPTER_URL'] },\n * ]\n *\n * if (shouldProbeRuntime(FIELDS, overrides)) {\n * runtimeConfig = await loadRuntimeConfig()\n * }\n * ```\n */\nexport function shouldProbeRuntime<T>(\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): boolean {\n return fields.some(({ key, env }) => {\n if (!env || env.length === 0) return false;\n if (overrides?.[key] !== undefined) return false;\n return true;\n });\n}\n\n/**\n * Resolve adapter configuration with the standard priority chain:\n *\n * 1. `overrides` passed to the adapter factory\n * 2. `runtimeConfig.autotel.{namespace}.{key}` (if a probe was performed)\n * 3. `runtimeConfig.{namespace}.{key}` (if a probe was performed)\n * 4. `process.env[envKey]` for each env in `field.env`\n *\n * Pass an async `probe` to defer the runtime config lookup so it is only\n * invoked when runtime resolution is needed (i.e. at least one env-backed\n * field is not set by overrides). Adapters that have no probe target may pass\n * `() => Promise.resolve(undefined)`.\n */\nexport async function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides: Partial<T> | undefined,\n probe: () => Promise<Record<string, any> | undefined>,\n): Promise<Partial<T>> {\n const runtimeConfig = shouldProbeRuntime(fields, overrides)\n ? await probe()\n : undefined;\n const autotelNs = runtimeConfig?.autotel?.[namespace];\n const rootNs = runtimeConfig?.[namespace];\n\n const config: Record<string, unknown> = {};\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key] ??\n autotelNs?.[key] ??\n rootNs?.[key] ??\n resolveEnv(env);\n }\n\n return config as Partial<T>;\n}\n\nexport type HeadersLike =\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n\nexport function getHeader(\n headers: HeadersLike | undefined,\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n if ('get' in headers && typeof headers.get === 'function') {\n return headers.get(name) ?? undefined;\n }\n const dictionary = headers as Record<string, string | undefined>;\n const value = dictionary[name] ?? dictionary[name.toLowerCase()];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport type {\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n ParsedError,\n StructuredError,\n StructuredErrorInput,\n DrainPipelineOptions,\n PipelineDrainFn,\n};\n","import { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n\nexport const tanstackToolkit = createAdapterToolkit<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n"]}
1
+ {"version":3,"file":"tanstack.cjs","names":["createUseLogger","createAdapterToolkit"],"sources":["../src/tanstack.ts"],"sourcesContent":["import { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n\nexport const tanstackToolkit = createAdapterToolkit<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n"],"mappings":";;;;AAEA,MAAa,YAAYA,6BAGtB;CACD,aAAa;CACb,SAAS,SAAS;EAChB,GAAI,IAAI,SAAS,EAAE,uBAAuB,IAAI,OAAO,IAAI,CAAC;EAC1D,GAAI,IAAI,WAAW,EAAE,cAAc,IAAI,SAAS,IAAI,CAAC;CACvD;AACF,CAAC;AAED,MAAa,kBAAkBC,kCAG5B;CACD,aAAa;CACb,SAAS,SAAS;EAChB,GAAI,IAAI,SAAS,EAAE,uBAAuB,IAAI,OAAO,IAAI,CAAC;EAC1D,GAAI,IAAI,WAAW,EAAE,cAAc,IAAI,SAAS,IAAI,CAAC;CACvD;AACF,CAAC"}
@@ -1,14 +1,14 @@
1
- import { AdapterToolkit } from './core.cjs';
2
- import * as autotel from 'autotel';
3
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.cjs";
4
2
 
3
+ //#region src/tanstack.d.ts
5
4
  declare const useLogger: (context?: {
6
- pathname?: string;
7
- method?: string;
8
- } | undefined, requestLoggerOptions?: autotel.RequestLoggerOptions) => autotel.RequestLogger;
5
+ pathname?: string;
6
+ method?: string;
7
+ } | undefined, requestLoggerOptions?: import("autotel").RequestLoggerOptions) => import("autotel").RequestLogger;
9
8
  declare const tanstackToolkit: AdapterToolkit<{
10
- pathname?: string;
11
- method?: string;
9
+ pathname?: string;
10
+ method?: string;
12
11
  }>;
13
-
12
+ //#endregion
14
13
  export { tanstackToolkit, useLogger };
14
+ //# sourceMappingURL=tanstack.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack.d.cts","names":[],"sources":["../src/tanstack.ts"],"mappings":";;;cAEa,SAAA,GAAS,OAAA;;;;cAWT,eAAA,EASX,cAT0B"}
@@ -1,14 +1,14 @@
1
- import { AdapterToolkit } from './core.js';
2
- import * as autotel from 'autotel';
3
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.js";
4
2
 
3
+ //#region src/tanstack.d.ts
5
4
  declare const useLogger: (context?: {
6
- pathname?: string;
7
- method?: string;
8
- } | undefined, requestLoggerOptions?: autotel.RequestLoggerOptions) => autotel.RequestLogger;
5
+ pathname?: string;
6
+ method?: string;
7
+ } | undefined, requestLoggerOptions?: import("autotel").RequestLoggerOptions) => import("autotel").RequestLogger;
9
8
  declare const tanstackToolkit: AdapterToolkit<{
10
- pathname?: string;
11
- method?: string;
9
+ pathname?: string;
10
+ method?: string;
12
11
  }>;
13
-
12
+ //#endregion
14
13
  export { tanstackToolkit, useLogger };
14
+ //# sourceMappingURL=tanstack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tanstack.d.ts","names":[],"sources":["../src/tanstack.ts"],"mappings":";;;cAEa,SAAA,GAAS,OAAA;;;;cAWT,eAAA,EASX,cAT0B"}
package/dist/tanstack.js CHANGED
@@ -1,4 +1,21 @@
1
- export { tanstackToolkit, useLogger } from './chunk-U3U4WH42.js';
2
- import './chunk-DJ2OU3S6.js';
3
- //# sourceMappingURL=tanstack.js.map
1
+ import { createAdapterToolkit, createUseLogger } from "./core.js";
2
+
3
+ //#region src/tanstack.ts
4
+ const useLogger = createUseLogger({
5
+ adapterName: "tanstack",
6
+ enrich: (ctx) => ({
7
+ ...ctx.method ? { "http.request.method": ctx.method } : {},
8
+ ...ctx.pathname ? { "http.route": ctx.pathname } : {}
9
+ })
10
+ });
11
+ const tanstackToolkit = createAdapterToolkit({
12
+ adapterName: "tanstack",
13
+ enrich: (ctx) => ({
14
+ ...ctx.method ? { "http.request.method": ctx.method } : {},
15
+ ...ctx.pathname ? { "http.route": ctx.pathname } : {}
16
+ })
17
+ });
18
+
19
+ //#endregion
20
+ export { tanstackToolkit, useLogger };
4
21
  //# sourceMappingURL=tanstack.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"tanstack.js"}
1
+ {"version":3,"file":"tanstack.js","names":[],"sources":["../src/tanstack.ts"],"sourcesContent":["import { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n\nexport const tanstackToolkit = createAdapterToolkit<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n"],"mappings":";;;AAEA,MAAa,YAAY,gBAGtB;CACD,aAAa;CACb,SAAS,SAAS;EAChB,GAAI,IAAI,SAAS,EAAE,uBAAuB,IAAI,OAAO,IAAI,CAAC;EAC1D,GAAI,IAAI,WAAW,EAAE,cAAc,IAAI,SAAS,IAAI,CAAC;CACvD;AACF,CAAC;AAED,MAAa,kBAAkB,qBAG5B;CACD,aAAa;CACb,SAAS,SAAS;EAChB,GAAI,IAAI,SAAS,EAAE,uBAAuB,IAAI,OAAO,IAAI,CAAC;EAC1D,GAAI,IAAI,WAAW,EAAE,cAAc,IAAI,SAAS,IAAI,CAAC;CACvD;AACF,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "autotel-adapters",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "Framework adapters and composable DX helpers for autotel",
5
+ "license": "MIT",
5
6
  "type": "module",
6
7
  "main": "./dist/index.js",
7
8
  "types": "./dist/index.d.ts",
@@ -59,7 +60,7 @@
59
60
  "README.md"
60
61
  ],
61
62
  "dependencies": {
62
- "autotel": "3.5.0"
63
+ "autotel": "3.7.0"
63
64
  },
64
65
  "peerDependencies": {
65
66
  "hono": ">=4.12.23",
@@ -93,7 +94,7 @@
93
94
  "@types/node": "^25.9.2",
94
95
  "hono": "^4.12.23",
95
96
  "rimraf": "^6.1.3",
96
- "tsup": "^8.5.1",
97
+ "tsdown": "^0.22.2",
97
98
  "typescript": "^6.0.3",
98
99
  "vitest": "^4.1.8"
99
100
  },
@@ -103,8 +104,8 @@
103
104
  "directory": "packages/autotel-adapters"
104
105
  },
105
106
  "scripts": {
106
- "build": "tsup",
107
- "dev": "tsup --watch",
107
+ "build": "tsdown",
108
+ "dev": "tsdown --watch",
108
109
  "type-check": "tsc --noEmit",
109
110
  "lint": "eslint src",
110
111
  "test": "vitest run",
@@ -1,79 +0,0 @@
1
- import { createUseLogger, createRequestRunner, createAdapterToolkit } from './chunk-DJ2OU3S6.js';
2
- import { AsyncLocalStorage } from 'async_hooks';
3
- import { createDrainPipeline, createStructuredError, parseError } from 'autotel';
4
- export { createDrainPipeline, createStructuredError, parseError } from 'autotel';
5
-
6
- var expressLoggerStorage = new AsyncLocalStorage();
7
- function headerValue(headers, name) {
8
- if (!headers) return void 0;
9
- const value = headers[name] ?? headers[name.toLowerCase()];
10
- if (Array.isArray(value)) return value[0];
11
- return typeof value === "string" ? value : void 0;
12
- }
13
- function enrichFromRequest(request) {
14
- if (!request) return void 0;
15
- const url = request.originalUrl ?? request.url;
16
- const route = request.route?.path ?? request.path ?? url;
17
- const requestId = headerValue(request.headers, "x-request-id");
18
- return {
19
- ...request.method ? { "http.request.method": request.method } : {},
20
- ...url ? { "url.full": url } : {},
21
- ...route ? { "http.route": route } : {},
22
- ...requestId ? { "http.request.id": requestId } : {}
23
- };
24
- }
25
- var baseUseLogger = createUseLogger({
26
- adapterName: "express",
27
- enrich: enrichFromRequest
28
- });
29
- function useLogger(request, requestLoggerOptions) {
30
- const stored = expressLoggerStorage.getStore();
31
- if (stored) return stored;
32
- return baseUseLogger(request, requestLoggerOptions);
33
- }
34
- var runRequest = createRequestRunner(expressLoggerStorage);
35
- function withAutotel(handler, options) {
36
- return async (req, res, next) => {
37
- const spanName = typeof options?.spanName === "function" ? options.spanName(req) : options?.spanName ?? `express.${req.method ?? "request"}`;
38
- try {
39
- return await runRequest(
40
- spanName,
41
- (log) => {
42
- const auto = enrichFromRequest(req);
43
- if (auto && Object.keys(auto).length > 0) log.set(auto);
44
- const custom = options?.enrich?.(req);
45
- if (custom && Object.keys(custom).length > 0) log.set(custom);
46
- },
47
- () => handler(req, res, next),
48
- {
49
- requestLoggerOptions: options?.requestLoggerOptions,
50
- autoEmit: options?.autoEmit,
51
- finalize: () => res.statusCode ? { "http.response.status_code": res.statusCode } : void 0
52
- }
53
- );
54
- } catch (error) {
55
- if (typeof next === "function") {
56
- next(error);
57
- return void 0;
58
- }
59
- throw error;
60
- }
61
- };
62
- }
63
- function createExpressAdapter(options) {
64
- return {
65
- withAutotel: (handler) => withAutotel(handler, options),
66
- useLogger,
67
- parseError: (error) => parseError(error),
68
- createStructuredError: (input) => createStructuredError(input),
69
- createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
70
- };
71
- }
72
- var expressToolkit = createAdapterToolkit({
73
- adapterName: "express",
74
- enrich: enrichFromRequest
75
- });
76
-
77
- export { createExpressAdapter, expressToolkit, useLogger, withAutotel };
78
- //# sourceMappingURL=chunk-2YPL66HM.js.map
79
- //# sourceMappingURL=chunk-2YPL66HM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express.ts"],"names":[],"mappings":"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","file":"chunk-2YPL66HM.js","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type DrainPipelineOptions,\n type ParsedError,\n type PipelineDrainFn,\n type RequestLogger,\n type RequestLoggerOptions,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport {\n createAdapterToolkit,\n createRequestRunner,\n createUseLogger,\n} from './core';\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n route?: { path?: string };\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n}\n\nexport type ExpressNext = (err?: unknown) => void;\n\nexport interface ExpressWithAutotelOptions {\n spanName?: string | ((request: ExpressRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request: ExpressRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst expressLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: ExpressRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: ExpressRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.route?.path ?? request.path ?? url;\n const requestId = headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: ExpressRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = expressLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(expressLoggerStorage);\n\n/**\n * Wrap an Express route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(req)`), and emits one wide event when\n * the handler settles. Thrown errors are recorded and forwarded to `next`.\n */\nexport function withAutotel<\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n>(\n handler: (req: TReq, res: TRes, next?: ExpressNext) => TReturn | Promise<TReturn>,\n options?: ExpressWithAutotelOptions,\n): (req: TReq, res: TRes, next?: ExpressNext) => Promise<TReturn | undefined> {\n return async (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ): Promise<TReturn | undefined> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(req)\n : (options?.spanName ?? `express.${req.method ?? 'request'}`);\n\n try {\n return await runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(req);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrich?.(req);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(req, res, next),\n {\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n res.statusCode\n ? { 'http.response.status_code': res.statusCode }\n : undefined,\n },\n );\n } catch (error) {\n if (typeof next === 'function') {\n next(error);\n return undefined;\n }\n throw error;\n }\n };\n}\n\nexport function createExpressAdapter(options?: ExpressWithAutotelOptions) {\n return {\n withAutotel: <\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n >(\n handler: (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger,\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (input: StructuredErrorInput): StructuredError =>\n createStructuredError(input),\n createDrainPipeline: <T = unknown>(\n drainOptions?: DrainPipelineOptions<T>,\n ): ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>) =>\n createDrainPipeline(drainOptions),\n };\n}\n\nexport const expressToolkit = createAdapterToolkit<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"]}