autotel-adapters 0.3.8 → 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 +5 -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/next.cjs CHANGED
@@ -1,136 +1,73 @@
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/next.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 createAdapterToolkit(options) {
27
- return {
28
- useLogger: createUseLogger(options),
29
- parseError: autotel.parseError,
30
- createStructuredError: autotel.createStructuredError,
31
- createDrainPipeline: autotel.createDrainPipeline
32
- };
33
- }
34
- function getHeader(headers, name) {
35
- if (!headers) return void 0;
36
- if ("get" in headers && typeof headers.get === "function") {
37
- return headers.get(name) ?? void 0;
38
- }
39
- const dictionary = headers;
40
- const value = dictionary[name] ?? dictionary[name.toLowerCase()];
41
- return typeof value === "string" ? value : void 0;
42
- }
43
-
44
- // src/next.ts
45
- var nextLoggerStorage = new async_hooks.AsyncLocalStorage();
6
+ //#region src/next.ts
7
+ const nextLoggerStorage = new node_async_hooks.AsyncLocalStorage();
46
8
  function enrichFromRequest(request) {
47
- if (!request) return void 0;
48
- let route = "/";
49
- if (request.url) {
50
- try {
51
- route = new URL(request.url).pathname;
52
- } catch {
53
- route = request.url;
54
- }
55
- }
56
- const requestId = getHeader(request.headers, "x-request-id");
57
- return {
58
- ...request.method ? { "http.request.method": request.method } : {},
59
- ...request.url ? { "url.full": request.url } : {},
60
- ...route ? { "http.route": route } : {},
61
- ...requestId ? { "http.request.header.x-request-id": requestId } : {}
62
- };
9
+ if (!request) return void 0;
10
+ let route = "/";
11
+ if (request.url) try {
12
+ route = new URL(request.url).pathname;
13
+ } catch {
14
+ route = request.url;
15
+ }
16
+ const requestId = require_core.getHeader(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.header.x-request-id": requestId } : {}
22
+ };
63
23
  }
