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
package/dist/fastify.cjs CHANGED
@@ -1,137 +1,77 @@
1
- 'use strict';
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_core = require('./core.cjs');
3
+ let autotel = require("autotel");
4
+ let node_async_hooks = require("node:async_hooks");
2
5
 
3
- var async_hooks = require('async_hooks');
4
- var autotel = require('autotel');
5
-
6
- // src/fastify.ts
7
- function createUseLogger(options) {
8
- return function useLogger2(context, requestLoggerOptions) {
9
- let logger;
10
- try {
11
- logger = autotel.getRequestLogger(void 0, requestLoggerOptions);
12
- } catch {
13
- throw new Error(
14
- `[autotel-adapters/${options.adapterName}] No active trace context. Wrap your handler with autotel trace instrumentation before calling useLogger().`
15
- );
16
- }
17
- if (context && options.enrich) {
18
- const extra = options.enrich(context);
19
- if (extra && Object.keys(extra).length > 0) {
20
- logger.set(extra);
21
- }
22
- }
23
- return logger;
24
- };
25
- }
26
- function createRequestRunner(storage) {
27
- return function runRequest2(spanName, enrich, handler, options) {
28
- const wrapped = autotel.trace(
29
- { name: spanName },
30
- (ctx) => async () => {
31
- const log = autotel.getRequestLogger(ctx, options?.requestLoggerOptions);
32
- enrich(log);
33
- try {
34
- return await storage.run(log, () => handler());
35
- } catch (error) {
36
- log.error(error instanceof Error ? error : new Error(String(error)));
37
- throw error;
38
- } finally {
39
- if (options?.autoEmit !== false) {
40
- log.emitNow(options?.finalize?.());
41
- }
42
- }
43
- }
44
- );
45
- return wrapped();
46
- };
47
- }
48
- function createAdapterToolkit(options) {
49
- return {
50
- useLogger: createUseLogger(options),
51
- parseError: autotel.parseError,
52
- createStructuredError: autotel.createStructuredError,
53
- createDrainPipeline: autotel.createDrainPipeline
54
- };
55
- }
56
-
57
- // src/fastify.ts
58
- var fastifyLoggerStorage = new async_hooks.AsyncLocalStorage();
6
+ //#region src/fastify.ts
7
+ const fastifyLoggerStorage = new node_async_hooks.AsyncLocalStorage();
59
8
  function headerValue(headers, name) {
60
- if (!headers) return void 0;
61
- const value = headers[name] ?? headers[name.toLowerCase()];
62
- if (Array.isArray(value)) return value[0];
63
- return typeof value === "string" ? value : void 0;
9
+ if (!headers) return void 0;
10
+ const value = headers[name] ?? headers[name.toLowerCase()];
11
+ if (Array.isArray(value)) return value[0];
12
+ return typeof value === "string" ? value : void 0;
64
13
  }
65
14
  function enrichFromRequest(request) {
66
- if (!request) return void 0;
67
- const route = request.routeOptions?.url ?? request.routerPath ?? request.url;
68
- const requestId = request.id ?? headerValue(request.headers, "x-request-id");
69
- return {
70
- ...request.method ? { "http.request.method": request.method } : {},
71
- ...request.url ? { "url.full": request.url } : {},
72
- ...route ? { "http.route": route } : {},
73
- ...requestId ? { "http.request.id": requestId } : {}
74
- };
15
+ if (!request) return void 0;
16
+ const route = request.routeOptions?.url ?? request.routerPath ?? request.url;
17
+ const requestId = request.id ?? headerValue(request.headers, "x-request-id");
18
+ return {
19
+ ...request.method ? { "http.request.method": request.method } : {},
20
+ ...request.url ? { "url.full": request.url } : {},
21
+ ...route ? { "http.route": route } : {},
22
+ ...requestId ? { "http.request.id": requestId } : {}
23
+ };
75
24
  }