64
- var baseUseLogger = createUseLogger({
65
- adapterName: "next",
66
- enrich: enrichFromRequest
24
+ const baseUseLogger = require_core.createUseLogger({
25
+ adapterName: "next",
26
+ enrich: enrichFromRequest
67
27
  });
68
28
  function useLogger(request, requestLoggerOptions) {
69
- const logger = nextLoggerStorage.getStore();
70
- if (logger) return logger;
71
- return baseUseLogger(request, requestLoggerOptions);
29
+ const logger = nextLoggerStorage.getStore();
30
+ if (logger) return logger;
31
+ return baseUseLogger(request, requestLoggerOptions);
72
32
  }
73
33
  function withAutotel(handler, options) {
74
- return async (...args) => {
75
- const request = args[0];
76
- const spanName = typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? "next.request";
77
- const wrapped = autotel.trace(
78
- { name: spanName },
79
- (ctx) => async (...innerArgs) => {
80
- const innerRequest = innerArgs[0];
81
- const log = autotel.getRequestLogger(ctx, options?.requestLoggerOptions);
82
- const auto = enrichFromRequest(innerRequest);
83
- if (auto && Object.keys(auto).length > 0) {
84
- log.set(auto);
85
- }
86
- const custom = options?.enrich?.(innerRequest);
87
- if (custom && Object.keys(custom).length > 0) {
88
- log.set(custom);
89
- }
90
- try {
91
- return await nextLoggerStorage.run(
92
- log,
93
- async () => handler(...innerArgs)
94
- );
95
- } finally {
96
- if (options?.autoEmit !== false) {
97
- log.emitNow();
98
- }
99
- }
100
- }
101
- );
102
- return await wrapped(...args);
103
- };
34
+ return async (...args) => {
35
+ const request = args[0];
36
+ return await (0, autotel.trace)({ name: typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? "next.request" }, (ctx) => async (...innerArgs) => {
37
+ const innerRequest = innerArgs[0];
38
+ const log = (0, autotel.getRequestLogger)(ctx, options?.requestLoggerOptions);
39
+ const auto = enrichFromRequest(innerRequest);
40
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
41
+ const custom = options?.enrich?.(innerRequest);
42
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
43
+ try {
44
+ return await nextLoggerStorage.run(log, async () => handler(...innerArgs));
45
+ } finally {
46
+ if (options?.autoEmit !== false) log.emitNow();
47
+ }
48
+ })(...args);
49
+ };
104
50
  }
105
51
  function createNextAdapter(options) {
106
- return {
107
- withAutotel: (handler) => withAutotel(handler, options),
108
- useLogger: (request, requestLoggerOptions) => useLogger(request, requestLoggerOptions),
109
- parseError: (error) => autotel.parseError(error),
110
- createStructuredError: (input) => autotel.createStructuredError(input),
111
- createDrainPipeline: (drainOptions) => autotel.createDrainPipeline(drainOptions)
112
- };
52
+ return {
53
+ withAutotel: (handler) => withAutotel(handler, options),
54
+ useLogger: (request, requestLoggerOptions) => useLogger(request, requestLoggerOptions),
55
+ parseError: (error) => (0, autotel.parseError)(error),
56
+ createStructuredError: (input) => (0, autotel.createStructuredError)(input),
57
+ createDrainPipeline: (drainOptions) => (0, autotel.createDrainPipeline)(drainOptions)
58
+ };
113
59
  }
114
- var nextToolkit = createAdapterToolkit({
115
- adapterName: "next",
116
- enrich: enrichFromRequest
60
+ const nextToolkit = require_core.createAdapterToolkit({
61
+ adapterName: "next",
62
+ enrich: enrichFromRequest
117
63
  });
118
64
 
119
- Object.defineProperty(exports, "createDrainPipeline", {
120
- enumerable: true,
121
- get: function () { return autotel.createDrainPipeline; }
122
- });
123
- Object.defineProperty(exports, "createStructuredError", {
124
- enumerable: true,
125
- get: function () { return autotel.createStructuredError; }
126
- });
127
- Object.defineProperty(exports, "parseError", {
128
- enumerable: true,
129
- get: function () { return autotel.parseError; }
130
- });
65
+ //#endregion
66
+ exports.createDrainPipeline = autotel.createDrainPipeline;
131
67
  exports.createNextAdapter = createNextAdapter;
68
+ exports.createStructuredError = autotel.createStructuredError;
132
69
  exports.nextToolkit = nextToolkit;
70
+ exports.parseError = autotel.parseError;
133
71
  exports.useLogger = useLogger;
134
72
  exports.withAutotel = withAutotel;
135
- //# sourceMappingURL=next.cjs.map
136
73
  //# sourceMappingURL=next.cjs.map
package/dist/next.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts","../src/next.ts"],"names":["useLogger","getRequestLogger","parseError","createStructuredError","createDrainPipeline","AsyncLocalStorage","trace"],"mappings":"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","file":"next.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 getRequestLogger,\n parseError,\n trace,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n type ParsedError,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions {\n spanName?: string | ((request?: NextRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst nextLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(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.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const logger = nextLoggerStorage.getStore();\n if (logger) return logger;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? 'next.request');\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (...innerArgs: TArgs) => {\n const innerRequest = innerArgs[0] as NextRequestLike | undefined;\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerRequest);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nextLoggerStorage.run(log, async () =>\n handler(...innerArgs),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n },\n );\n return await wrapped(...args);\n };\n}\n\nexport function createNextAdapter(options?: NextWithAutotelOptions) {\n return {\n withAutotel: <TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger: (\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger => useLogger(request, requestLoggerOptions),\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => 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 nextToolkit = createAdapterToolkit<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"]}
1
+ {"version":3,"file":"next.cjs","names":["AsyncLocalStorage","getHeader","createUseLogger","createAdapterToolkit"],"sources":["../src/next.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n getRequestLogger,\n parseError,\n trace,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n type ParsedError,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions {\n spanName?: string | ((request?: NextRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst nextLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(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.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const logger = nextLoggerStorage.getStore();\n if (logger) return logger;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? 'next.request');\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (...innerArgs: TArgs) => {\n const innerRequest = innerArgs[0] as NextRequestLike | undefined;\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerRequest);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nextLoggerStorage.run(log, async () =>\n handler(...innerArgs),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n },\n );\n return await wrapped(...args);\n };\n}\n\nexport function createNextAdapter(options?: NextWithAutotelOptions) {\n return {\n withAutotel: <TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger: (\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger => useLogger(request, requestLoggerOptions),\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => 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 nextToolkit = createAdapterToolkit<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAiCA,MAAM,oBAAoB,IAAIA,mCAAiC;AAE/D,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,IAAI,QAAQ;CACZ,IAAI,QAAQ,KACV,IAAI;EACF,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC/B,QAAQ;EACN,QAAQ,QAAQ;CAClB;CAEF,MAAM,YAAYC,uBAAU,QAAQ,SAAS,cAAc;CAE3D,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,oCAAoC,UAAU,IAAI,CAAC;CACvE;AACF;AAEA,MAAM,gBAAgBC,6BAAiC;CACrD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,kBAAkB,SAAS;CAC1C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAgB,YACd,SACA,SACsC;CACtC,OAAO,OAAO,GAAG,SAAkC;EACjD,MAAM,UAAU,KAAK;EA8BrB,OAAO,yBAvBL,EAAE,MALF,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,eAGT,IAChB,QAAQ,OAAO,GAAG,cAAqB;GACtC,MAAM,eAAe,UAAU;GAC/B,MAAM,oCAAuB,KAAK,SAAS,oBAAoB;GAC/D,MAAM,OAAO,kBAAkB,YAAY;GAC3C,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACrC,IAAI,IAAI,IAAI;GAEd,MAAM,SAAS,SAAS,SAAS,YAAY;GAC7C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAEhB,IAAI;IACF,OAAO,MAAM,kBAAkB,IAAI,KAAK,YACtC,QAAQ,GAAG,SAAS,CACtB;GACF,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;GAEhB;EACF,CAEiB,CAAC,CAAC,GAAG,IAAI;CAC9B;AACF;AAEA,SAAgB,kBAAkB,SAAkC;CAClE,OAAO;EACL,cACE,YACG,YAAY,SAAS,OAAO;EACjC,YACE,SACA,yBACkB,UAAU,SAAS,oBAAoB;EAC3D,aAAa,kCAA2C,KAAK;EAC7D,wBACE,6CAC0C,KAAK;EACjD,sBACE,kDAEoB,YAAY;CACpC;AACF;AAEA,MAAa,cAAcC,kCAAsC;CAC/D,aAAa;CACb,QAAQ;AACV,CAAC"}
package/dist/next.d.cts CHANGED
@@ -1,31 +1,31 @@
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/next.d.ts
6
5
  interface NextRequestLike {
7
- method?: string;
8
- url?: string;
9
- headers?: {
10
- get(name: string): string | null;
11
- } | Record<string, string | undefined>;
6
+ method?: string;
7
+ url?: string;
8
+ headers?: {
9
+ get(name: string): string | null;
10
+ } | Record<string, string | undefined>;
12
11
  }
13
12
  interface NextWithAutotelOptions {
14
- spanName?: string | ((request?: NextRequestLike) => string);
15
- requestLoggerOptions?: RequestLoggerOptions;
16
- enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
17
- /** Emit one wide event automatically when the handler settles. Default `true`. */
18
- autoEmit?: boolean;
13
+ spanName?: string | ((request?: NextRequestLike) => string);
14
+ requestLoggerOptions?: RequestLoggerOptions;
15
+ enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
16
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
17
+ autoEmit?: boolean;
19
18
  }
20
19
  declare function useLogger(request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
21
20
  declare function withAutotel<TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>, options?: NextWithAutotelOptions): (...args: TArgs) => Promise<TReturn>;
22
21
  declare function createNextAdapter(options?: NextWithAutotelOptions): {
23
- withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
24
- useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
25
- parseError: (error: unknown) => ParsedError;
26
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
27
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
22
+ withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
23
+ useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
24
+ parseError: (error: unknown) => ParsedError;
25
+ createStructuredError: (input: StructuredErrorInput) => StructuredError;
26
+ createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
28
27
  };
29
28
  declare const nextToolkit: AdapterToolkit<NextRequestLike>;
30
-
31
- export { type NextRequestLike, type NextWithAutotelOptions, createNextAdapter, nextToolkit, useLogger, withAutotel };
29
+ //#endregion
30
+ export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel };
31
+ //# sourceMappingURL=next.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.cts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAiBiB,eAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAM;AAAA;AAAA,UAGK,sBAAA;EACf,QAAA,cAAsB,OAAA,GAAU,eAAA;EAChC,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,GAAU,eAAA,KAAoB,MAAA;EAP9B;EASV,QAAA;AAAA;AAAA,iBAiCc,SAAA,CACd,OAAA,GAAU,eAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAMa,WAAA,mCACd,OAAA,MAAa,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC/C,OAAA,GAAU,sBAAA,OACL,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,OAAA;AAAA,iBAoCf,iBAAA,CAAkB,OAAA,GAAU,sBAAA;kDAEM,OAAA,MAC/B,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,UAAQ,IAAA,EAAA,KAAA,KAAA,OAAA,CAAA,OAAA;wBAG7C,eAAA,EAAe,oBAAA,GACF,oBAAA,KACtB,aAAA;kCAC2B,WAAA;iCAErB,oBAAA,KACN,eAAA;qCACoB,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,WAAA,EAAW,cAAA,CAAA,eAAA"}
package/dist/next.d.ts CHANGED
@@ -1,31 +1,31 @@
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/next.d.ts
6
5
  interface NextRequestLike {
7
- method?: string;
8
- url?: string;
9
- headers?: {
10
- get(name: string): string | null;
11
- } | Record<string, string | undefined>;
6
+ method?: string;
7
+ url?: string;
8
+ headers?: {
9
+ get(name: string): string | null;
10
+ } | Record<string, string | undefined>;
12
11
  }
13
12
  interface NextWithAutotelOptions {
14
- spanName?: string | ((request?: NextRequestLike) => string);
15
- requestLoggerOptions?: RequestLoggerOptions;
16
- enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
17
- /** Emit one wide event automatically when the handler settles. Default `true`. */
18
- autoEmit?: boolean;
13
+ spanName?: string | ((request?: NextRequestLike) => string);
14
+ requestLoggerOptions?: RequestLoggerOptions;
15
+ enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
16
+ /** Emit one wide event automatically when the handler settles. Default `true`. */
17
+ autoEmit?: boolean;
19
18
  }
20
19
  declare function useLogger(request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
21
20
  declare function withAutotel<TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>, options?: NextWithAutotelOptions): (...args: TArgs) => Promise<TReturn>;
22
21
  declare function createNextAdapter(options?: NextWithAutotelOptions): {
23
- withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
24
- useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
25
- parseError: (error: unknown) => ParsedError;
26
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
27
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
22
+ withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
23
+ useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
24
+ parseError: (error: unknown) => ParsedError;
25
+ createStructuredError: (input: StructuredErrorInput) => StructuredError;
26
+ createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
28
27
  };
29
28
  declare const nextToolkit: AdapterToolkit<NextRequestLike>;
30
-
31
- export { type NextRequestLike, type NextWithAutotelOptions, createNextAdapter, nextToolkit, useLogger, withAutotel };
29
+ //#endregion
30
+ export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel };
31
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAiBiB,eAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAM;AAAA;AAAA,UAGK,sBAAA;EACf,QAAA,cAAsB,OAAA,GAAU,eAAA;EAChC,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,GAAU,eAAA,KAAoB,MAAA;EAP9B;EASV,QAAA;AAAA;AAAA,iBAiCc,SAAA,CACd,OAAA,GAAU,eAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAMa,WAAA,mCACd,OAAA,MAAa,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC/C,OAAA,GAAU,sBAAA,OACL,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,OAAA;AAAA,iBAoCf,iBAAA,CAAkB,OAAA,GAAU,sBAAA;kDAEM,OAAA,MAC/B,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,UAAQ,IAAA,EAAA,KAAA,KAAA,OAAA,CAAA,OAAA;wBAG7C,eAAA,EAAe,oBAAA,GACF,oBAAA,KACtB,aAAA;kCAC2B,WAAA;iCAErB,oBAAA,KACN,eAAA;qCACoB,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,WAAA,EAAW,cAAA,CAAA,eAAA"}
package/dist/next.js CHANGED
@@ -1,4 +1,66 @@
1
- export { createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel } from './chunk-HTZFHBTN.js';
2
- import './chunk-DJ2OU3S6.js';
3
- //# sourceMappingURL=next.js.map
1
+ import { createAdapterToolkit, createUseLogger, getHeader } from "./core.js";
2
+ import { createDrainPipeline, createStructuredError, getRequestLogger, parseError, trace } from "autotel";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
4
+
5
+ //#region src/next.ts
6
+ const nextLoggerStorage = new AsyncLocalStorage();
7
+ function enrichFromRequest(request) {
8
+ if (!request) return void 0;
9
+ let route = "/";
10
+ if (request.url) try {
11
+ route = new URL(request.url).pathname;
12
+ } catch {
13
+ route = request.url;
14
+ }
15
+ const requestId = getHeader(request.headers, "x-request-id");
16
+ return {
17
+ ...request.method ? { "http.request.method": request.method } : {},
18
+ ...request.url ? { "url.full": request.url } : {},
19
+ ...route ? { "http.route": route } : {},
20
+ ...requestId ? { "http.request.header.x-request-id": requestId } : {}
21
+ };
22
+ }
23
+ const baseUseLogger = createUseLogger({
24
+ adapterName: "next",
25
+ enrich: enrichFromRequest
26
+ });
27
+ function useLogger(request, requestLoggerOptions) {
28
+ const logger = nextLoggerStorage.getStore();
29
+ if (logger) return logger;
30
+ return baseUseLogger(request, requestLoggerOptions);
31
+ }
32
+ function withAutotel(handler, options) {
33
+ return async (...args) => {
34
+ const request = args[0];
35
+ return await trace({ name: typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? "next.request" }, (ctx) => async (...innerArgs) => {
36
+ const innerRequest = innerArgs[0];
37
+ const log = getRequestLogger(ctx, options?.requestLoggerOptions);
38
+ const auto = enrichFromRequest(innerRequest);
39
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
40
+ const custom = options?.enrich?.(innerRequest);
41
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
42
+ try {
43
+ return await nextLoggerStorage.run(log, async () => handler(...innerArgs));
44
+ } finally {
45
+ if (options?.autoEmit !== false) log.emitNow();
46
+ }
47
+ })(...args);
48
+ };
49
+ }
50
+ function createNextAdapter(options) {
51
+ return {
52
+ withAutotel: (handler) => withAutotel(handler, options),
53
+ useLogger: (request, requestLoggerOptions) => useLogger(request, requestLoggerOptions),
54
+ parseError: (error) => parseError(error),
55
+ createStructuredError: (input) => createStructuredError(input),
56
+ createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
57
+ };
58
+ }
59
+ const nextToolkit = createAdapterToolkit({
60
+ adapterName: "next",
61
+ enrich: enrichFromRequest
62
+ });
63
+
64
+ //#endregion
65
+ export { createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel };
4
66
  //# sourceMappingURL=next.js.map
package/dist/next.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"next.js"}
1
+ {"version":3,"file":"next.js","names":[],"sources":["../src/next.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n getRequestLogger,\n parseError,\n trace,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n type ParsedError,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions {\n spanName?: string | ((request?: NextRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst nextLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(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.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const logger = nextLoggerStorage.getStore();\n if (logger) return logger;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? 'next.request');\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (...innerArgs: TArgs) => {\n const innerRequest = innerArgs[0] as NextRequestLike | undefined;\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerRequest);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nextLoggerStorage.run(log, async () =>\n handler(...innerArgs),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n },\n );\n return await wrapped(...args);\n };\n}\n\nexport function createNextAdapter(options?: NextWithAutotelOptions) {\n return {\n withAutotel: <TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger: (\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger => useLogger(request, requestLoggerOptions),\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => 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 nextToolkit = createAdapterToolkit<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;AAiCA,MAAM,oBAAoB,IAAI,kBAAiC;AAE/D,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,IAAI,QAAQ;CACZ,IAAI,QAAQ,KACV,IAAI;EACF,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC/B,QAAQ;EACN,QAAQ,QAAQ;CAClB;CAEF,MAAM,YAAY,UAAU,QAAQ,SAAS,cAAc;CAE3D,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,oCAAoC,UAAU,IAAI,CAAC;CACvE;AACF;AAEA,MAAM,gBAAgB,gBAAiC;CACrD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,kBAAkB,SAAS;CAC1C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAgB,YACd,SACA,SACsC;CACtC,OAAO,OAAO,GAAG,SAAkC;EACjD,MAAM,UAAU,KAAK;EA8BrB,OAAO,MAxBS,MACd,EAAE,MALF,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,eAGT,IAChB,QAAQ,OAAO,GAAG,cAAqB;GACtC,MAAM,eAAe,UAAU;GAC/B,MAAM,MAAM,iBAAiB,KAAK,SAAS,oBAAoB;GAC/D,MAAM,OAAO,kBAAkB,YAAY;GAC3C,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACrC,IAAI,IAAI,IAAI;GAEd,MAAM,SAAS,SAAS,SAAS,YAAY;GAC7C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAEhB,IAAI;IACF,OAAO,MAAM,kBAAkB,IAAI,KAAK,YACtC,QAAQ,GAAG,SAAS,CACtB;GACF,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;GAEhB;EACF,CAEiB,CAAC,CAAC,GAAG,IAAI;CAC9B;AACF;AAEA,SAAgB,kBAAkB,SAAkC;CAClE,OAAO;EACL,cACE,YACG,YAAY,SAAS,OAAO;EACjC,YACE,SACA,yBACkB,UAAU,SAAS,oBAAoB;EAC3D,aAAa,UAAgC,WAAW,KAAK;EAC7D,wBACE,UACoB,sBAAsB,KAAK;EACjD,sBACE,iBAEA,oBAAoB,YAAY;CACpC;AACF;AAEA,MAAa,cAAc,qBAAsC;CAC/D,aAAa;CACb,QAAQ;AACV,CAAC"}
package/dist/nitro.cjs CHANGED
@@ -1,110 +1,67 @@
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/nitro.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 createAdapterToolkit(options) {
27
- return {
28
- useLogger: createUseLogger(options),
29
- parseError: autotel.parseError,
30
- createStructuredError: autotel.createStructuredError,
31
- createDrainPipeline: autotel.createDrainPipeline
32
- };
33
- }
34
-
35
- // src/nitro.ts
6
+ //#region src/nitro.ts
36
7
  function enrichFromEvent(event) {
37
- if (!event) return void 0;
38
- return {
39
- ...event.method ? { "http.request.method": event.method } : {},
40
- ...event.path ? { "http.route": event.path } : {},
41
- ...typeof event.context?.requestId === "string" ? { "http.request.id": event.context.requestId } : {}
42
- };
8
+ if (!event) return void 0;
9
+ return {
10
+ ...event.method ? { "http.request.method": event.method } : {},
11
+ ...event.path ? { "http.route": event.path } : {},
12
+ ...typeof event.context?.requestId === "string" ? { "http.request.id": event.context.requestId } : {}
13
+ };
43
14
  }
44
- var baseUseLogger = createUseLogger({
45
- adapterName: "nitro",
46
- enrich: enrichFromEvent
15
+ const baseUseLogger = require_core.createUseLogger({
16
+ adapterName: "nitro",
17
+ enrich: enrichFromEvent
47
18
  });
48
- var nitroLoggerStorage = new async_hooks.AsyncLocalStorage();
19
+ const nitroLoggerStorage = new node_async_hooks.AsyncLocalStorage();
49
20
  function useLogger(event, serviceOrOptions) {
50
- const stored = nitroLoggerStorage.getStore();
51
- const logger = stored ?? (typeof serviceOrOptions === "string" ? baseUseLogger(event) : baseUseLogger(event, serviceOrOptions));
52
- if (typeof serviceOrOptions === "string" && serviceOrOptions.length > 0) {
53
- logger.set({ service: serviceOrOptions });
54
- }
55
- return logger;
21
+ const logger = nitroLoggerStorage.getStore() ?? (typeof serviceOrOptions === "string" ? baseUseLogger(event) : baseUseLogger(event, serviceOrOptions));
22
+ if (typeof serviceOrOptions === "string" && serviceOrOptions.length > 0) logger.set({ service: serviceOrOptions });
23
+ return logger;
56
24
  }
57
25
  function withAutotelEventHandler(handler, options) {
58
- return async (event) => {
59
- const spanName = typeof options?.spanName === "function" ? options.spanName(event) : options?.spanName ?? `nitro.${event.method ?? "request"}`;
60
- const wrapped = autotel.trace({ name: spanName }, (ctx) => async (innerEvent) => {
61
- const log = autotel.getRequestLogger(ctx, options?.requestLoggerOptions);
62
- const auto = enrichFromEvent(innerEvent);
63
- if (auto && Object.keys(auto).length > 0) {
64
- log.set(auto);
65
- }
66
- const custom = options?.enrich?.(innerEvent);
67
- if (custom && Object.keys(custom).length > 0) {
68
- log.set(custom);
69
- }
70
- try {
71
- return await nitroLoggerStorage.run(
72
- log,
73
- async () => handler(innerEvent)
74
- );
75
- } finally {
76
- if (options?.autoEmit !== false) {
77
- log.emitNow();
78
- }
79
- }
80
- });
81
- return await wrapped(event);
82
- };
26
+ return async (event) => {
27
+ return await (0, autotel.trace)({ name: typeof options?.spanName === "function" ? options.spanName(event) : options?.spanName ?? `nitro.${event.method ?? "request"}` }, (ctx) => async (innerEvent) => {
28
+ const log = (0, autotel.getRequestLogger)(ctx, options?.requestLoggerOptions);
29
+ const auto = enrichFromEvent(innerEvent);
30
+ if (auto && Object.keys(auto).length > 0) log.set(auto);
31
+ const custom = options?.enrich?.(innerEvent);
32
+ if (custom && Object.keys(custom).length > 0) log.set(custom);
33
+ try {
34
+ return await nitroLoggerStorage.run(log, async () => handler(innerEvent));
35
+ } finally {
36
+ if (options?.autoEmit !== false) log.emitNow();
37
+ }
38
+ })(event);
39
+ };
83
40
  }
84
41
  function createNitroAdapter(options) {
85
- const toolkit = createAdapterToolkit({
86
- adapterName: "nitro",
87
- enrich: (event) => ({
88
- ...enrichFromEvent(event),
89
- ...options?.enrich?.(event) ?? {}
90
- })
91
- });
92
- return {
93
- withAutotelEventHandler: (handler) => withAutotelEventHandler(handler, options),
94
- useLogger,
95
- parseError: toolkit.parseError,
96
- createStructuredError: toolkit.createStructuredError,
97
- createDrainPipeline: toolkit.createDrainPipeline
98
- };
42
+ const toolkit = require_core.createAdapterToolkit({
43
+ adapterName: "nitro",
44
+ enrich: (event) => ({
45
+ ...enrichFromEvent(event),
46
+ ...options?.enrich?.(event) ?? {}
47
+ })
48
+ });
49
+ return {
50
+ withAutotelEventHandler: (handler) => withAutotelEventHandler(handler, options),
51
+ useLogger,
52
+ parseError: toolkit.parseError,
53
+ createStructuredError: toolkit.createStructuredError,
54
+ createDrainPipeline: toolkit.createDrainPipeline
55
+ };
99
56
  }
100
- var nitroToolkit = createAdapterToolkit({
101
- adapterName: "nitro",
102
- enrich: enrichFromEvent
57
+ const nitroToolkit = require_core.createAdapterToolkit({
58
+ adapterName: "nitro",
59
+ enrich: enrichFromEvent
103
60
  });
104
61
 
62
+ //#endregion
105
63
  exports.createNitroAdapter = createNitroAdapter;
106
64
  exports.nitroToolkit = nitroToolkit;
107
65
  exports.useLogger = useLogger;
108
66
  exports.withAutotelEventHandler = withAutotelEventHandler;
109
- //# sourceMappingURL=nitro.cjs.map
110
67
  //# sourceMappingURL=nitro.cjs.map