76
- var baseUseLogger = createUseLogger({
77
- adapterName: "fastify",
78
- enrich: enrichFromRequest
25
+ const baseUseLogger = require_core.createUseLogger({
26
+ adapterName: "fastify",
27
+ enrich: enrichFromRequest
79
28
  });
80
29
  function useLogger(request, requestLoggerOptions) {
81
- const stored = fastifyLoggerStorage.getStore();
82
- if (stored) return stored;
83
- return baseUseLogger(request, requestLoggerOptions);
30
+ const stored = fastifyLoggerStorage.getStore();
31
+ if (stored) return stored;
32
+ return baseUseLogger(request, requestLoggerOptions);
84
33
  }
85
- var runRequest = createRequestRunner(fastifyLoggerStorage);
34
+ const runRequest = require_core.createRequestRunner(fastifyLoggerStorage);
35
+ /**
36
+ * Wrap a Fastify route handler. Each request opens a span, gets a
37
+ * request-scoped logger (via `useLogger(request)`), and emits one wide event
38
+ * when the handler settles. Thrown errors are recorded, then rethrown for
39
+ * Fastify's error handling.
40
+ */
86
41
  function withAutotel(handler, options) {
87
- return (request, reply) => {
88
- const spanName = typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? `fastify.${request.method ?? "request"}`;
89
- return runRequest(
90
- spanName,
91
- (log) => {
92
- const auto = enrichFromRequest(request);
93
- if (auto && Object.keys(auto).length > 0) log.set(auto);
94
- const custom = options?.enrich?.(request);
95
- if (custom && Object.keys(custom).length > 0) log.set(custom);
96
- },
97
- () => handler(request, reply),
98
- {
99
- requestLoggerOptions: options?.requestLoggerOptions,
100
- autoEmit: options?.autoEmit,
101
- finalize: () => reply.statusCode ? { "http.response.status_code": reply.statusCode } : void 0
102
- }
103
- );
104
- };
42
+ return (request, reply) => {
43
+ return runRequest(typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? `fastify.${request.method ?? "request"}`, (log) => {
44
+ const auto = enrichFromRequest(request);
45
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
46
+ const custom = options?.enrich?.(request);
47
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
48
+ }, () => handler(request, reply), {
49
+ requestLoggerOptions: options?.requestLoggerOptions,
50
+ autoEmit: options?.autoEmit,
51
+ finalize: () => reply.statusCode ? { "http.response.status_code": reply.statusCode } : void 0
52
+ });
53
+ };
105
54
  }
106
55
  function createFastifyAdapter(options) {
107
- return {
108
- withAutotel: (handler) => withAutotel(handler, options),
109
- useLogger,
110
- parseError: (error) => autotel.parseError(error),
111
- createStructuredError: (input) => autotel.createStructuredError(input),
112
- createDrainPipeline: (drainOptions) => autotel.createDrainPipeline(drainOptions)
113
- };
56
+ return {
57
+ withAutotel: (handler) => withAutotel(handler, options),
58
+ useLogger,
59
+ parseError: (error) => (0, autotel.parseError)(error),
60
+ createStructuredError: (input) => (0, autotel.createStructuredError)(input),
61
+ createDrainPipeline: (drainOptions) => (0, autotel.createDrainPipeline)(drainOptions)
62
+ };
114
63
  }
115
- var fastifyToolkit = createAdapterToolkit({
116
- adapterName: "fastify",
117
- enrich: enrichFromRequest
64
+ const fastifyToolkit = require_core.createAdapterToolkit({
65
+ adapterName: "fastify",
66
+ enrich: enrichFromRequest
118
67
  });
119
68
 
120
- Object.defineProperty(exports, "createDrainPipeline", {
121
- enumerable: true,
122
- get: function () { return autotel.createDrainPipeline; }
123
- });
124
- Object.defineProperty(exports, "createStructuredError", {
125
- enumerable: true,
126
- get: function () { return autotel.createStructuredError; }
127
- });
128
- Object.defineProperty(exports, "parseError", {
129
- enumerable: true,
130
- get: function () { return autotel.parseError; }
131
- });
69
+ //#endregion
70
+ exports.createDrainPipeline = autotel.createDrainPipeline;
132
71
  exports.createFastifyAdapter = createFastifyAdapter;
72
+ exports.createStructuredError = autotel.createStructuredError;
133
73
  exports.fastifyToolkit = fastifyToolkit;
74
+ exports.parseError = autotel.parseError;
134
75
  exports.useLogger = useLogger;
135
76
  exports.withAutotel = withAutotel;
136
- //# sourceMappingURL=fastify.cjs.map
137
77
  //# sourceMappingURL=fastify.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/fastify.ts"],"names":["useLogger","getRequestLogger","runRequest","trace","parseError","createStructuredError","createDrainPipeline","AsyncLocalStorage"],"mappings":"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","file":"fastify.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 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 FastifyRequestLike {\n method?: string;\n url?: string;\n routeOptions?: { url?: string };\n routerPath?: string;\n id?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface FastifyReplyLike {\n statusCode?: number;\n}\n\nexport interface FastifyWithAutotelOptions {\n spanName?: string | ((request: FastifyRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst fastifyLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: FastifyRequestLike['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?: FastifyRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const route = request.routeOptions?.url ?? request.routerPath ?? request.url;\n const requestId = request.id ?? headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: FastifyRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = fastifyLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(fastifyLoggerStorage);\n\n/**\n * Wrap a Fastify route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(request)`), and emits one wide event\n * when the handler settles. Thrown errors are recorded, then rethrown for\n * Fastify's error handling.\n */\nexport function withAutotel<\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n>(\n handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>,\n options?: FastifyWithAutotelOptions,\n): (request: TReq, reply: TRes) => Promise<TReturn> {\n return (request: TReq, reply: TRes): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? `fastify.${request.method ?? 'request'}`);\n\n return runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(request);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrich?.(request);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(request, reply),\n {\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n reply.statusCode\n ? { 'http.response.status_code': reply.statusCode }\n : undefined,\n },\n );\n };\n}\n\nexport function createFastifyAdapter(options?: FastifyWithAutotelOptions) {\n return {\n withAutotel: <\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n >(\n handler: (request: TReq, reply: TRes) => 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 fastifyToolkit = createAdapterToolkit<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"]}
1
+ {"version":3,"file":"fastify.cjs","names":["AsyncLocalStorage","createUseLogger","createRequestRunner","createAdapterToolkit"],"sources":["../src/fastify.ts"],"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 FastifyRequestLike {\n method?: string;\n url?: string;\n routeOptions?: { url?: string };\n routerPath?: string;\n id?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface FastifyReplyLike {\n statusCode?: number;\n}\n\nexport interface FastifyWithAutotelOptions {\n spanName?: string | ((request: FastifyRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst fastifyLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: FastifyRequestLike['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?: FastifyRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const route = request.routeOptions?.url ?? request.routerPath ?? request.url;\n const requestId = request.id ?? headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: FastifyRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = fastifyLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(fastifyLoggerStorage);\n\n/**\n * Wrap a Fastify route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(request)`), and emits one wide event\n * when the handler settles. Thrown errors are recorded, then rethrown for\n * Fastify's error handling.\n */\nexport function withAutotel<\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n>(\n handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>,\n options?: FastifyWithAutotelOptions,\n): (request: TReq, reply: TRes) => Promise<TReturn> {\n return (request: TReq, reply: TRes): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? `fastify.${request.method ?? 'request'}`);\n\n return runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(request);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrich?.(request);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(request, reply),\n {\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n reply.statusCode\n ? { 'http.response.status_code': reply.statusCode }\n : undefined,\n },\n );\n };\n}\n\nexport function createFastifyAdapter(options?: FastifyWithAutotelOptions) {\n return {\n withAutotel: <\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n >(\n handler: (request: TReq, reply: TRes) => 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 fastifyToolkit = createAdapterToolkit<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAwCA,MAAM,uBAAuB,IAAIA,mCAAiC;AAElE,SAAS,YACP,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,YAAY;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM;CACvC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,QAAQ,QAAQ,cAAc,OAAO,QAAQ,cAAc,QAAQ;CACzE,MAAM,YAAY,QAAQ,MAAM,YAAY,QAAQ,SAAS,cAAc;CAE3E,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;CACtD;AACF;AAEA,MAAM,gBAAgBC,6BAAoC;CACxD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,qBAAqB,SAAS;CAC7C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,MAAM,aAAaC,iCAAoB,oBAAoB;;;;;;;AAQ3D,SAAgB,YAKd,SACA,SACkD;CAClD,QAAQ,SAAe,UAAkC;EAMvD,OAAO,WAJL,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,WAAW,QAAQ,UAAU,cAItD,QAAQ;GACP,MAAM,OAAO,kBAAkB,OAAO;GACtC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI;GACtD,MAAM,SAAS,SAAS,SAAS,OAAO;GACxC,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM;EAC9D,SACM,QAAQ,SAAS,KAAK,GAC5B;GACE,sBAAsB,SAAS;GAC/B,UAAU,SAAS;GACnB,gBACE,MAAM,aACF,EAAE,6BAA6B,MAAM,WAAW,IAChD;EACR,CACF;CACF;AACF;AAEA,SAAgB,qBAAqB,SAAqC;CACxE,OAAO;EACL,cAKE,YACG,YAAY,SAAS,OAAO;EACjC;EACA,aAAa,kCAA2C,KAAK;EAC7D,wBAAwB,6CACA,KAAK;EAC7B,sBACE,kDAEoB,YAAY;CACpC;AACF;AAEA,MAAa,iBAAiBC,kCAAyC;CACrE,aAAa;CACb,QAAQ;AACV,CAAC"}
@@ -1,27 +1,26 @@
1
- import { AdapterToolkit } from './core.cjs';
2
- import { RequestLoggerOptions, RequestLogger, ParsedError, StructuredErrorInput, StructuredError, DrainPipelineOptions, PipelineDrainFn } from 'autotel';
3
- export { createDrainPipeline, createStructuredError, parseError } from 'autotel';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.cjs";
2
+ import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
5
3
 
4
+ //#region src/fastify.d.ts
6
5
  interface FastifyRequestLike {
7
- method?: string;
6
+ method?: string;
7
+ url?: string;
8
+ routeOptions?: {
8
9
  url?: string;
9
- routeOptions?: {
10
- url?: string;
11
- };
12
- routerPath?: string;
13
- id?: string;
14
- headers?: Record<string, string | string[] | undefined>;
10
+ };
11
+ routerPath?: string;
12
+ id?: string;
13
+ headers?: Record<string, string | string[] | undefined>;
15
14
  }
16
15
  interface FastifyReplyLike {
17
- statusCode?: number;
16
+ statusCode?: number;
18
17
  }
19
18
  interface FastifyWithAutotelOptions {
20
- spanName?: string | ((request: FastifyRequestLike) => string);
21
- requestLoggerOptions?: RequestLoggerOptions;
22
- enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;
23
- /** Emit one wide event automatically when the handler settles. Default `true`. */
24
- autoEmit?: boolean;
19
+ spanName?: string | ((request: FastifyRequestLike) => string);
20
+ requestLoggerOptions?: RequestLoggerOptions;
21
+ enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;
22
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
23
+ autoEmit?: boolean;
25
24
  }
26
25
  declare function useLogger(request?: FastifyRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
27
26
  /**
@@ -32,12 +31,13 @@ declare function useLogger(request?: FastifyRequestLike, requestLoggerOptions?:
32
31
  */
33
32
  declare function withAutotel<TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>, options?: FastifyWithAutotelOptions): (request: TReq, reply: TRes) => Promise<TReturn>;
34
33
  declare function createFastifyAdapter(options?: FastifyWithAutotelOptions): {
35
- withAutotel: <TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>) => (request: TReq, reply: TRes) => Promise<TReturn>;
36
- useLogger: typeof useLogger;
37
- parseError: (error: unknown) => ParsedError;
38
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
39
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
34
+ withAutotel: <TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>) => (request: TReq, reply: TRes) => Promise<TReturn>;
35
+ useLogger: typeof useLogger;
36
+ parseError: (error: unknown) => ParsedError;
37
+ createStructuredError: (input: StructuredErrorInput) => StructuredError;
38
+ createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
40
39
  };
41
40
  declare const fastifyToolkit: AdapterToolkit<FastifyRequestLike>;
42
-
43
- export { type FastifyReplyLike, type FastifyRequestLike, type FastifyWithAutotelOptions, createFastifyAdapter, fastifyToolkit, useLogger, withAutotel };
41
+ //#endregion
42
+ export { FastifyReplyLike, FastifyRequestLike, FastifyWithAutotelOptions, createDrainPipeline, createFastifyAdapter, createStructuredError, fastifyToolkit, parseError, useLogger, withAutotel };
43
+ //# sourceMappingURL=fastify.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.cts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAmBiB,kBAAA;EACf,MAAA;EACA,GAAA;EACA,YAAA;IAAiB,GAAA;EAAA;EACjB,UAAA;EACA,EAAA;EACA,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,gBAAA;EACf,UAAU;AAAA;AAAA,UAGK,yBAAA;EACf,QAAA,cAAsB,OAAA,EAAS,kBAAA;EAC/B,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,EAAS,kBAAA,KAAuB,MAAA;EAP3B;EASf,QAAA;AAAA;AAAA,iBAoCc,SAAA,CACd,OAAA,GAAU,kBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AA/CS;AAGZ;;;;;AAHY,iBA6DI,WAAA,cACD,kBAAA,eACA,gBAAA,WAGb,OAAA,GAAU,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC3D,OAAA,GAAU,yBAAA,IACR,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,CAAQ,OAAA;AAAA,iBA4B3B,oBAAA,CAAqB,OAAA,GAAU,yBAAA;6BAG5B,kBAAA,eACA,gBAAA,WACN,OAAA,GAEG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,OAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,KAAA,OAAA,CAAA,OAAA;;kCAGvC,WAAA;iCACC,oBAAA,KAAuB,eAAA;qCAE/B,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,cAAA,EAAc,cAAA,CAAA,kBAAA"}
package/dist/fastify.d.ts CHANGED
@@ -1,27 +1,26 @@
1
- import { AdapterToolkit } from './core.js';
2
- import { RequestLoggerOptions, RequestLogger, ParsedError, StructuredErrorInput, StructuredError, DrainPipelineOptions, PipelineDrainFn } from 'autotel';
3
- export { createDrainPipeline, createStructuredError, parseError } from 'autotel';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.js";
2
+ import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
5
3
 
4
+ //#region src/fastify.d.ts
6
5
  interface FastifyRequestLike {
7
- method?: string;
6
+ method?: string;
7
+ url?: string;
8
+ routeOptions?: {
8
9
  url?: string;
9
- routeOptions?: {
10
- url?: string;
11
- };
12
- routerPath?: string;
13
- id?: string;
14
- headers?: Record<string, string | string[] | undefined>;
10
+ };
11
+ routerPath?: string;
12
+ id?: string;
13
+ headers?: Record<string, string | string[] | undefined>;
15
14
  }
16
15
  interface FastifyReplyLike {
17
- statusCode?: number;
16
+ statusCode?: number;
18
17
  }
19
18
  interface FastifyWithAutotelOptions {
20
- spanName?: string | ((request: FastifyRequestLike) => string);
21
- requestLoggerOptions?: RequestLoggerOptions;
22
- enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;
23
- /** Emit one wide event automatically when the handler settles. Default `true`. */
24
- autoEmit?: boolean;
19
+ spanName?: string | ((request: FastifyRequestLike) => string);
20
+ requestLoggerOptions?: RequestLoggerOptions;
21
+ enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;
22
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
23
+ autoEmit?: boolean;
25
24
  }
26
25
  declare function useLogger(request?: FastifyRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
27
26
  /**
@@ -32,12 +31,13 @@ declare function useLogger(request?: FastifyRequestLike, requestLoggerOptions?:
32
31
  */
33
32
  declare function withAutotel<TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>, options?: FastifyWithAutotelOptions): (request: TReq, reply: TRes) => Promise<TReturn>;
34
33
  declare function createFastifyAdapter(options?: FastifyWithAutotelOptions): {
35
- withAutotel: <TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>) => (request: TReq, reply: TRes) => Promise<TReturn>;
36
- useLogger: typeof useLogger;
37
- parseError: (error: unknown) => ParsedError;
38
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
39
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
34
+ withAutotel: <TReq extends FastifyRequestLike, TRes extends FastifyReplyLike, TReturn>(handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>) => (request: TReq, reply: TRes) => Promise<TReturn>;
35
+ useLogger: typeof useLogger;
36
+ parseError: (error: unknown) => ParsedError;
37
+ createStructuredError: (input: StructuredErrorInput) => StructuredError;
38
+ createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
40
39
  };
41
40
  declare const fastifyToolkit: AdapterToolkit<FastifyRequestLike>;
42
-
43
- export { type FastifyReplyLike, type FastifyRequestLike, type FastifyWithAutotelOptions, createFastifyAdapter, fastifyToolkit, useLogger, withAutotel };
41
+ //#endregion
42
+ export { FastifyReplyLike, FastifyRequestLike, FastifyWithAutotelOptions, createDrainPipeline, createFastifyAdapter, createStructuredError, fastifyToolkit, parseError, useLogger, withAutotel };
43
+ //# sourceMappingURL=fastify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.ts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAmBiB,kBAAA;EACf,MAAA;EACA,GAAA;EACA,YAAA;IAAiB,GAAA;EAAA;EACjB,UAAA;EACA,EAAA;EACA,OAAA,GAAU,MAAM;AAAA;AAAA,UAGD,gBAAA;EACf,UAAU;AAAA;AAAA,UAGK,yBAAA;EACf,QAAA,cAAsB,OAAA,EAAS,kBAAA;EAC/B,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,EAAS,kBAAA,KAAuB,MAAA;EAP3B;EASf,QAAA;AAAA;AAAA,iBAoCc,SAAA,CACd,OAAA,GAAU,kBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AA/CS;AAGZ;;;;;AAHY,iBA6DI,WAAA,cACD,kBAAA,eACA,gBAAA,WAGb,OAAA,GAAU,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC3D,OAAA,GAAU,yBAAA,IACR,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,CAAQ,OAAA;AAAA,iBA4B3B,oBAAA,CAAqB,OAAA,GAAU,yBAAA;6BAG5B,kBAAA,eACA,gBAAA,WACN,OAAA,GAEG,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,OAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,KAAA,OAAA,CAAA,OAAA;;kCAGvC,WAAA;iCACC,oBAAA,KAAuB,eAAA;qCAE/B,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,cAAA,EAAc,cAAA,CAAA,kBAAA"}
package/dist/fastify.js CHANGED
@@ -1,4 +1,70 @@
1
- export { createDrainPipeline, createFastifyAdapter, createStructuredError, fastifyToolkit, parseError, useLogger, withAutotel } from './chunk-6TOW47TB.js';
2
- import './chunk-DJ2OU3S6.js';
3
- //# sourceMappingURL=fastify.js.map
1
+ import { createAdapterToolkit, createRequestRunner, createUseLogger } from "./core.js";
2
+ import { createDrainPipeline, createStructuredError, parseError } from "autotel";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
4
+
5
+ //#region src/fastify.ts
6
+ const fastifyLoggerStorage = 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 route = request.routeOptions?.url ?? request.routerPath ?? request.url;
16
+ const requestId = request.id ?? headerValue(request.headers, "x-request-id");
17
+ return {
18
+ ...request.method ? { "http.request.method": request.method } : {},
19
+ ...request.url ? { "url.full": request.url } : {},
20
+ ...route ? { "http.route": route } : {},
21
+ ...requestId ? { "http.request.id": requestId } : {}
22
+ };
23
+ }
24
+ const baseUseLogger = createUseLogger({
25
+ adapterName: "fastify",
26
+ enrich: enrichFromRequest
27
+ });
28
+ function useLogger(request, requestLoggerOptions) {
29
+ const stored = fastifyLoggerStorage.getStore();
30
+ if (stored) return stored;
31
+ return baseUseLogger(request, requestLoggerOptions);
32
+ }
33
+ const runRequest = createRequestRunner(fastifyLoggerStorage);
34
+ /**
35
+ * Wrap a Fastify route handler. Each request opens a span, gets a
36
+ * request-scoped logger (via `useLogger(request)`), and emits one wide event
37
+ * when the handler settles. Thrown errors are recorded, then rethrown for
38
+ * Fastify's error handling.
39
+ */
40
+ function withAutotel(handler, options) {
41
+ return (request, reply) => {
42
+ return runRequest(typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? `fastify.${request.method ?? "request"}`, (log) => {
43
+ const auto = enrichFromRequest(request);
44
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
45
+ const custom = options?.enrich?.(request);
46
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
47
+ }, () => handler(request, reply), {
48
+ requestLoggerOptions: options?.requestLoggerOptions,
49
+ autoEmit: options?.autoEmit,
50
+ finalize: () => reply.statusCode ? { "http.response.status_code": reply.statusCode } : void 0
51
+ });
52
+ };
53
+ }
54
+ function createFastifyAdapter(options) {
55
+ return {
56
+ withAutotel: (handler) => withAutotel(handler, options),
57
+ useLogger,
58
+ parseError: (error) => parseError(error),
59
+ createStructuredError: (input) => createStructuredError(input),
60
+ createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
61
+ };
62
+ }
63
+ const fastifyToolkit = createAdapterToolkit({
64
+ adapterName: "fastify",
65
+ enrich: enrichFromRequest
66
+ });
67
+
68
+ //#endregion
69
+ export { createDrainPipeline, createFastifyAdapter, createStructuredError, fastifyToolkit, parseError, useLogger, withAutotel };
4
70
  //# sourceMappingURL=fastify.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fastify.js"}
1
+ {"version":3,"file":"fastify.js","names":[],"sources":["../src/fastify.ts"],"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 FastifyRequestLike {\n method?: string;\n url?: string;\n routeOptions?: { url?: string };\n routerPath?: string;\n id?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface FastifyReplyLike {\n statusCode?: number;\n}\n\nexport interface FastifyWithAutotelOptions {\n spanName?: string | ((request: FastifyRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst fastifyLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: FastifyRequestLike['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?: FastifyRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const route = request.routeOptions?.url ?? request.routerPath ?? request.url;\n const requestId = request.id ?? headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: FastifyRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = fastifyLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(fastifyLoggerStorage);\n\n/**\n * Wrap a Fastify route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(request)`), and emits one wide event\n * when the handler settles. Thrown errors are recorded, then rethrown for\n * Fastify's error handling.\n */\nexport function withAutotel<\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n>(\n handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>,\n options?: FastifyWithAutotelOptions,\n): (request: TReq, reply: TRes) => Promise<TReturn> {\n return (request: TReq, reply: TRes): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? `fastify.${request.method ?? 'request'}`);\n\n return runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(request);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrich?.(request);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(request, reply),\n {\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n reply.statusCode\n ? { 'http.response.status_code': reply.statusCode }\n : undefined,\n },\n );\n };\n}\n\nexport function createFastifyAdapter(options?: FastifyWithAutotelOptions) {\n return {\n withAutotel: <\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n >(\n handler: (request: TReq, reply: TRes) => 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 fastifyToolkit = createAdapterToolkit<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;AAwCA,MAAM,uBAAuB,IAAI,kBAAiC;AAElE,SAAS,YACP,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,YAAY;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM;CACvC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,QAAQ,QAAQ,cAAc,OAAO,QAAQ,cAAc,QAAQ;CACzE,MAAM,YAAY,QAAQ,MAAM,YAAY,QAAQ,SAAS,cAAc;CAE3E,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;CACtD;AACF;AAEA,MAAM,gBAAgB,gBAAoC;CACxD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,qBAAqB,SAAS;CAC7C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,MAAM,aAAa,oBAAoB,oBAAoB;;;;;;;AAQ3D,SAAgB,YAKd,SACA,SACkD;CAClD,QAAQ,SAAe,UAAkC;EAMvD,OAAO,WAJL,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,WAAW,QAAQ,UAAU,cAItD,QAAQ;GACP,MAAM,OAAO,kBAAkB,OAAO;GACtC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI;GACtD,MAAM,SAAS,SAAS,SAAS,OAAO;GACxC,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM;EAC9D,SACM,QAAQ,SAAS,KAAK,GAC5B;GACE,sBAAsB,SAAS;GAC/B,UAAU,SAAS;GACnB,gBACE,MAAM,aACF,EAAE,6BAA6B,MAAM,WAAW,IAChD;EACR,CACF;CACF;AACF;AAEA,SAAgB,qBAAqB,SAAqC;CACxE,OAAO;EACL,cAKE,YACG,YAAY,SAAS,OAAO;EACjC;EACA,aAAa,UAAgC,WAAW,KAAK;EAC7D,wBAAwB,UACtB,sBAAsB,KAAK;EAC7B,sBACE,iBAEA,oBAAoB,YAAY;CACpC;AACF;AAEA,MAAa,iBAAiB,qBAAyC;CACrE,aAAa;CACb,QAAQ;AACV,CAAC"}
package/dist/hono.cjs CHANGED
@@ -1,55 +1,25 @@
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/hono.ts
35
- var useLogger = createUseLogger({
36
- adapterName: "hono",
37
- enrich: (c) => ({
38
- "http.request.method": c.req.method,
39
- "url.full": c.req.url,
40
- "http.route": c.req.path
41
- })
4
+ //#region src/hono.ts
5
+ const useLogger = require_core.createUseLogger({
6
+ adapterName: "hono",
7
+ enrich: (c) => ({
8
+ "http.request.method": c.req.method,
9
+ "url.full": c.req.url,
10
+ "http.route": c.req.path
11
+ })
42
12
  });
43
- var honoToolkit = createAdapterToolkit({
44
- adapterName: "hono",
45
- enrich: (c) => ({
46
- "http.request.method": c.req.method,
47
- "url.full": c.req.url,
48
- "http.route": c.req.path
49
- })
13
+ const honoToolkit = require_core.createAdapterToolkit({
14
+ adapterName: "hono",
15
+ enrich: (c) => ({
16
+ "http.request.method": c.req.method,
17
+ "url.full": c.req.url,
18
+ "http.route": c.req.path
19
+ })
50
20
  });
51
21
 
22
+ //#endregion
52
23
  exports.honoToolkit = honoToolkit;
53
24
  exports.useLogger = useLogger;
54
- //# sourceMappingURL=hono.cjs.map
55
25
  //# sourceMappingURL=hono.cjs.map
package/dist/hono.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/hono.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;;;AC9GO,IAAM,YAAY,eAAA,CAAyB;AAAA,EAChD,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ,CAAC,CAAA,MAAO;AAAA,IACd,qBAAA,EAAuB,EAAE,GAAA,CAAI,MAAA;AAAA,IAC7B,UAAA,EAAY,EAAE,GAAA,CAAI,GAAA;AAAA,IAClB,YAAA,EAAc,EAAE,GAAA,CAAI;AAAA,GACtB;AACF,CAAC;AAEM,IAAM,cAAc,oBAAA,CAA8B;AAAA,EACvD,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ,CAAC,CAAA,MAAO;AAAA,IACd,qBAAA,EAAuB,EAAE,GAAA,CAAI,MAAA;AAAA,IAC7B,UAAA,EAAY,EAAE,GAAA,CAAI,GAAA;AAAA,IAClB,YAAA,EAAc,EAAE,GAAA,CAAI;AAAA,GACtB;AACF,CAAC","file":"hono.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 type { Context } from 'hono';\nimport { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n\nexport const honoToolkit = createAdapterToolkit<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n"]}
1
+ {"version":3,"file":"hono.cjs","names":["createUseLogger","createAdapterToolkit"],"sources":["../src/hono.ts"],"sourcesContent":["import type { Context } from 'hono';\nimport { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n\nexport const honoToolkit = createAdapterToolkit<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n"],"mappings":";;;;AAGA,MAAa,YAAYA,6BAAyB;CAChD,aAAa;CACb,SAAS,OAAO;EACd,uBAAuB,EAAE,IAAI;EAC7B,YAAY,EAAE,IAAI;EAClB,cAAc,EAAE,IAAI;CACtB;AACF,CAAC;AAED,MAAa,cAAcC,kCAA8B;CACvD,aAAa;CACb,SAAS,OAAO;EACd,uBAAuB,EAAE,IAAI;EAC7B,YAAY,EAAE,IAAI;EAClB,cAAc,EAAE,IAAI;CACtB;AACF,CAAC"}
package/dist/hono.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- import { AdapterToolkit } from './core.cjs';
2
- import * as autotel from 'autotel';
3
- import { Context } from 'hono';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.cjs";
2
+ import { Context } from "hono";
5
3
 
6
- declare const useLogger: (context?: Context<any, any, {}> | undefined, requestLoggerOptions?: autotel.RequestLoggerOptions) => autotel.RequestLogger;
4
+ //#region src/hono.d.ts
5
+ declare const useLogger: (context?: Context<any, any, {}> | undefined, requestLoggerOptions?: import("autotel").RequestLoggerOptions) => import("autotel").RequestLogger;
7
6
  declare const honoToolkit: AdapterToolkit<Context<any, any, {}>>;
8
-
7
+ //#endregion
9
8
  export { honoToolkit, useLogger };
9
+ //# sourceMappingURL=hono.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.cts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;cAGa,SAAA,GAAS,OAAA,GAAA,OAAA,4BAAA,oBAAA,qBAAA,oBAAA,uBAAA,aAAA;AAAA,cAST,WAAA,EAAW,cAAA,CAAA,OAAA"}
package/dist/hono.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { AdapterToolkit } from './core.js';
2
- import * as autotel from 'autotel';
3
- import { Context } from 'hono';
4
- import 'node:async_hooks';
1
+ import { AdapterToolkit } from "./core.js";
2
+ import { Context } from "hono";
5
3
 
6
- declare const useLogger: (context?: Context<any, any, {}> | undefined, requestLoggerOptions?: autotel.RequestLoggerOptions) => autotel.RequestLogger;
4
+ //#region src/hono.d.ts
5
+ declare const useLogger: (context?: Context<any, any, {}> | undefined, requestLoggerOptions?: import("autotel").RequestLoggerOptions) => import("autotel").RequestLogger;
7
6
  declare const honoToolkit: AdapterToolkit<Context<any, any, {}>>;
8
-
7
+ //#endregion
9
8
  export { honoToolkit, useLogger };
9
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;cAGa,SAAA,GAAS,OAAA,GAAA,OAAA,4BAAA,oBAAA,qBAAA,oBAAA,uBAAA,aAAA;AAAA,cAST,WAAA,EAAW,cAAA,CAAA,OAAA"}