autotel-adapters 0.3.18 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +13 -0
  2. package/dist/cloudflare.cjs +44 -29
  3. package/dist/cloudflare.cjs.map +1 -1
  4. package/dist/cloudflare.d.cts +10 -16
  5. package/dist/cloudflare.d.cts.map +1 -1
  6. package/dist/cloudflare.d.ts +10 -16
  7. package/dist/cloudflare.d.ts.map +1 -1
  8. package/dist/cloudflare.js +47 -30
  9. package/dist/cloudflare.js.map +1 -1
  10. package/dist/core.cjs +6 -10
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +7 -10
  13. package/dist/core.d.cts.map +1 -1
  14. package/dist/core.d.ts +6 -9
  15. package/dist/core.d.ts.map +1 -1
  16. package/dist/core.js +6 -11
  17. package/dist/core.js.map +1 -1
  18. package/dist/elysia.cjs +50 -0
  19. package/dist/elysia.cjs.map +1 -0
  20. package/dist/elysia.d.cts +18 -0
  21. package/dist/elysia.d.cts.map +1 -0
  22. package/dist/elysia.d.ts +18 -0
  23. package/dist/elysia.d.ts.map +1 -0
  24. package/dist/elysia.js +44 -0
  25. package/dist/elysia.js.map +1 -0
  26. package/dist/express.cjs +5 -16
  27. package/dist/express.cjs.map +1 -1
  28. package/dist/express.d.cts +5 -14
  29. package/dist/express.d.cts.map +1 -1
  30. package/dist/express.d.ts +5 -14
  31. package/dist/express.d.ts.map +1 -1
  32. package/dist/express.js +7 -16
  33. package/dist/express.js.map +1 -1
  34. package/dist/fastify.cjs +5 -16
  35. package/dist/fastify.cjs.map +1 -1
  36. package/dist/fastify.d.cts +5 -14
  37. package/dist/fastify.d.cts.map +1 -1
  38. package/dist/fastify.d.ts +5 -14
  39. package/dist/fastify.d.ts.map +1 -1
  40. package/dist/fastify.js +7 -16
  41. package/dist/fastify.js.map +1 -1
  42. package/dist/hono.cjs +52 -11
  43. package/dist/hono.cjs.map +1 -1
  44. package/dist/hono.d.cts +11 -4
  45. package/dist/hono.d.cts.map +1 -1
  46. package/dist/hono.d.ts +11 -4
  47. package/dist/hono.d.ts.map +1 -1
  48. package/dist/hono.js +49 -12
  49. package/dist/hono.js.map +1 -1
  50. package/dist/index.cjs +14 -9
  51. package/dist/index.d.cts +12 -9
  52. package/dist/index.d.ts +12 -9
  53. package/dist/index.js +12 -9
  54. package/dist/integration-7--zN-83.d.cts +101 -0
  55. package/dist/integration-7--zN-83.d.cts.map +1 -0
  56. package/dist/integration-BRVGyxPG.js +335 -0
  57. package/dist/integration-BRVGyxPG.js.map +1 -0
  58. package/dist/integration-CaG_l5xr.d.ts +101 -0
  59. package/dist/integration-CaG_l5xr.d.ts.map +1 -0
  60. package/dist/integration-Dd8Pi7jc.cjs +412 -0
  61. package/dist/integration-Dd8Pi7jc.cjs.map +1 -0
  62. package/dist/nestjs.cjs +119 -0
  63. package/dist/nestjs.cjs.map +1 -0
  64. package/dist/nestjs.d.cts +42 -0
  65. package/dist/nestjs.d.cts.map +1 -0
  66. package/dist/nestjs.d.ts +42 -0
  67. package/dist/nestjs.d.ts.map +1 -0
  68. package/dist/nestjs.js +114 -0
  69. package/dist/nestjs.js.map +1 -0
  70. package/dist/next.cjs +35 -33
  71. package/dist/next.cjs.map +1 -1
  72. package/dist/next.d.cts +5 -16
  73. package/dist/next.d.cts.map +1 -1
  74. package/dist/next.d.ts +5 -16
  75. package/dist/next.d.ts.map +1 -1
  76. package/dist/next.js +38 -34
  77. package/dist/next.js.map +1 -1
  78. package/dist/nitro.cjs +33 -41
  79. package/dist/nitro.cjs.map +1 -1
  80. package/dist/nitro.d.cts +5 -16
  81. package/dist/nitro.d.cts.map +1 -1
  82. package/dist/nitro.d.ts +5 -16
  83. package/dist/nitro.d.ts.map +1 -1
  84. package/dist/nitro.js +33 -42
  85. package/dist/nitro.js.map +1 -1
  86. package/dist/sveltekit.cjs +48 -0
  87. package/dist/sveltekit.cjs.map +1 -0
  88. package/dist/sveltekit.d.cts +27 -0
  89. package/dist/sveltekit.d.cts.map +1 -0
  90. package/dist/sveltekit.d.ts +27 -0
  91. package/dist/sveltekit.d.ts.map +1 -0
  92. package/dist/sveltekit.js +43 -0
  93. package/dist/sveltekit.js.map +1 -0
  94. package/dist/tanstack.cjs +0 -8
  95. package/dist/tanstack.cjs.map +1 -1
  96. package/dist/tanstack.d.cts +1 -7
  97. package/dist/tanstack.d.cts.map +1 -1
  98. package/dist/tanstack.d.ts +1 -7
  99. package/dist/tanstack.d.ts.map +1 -1
  100. package/dist/tanstack.js +2 -9
  101. package/dist/tanstack.js.map +1 -1
  102. package/dist/toolkit/index.cjs +23 -0
  103. package/dist/toolkit/index.d.cts +43 -0
  104. package/dist/toolkit/index.d.cts.map +1 -0
  105. package/dist/toolkit/index.d.ts +43 -0
  106. package/dist/toolkit/index.d.ts.map +1 -0
  107. package/dist/toolkit/index.js +4 -0
  108. package/dist/toolkit/storage.cjs +35 -0
  109. package/dist/toolkit/storage.cjs.map +1 -0
  110. package/dist/toolkit/storage.d.cts +21 -0
  111. package/dist/toolkit/storage.d.cts.map +1 -0
  112. package/dist/toolkit/storage.d.ts +21 -0
  113. package/dist/toolkit/storage.d.ts.map +1 -0
  114. package/dist/toolkit/storage.js +33 -0
  115. package/dist/toolkit/storage.js.map +1 -0
  116. package/package.json +34 -3
  117. package/skills/autotel-adapters/SKILL.md +31 -23
package/README.md CHANGED
@@ -12,8 +12,21 @@ Composable framework adapters and DX helpers for `autotel`.
12
12
  - `autotel-adapters/next`
13
13
  - `autotel-adapters/nitro`
14
14
  - `autotel-adapters/cloudflare`
15
+ - `autotel-adapters/express`
16
+ - `autotel-adapters/fastify`
17
+ - `autotel-adapters/nestjs`
18
+ - `autotel-adapters/sveltekit`
19
+ - `autotel-adapters/elysia`
20
+ - `autotel-adapters/toolkit` (custom framework integrations)
21
+ - `autotel-adapters/toolkit/storage` (edge-safe ALS helper)
15
22
  - `autotel-adapters/core` (build your own adapter)
16
23
 
24
+ ## Custom frameworks
25
+
26
+ Use `defineFrameworkIntegration()` from `autotel-adapters/toolkit` to wire a new HTTP framework. See `examples/community-framework-skeleton/` for a minimal skeleton.
27
+
28
+ Toolkit options include route `include` / `exclude`, per-route `service`, serverless `waitUntil`, streaming `finishResponse`, and request-level `keep` callbacks.
29
+
17
30
  ## When to use `withAutotel` vs `useLogger` alone
18
31
 
19
32
  Each adapter exports two patterns. Choose based on whether you already have
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_integration = require('./integration-Dd8Pi7jc.cjs');
2
3
  const require_core = require('./core.cjs');
3
4
  let autotel = require("autotel");
4
5
 
@@ -34,41 +35,55 @@ function useLogger(request, requestLoggerOptions) {
34
35
  }
35
36
  return baseUseLogger(request, requestLoggerOptions);
36
37
  }
38
+ function resolvePath(request) {
39
+ if (!request.url) return "/";
40
+ try {
41
+ return new URL(request.url).pathname;
42
+ } catch {
43
+ return request.url;
44
+ }
45
+ }
46
+ function createIntegration() {
47
+ return require_integration.defineFrameworkIntegration({
48
+ name: "cloudflare",
49
+ extractRequest: ({ request }) => ({
50
+ method: request.method ?? "GET",
51
+ path: resolvePath(request),
52
+ headers: request.headers,
53
+ requestId: require_core.getHeader(request.headers, "x-request-id") ?? require_core.getHeader(request.headers, "cf-ray")
54
+ }),
55
+ attachLogger: ({ request }, logger) => {
56
+ requestLoggers.set(request, logger);
57
+ },
58
+ extractWaitUntil: ({ executionContext }) => {
59
+ return typeof executionContext.waitUntil === "function" ? executionContext.waitUntil.bind(executionContext) : void 0;
60
+ }
61
+ });
62
+ }
63
+ const integration = createIntegration();
64
+ function resolveSpanName(request, env, options) {
65
+ if (typeof options?.spanName === "function") return options.spanName(request, env);
66
+ return options?.spanName ?? `cloudflare.${request.method ?? "request"}`;
67
+ }
37
68
  function withAutotelFetch(handler, options) {
38
69
  return async (request, env, executionContext) => {
39
- return await (0, autotel.trace)({ name: typeof options?.spanName === "function" ? options.spanName(request, env) : options?.spanName ?? `cloudflare.${request.method ?? "request"}` }, (ctx) => async (innerRequest, innerEnv, innerExecutionContext) => {
40
- const log = (0, autotel.getRequestLogger)(ctx, options?.requestLoggerOptions);
41
- const auto = enrichFromRequest(innerRequest);
42
- if (auto && Object.keys(auto).length > 0) log.set(auto);
43
- const custom = options?.enrich?.(innerRequest, innerEnv, innerExecutionContext);
44
- if (custom && Object.keys(custom).length > 0) log.set(custom);
45
- requestLoggers.set(innerRequest, log);
46
- try {
47
- return await handler(innerRequest, innerEnv, innerExecutionContext);
48
- } finally {
49
- if (options?.autoEmit !== false) log.emitNow();
50
- requestLoggers.delete(innerRequest);
51
- }
52
- })(request, env, executionContext);
70
+ const ctx = {
71
+ request,
72
+ env,
73
+ executionContext
74
+ };
75
+ try {
76
+ return await integration.runTraced(ctx, require_integration.buildTracedOptions(options, resolveSpanName(request, env, options)), async (handle) => require_integration.runWithIntegratedHandle(handle, options, async () => {
77
+ require_integration.applyLoggerEnrichment(handle.logger, enrichFromRequest(request), options?.enrichRequest?.(request, env, executionContext));
78
+ return handler(request, env, executionContext);
79
+ }));
80
+ } finally {
81
+ requestLoggers.delete(request);
82
+ }
53
83
  };
54
84
  }
55
- function createCloudflareAdapter(options) {
56
- return {
57
- withAutotelFetch: (handler) => withAutotelFetch(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
- };
63
- }
64
- const cloudflareToolkit = require_core.createAdapterToolkit({
65
- adapterName: "cloudflare",
66
- enrich: enrichFromRequest
67
- });
68
85
 
69
86
  //#endregion
70
- exports.cloudflareToolkit = cloudflareToolkit;
71
- exports.createCloudflareAdapter = createCloudflareAdapter;
72
87
  exports.createDrainPipeline = autotel.createDrainPipeline;
73
88
  exports.createStructuredError = autotel.createStructuredError;
74
89
  exports.parseError = autotel.parseError;
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.cjs","names":["getHeader","createUseLogger","createAdapterToolkit"],"sources":["../src/cloudflare.ts"],"sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n trace,\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 { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface CloudflareRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n cf?: Record<string, unknown>;\n}\n\nexport interface CloudflareExecutionContextLike {\n waitUntil?: (promise: Promise<unknown>) => void;\n passThroughOnException?: () => void;\n}\n\nexport interface CloudflareWithAutotelOptions<TEnv = unknown> {\n spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (\n request: CloudflareRequestLike,\n env: TEnv,\n ctx: CloudflareExecutionContextLike,\n ) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst requestLoggers = new WeakMap<object, RequestLogger>();\n\nfunction enrichFromRequest(\n request?: CloudflareRequestLike,\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\n const requestId =\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray');\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 ...(request.cf?.country ? { 'cloudflare.country': request.cf.country } : {}),\n ...(request.cf?.colo ? { 'cloudflare.colo': request.cf.colo } : {}),\n ...(request.cf?.city ? { 'cloudflare.city': request.cf.city } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: CloudflareRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n if (request) {\n const existing = requestLoggers.get(request as object);\n if (existing) return existing;\n }\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotelFetch<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n>(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n) => Promise<TReturn> {\n return async (\n request: TRequest,\n env: TEnv,\n executionContext: TContext,\n ): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request, env)\n : (options?.spanName ?? `cloudflare.${request.method ?? 'request'}`);\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (\n innerRequest: TRequest,\n innerEnv: TEnv,\n innerExecutionContext: TContext,\n ) => {\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?.(\n innerRequest,\n innerEnv,\n innerExecutionContext,\n );\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n\n requestLoggers.set(innerRequest as object, log);\n try {\n return await handler(innerRequest, innerEnv, innerExecutionContext);\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n requestLoggers.delete(innerRequest as object);\n }\n },\n );\n\n return await wrapped(request, env, executionContext);\n };\n}\n\nexport function createCloudflareAdapter<TEnv = unknown>(\n options?: CloudflareWithAutotelOptions<TEnv>,\n) {\n return {\n withAutotelFetch: <\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n >(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n ) => withAutotelFetch(handler, options),\n useLogger,\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 cloudflareToolkit = createAdapterToolkit<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;AA0CA,MAAM,iCAAiB,IAAI,QAA+B;AAE1D,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;CAGF,MAAM,YACJA,uBAAU,QAAQ,SAAS,cAAc,KACzCA,uBAAU,QAAQ,SAAS,QAAQ;CAErC,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;EACpD,GAAI,QAAQ,IAAI,UAAU,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAAI,CAAC;EAC1E,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;EACjE,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;CACnE;AACF;AAEA,MAAM,gBAAgBC,6BAAuC;CAC3D,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI,SAAS;EACX,MAAM,WAAW,eAAe,IAAI,OAAiB;EACrD,IAAI,UAAU,OAAO;CACvB;CACA,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAgB,iBAMd,SAKA,SAKoB;CACpB,OAAO,OACL,SACA,KACA,qBACqB;EAuCrB,OAAO,yBAhCL,EAAE,MALF,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,SAAS,GAAG,IAC5B,SAAS,YAAY,cAAc,QAAQ,UAAU,YAGzC,IAChB,QAAQ,OACP,cACA,UACA,0BACG;GACH,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,SACtB,cACA,UACA,qBACF;GACA,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAGhB,eAAe,IAAI,cAAwB,GAAG;GAC9C,IAAI;IACF,OAAO,MAAM,QAAQ,cAAc,UAAU,qBAAqB;GACpE,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;IAEd,eAAe,OAAO,YAAsB;GAC9C;EACF,CAGiB,CAAC,CAAC,SAAS,KAAK,gBAAgB;CACrD;AACF;AAEA,SAAgB,wBACd,SACA;CACA,OAAO;EACL,mBAKE,YAKG,iBAAiB,SAAS,OAAO;EACtC;EACA,aAAa,kCAA2C,KAAK;EAC7D,wBACE,6CAC0C,KAAK;EACjD,sBACE,kDAEoB,YAAY;CACpC;AACF;AAEA,MAAa,oBAAoBC,kCAA4C;CAC3E,aAAa;CACb,QAAQ;AACV,CAAC"}
1
+ {"version":3,"file":"cloudflare.cjs","names":["getHeader","createUseLogger","defineFrameworkIntegration","buildTracedOptions","runWithIntegratedHandle"],"sources":["../src/cloudflare.ts"],"sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface CloudflareRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n cf?: Record<string, unknown>;\n}\n\nexport interface CloudflareExecutionContextLike {\n waitUntil?: (promise: Promise<unknown>) => void;\n passThroughOnException?: () => void;\n}\n\nexport interface CloudflareHandlerContext<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n> {\n request: TRequest;\n env: TEnv;\n executionContext: TContext;\n}\n\nexport interface CloudflareWithAutotelOptions<TEnv = unknown>\n extends Omit<FrameworkHandlerOptions, 'spanName'> {\n spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);\n enrichRequest?: (\n request: CloudflareRequestLike,\n env: TEnv,\n ctx: CloudflareExecutionContextLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst requestLoggers = new WeakMap<object, RequestLogger>();\n\nfunction enrichFromRequest(\n request?: CloudflareRequestLike,\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\n const requestId =\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray');\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 ...(request.cf?.country ? { 'cloudflare.country': request.cf.country } : {}),\n ...(request.cf?.colo ? { 'cloudflare.colo': request.cf.colo } : {}),\n ...(request.cf?.city ? { 'cloudflare.city': request.cf.city } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: CloudflareRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n if (request) {\n const existing = requestLoggers.get(request as object);\n if (existing) return existing;\n }\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nfunction resolvePath(request: CloudflareRequestLike): string {\n if (!request.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nfunction createIntegration<TEnv>() {\n return defineFrameworkIntegration<\n CloudflareHandlerContext<TEnv, CloudflareRequestLike, CloudflareExecutionContextLike>\n >({\n name: 'cloudflare',\n extractRequest: ({ request }) => ({\n method: request.method ?? 'GET',\n path: resolvePath(request),\n headers: request.headers,\n requestId:\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray'),\n }),\n attachLogger: ({ request }, logger) => {\n requestLoggers.set(request as object, logger);\n },\n extractWaitUntil: ({ executionContext }) => {\n const waitUntil =\n typeof executionContext.waitUntil === 'function'\n ? executionContext.waitUntil.bind(executionContext)\n : undefined;\n return waitUntil;\n },\n });\n}\n\nconst integration = createIntegration<unknown>();\n\nfunction resolveSpanName<TEnv>(\n request: CloudflareRequestLike,\n env: TEnv,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request, env);\n }\n return options?.spanName ?? `cloudflare.${request.method ?? 'request'}`;\n}\n\nexport function withAutotelFetch<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n>(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n) => Promise<TReturn> {\n return async (\n request: TRequest,\n env: TEnv,\n executionContext: TContext,\n ): Promise<TReturn> => {\n const ctx = { request, env, executionContext };\n try {\n return await integration.runTraced(\n ctx,\n buildTracedOptions(options, resolveSpanName(request, env, options)),\n async (handle) =>\n runWithIntegratedHandle(handle, options, async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n options?.enrichRequest?.(request, env, executionContext),\n );\n return handler(request, env, executionContext);\n }),\n );\n } finally {\n requestLoggers.delete(request as object);\n }\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAqDA,MAAM,iCAAiB,IAAI,QAA+B;AAE1D,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;CAGF,MAAM,YACJA,uBAAU,QAAQ,SAAS,cAAc,KACzCA,uBAAU,QAAQ,SAAS,QAAQ;CAErC,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;EACpD,GAAI,QAAQ,IAAI,UAAU,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAAI,CAAC;EAC1E,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;EACjE,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;CACnE;AACF;AAEA,MAAM,gBAAgBC,6BAAuC;CAC3D,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI,SAAS;EACX,MAAM,WAAW,eAAe,IAAI,OAAiB;EACrD,IAAI,UAAU,OAAO;CACvB;CACA,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAS,YAAY,SAAwC;CAC3D,IAAI,CAAC,QAAQ,KAAK,OAAO;CACzB,IAAI;EACF,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC9B,QAAQ;EACN,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,oBAA0B;CACjC,OAAOC,+CAEL;EACA,MAAM;EACN,iBAAiB,EAAE,eAAe;GAChC,QAAQ,QAAQ,UAAU;GAC1B,MAAM,YAAY,OAAO;GACzB,SAAS,QAAQ;GACjB,WACEF,uBAAU,QAAQ,SAAS,cAAc,KACzCA,uBAAU,QAAQ,SAAS,QAAQ;EACvC;EACA,eAAe,EAAE,WAAW,WAAW;GACrC,eAAe,IAAI,SAAmB,MAAM;EAC9C;EACA,mBAAmB,EAAE,uBAAuB;GAK1C,OAHE,OAAO,iBAAiB,cAAc,aAClC,iBAAiB,UAAU,KAAK,gBAAgB,IAChD;EAER;CACF,CAAC;AACH;AAEA,MAAM,cAAc,kBAA2B;AAE/C,SAAS,gBACP,SACA,KACA,SACQ;CACR,IAAI,OAAO,SAAS,aAAa,YAC/B,OAAO,QAAQ,SAAS,SAAS,GAAG;CAEtC,OAAO,SAAS,YAAY,cAAc,QAAQ,UAAU;AAC9D;AAEA,SAAgB,iBAMd,SAKA,SAKoB;CACpB,OAAO,OACL,SACA,KACA,qBACqB;EACrB,MAAM,MAAM;GAAE;GAAS;GAAK;EAAiB;EAC7C,IAAI;GACF,OAAO,MAAM,YAAY,UACvB,KACAG,uCAAmB,SAAS,gBAAgB,SAAS,KAAK,OAAO,CAAC,GAClE,OAAO,WACLC,4CAAwB,QAAQ,SAAS,YAAY;IACnD,0CACE,OAAO,QACP,kBAAkB,OAAO,GACzB,SAAS,gBAAgB,SAAS,KAAK,gBAAgB,CACzD;IACA,OAAO,QAAQ,SAAS,KAAK,gBAAgB;GAC/C,CAAC,CACL;EACF,UAAU;GACR,eAAe,OAAO,OAAiB;EACzC;CACF;AACF"}
@@ -1,5 +1,5 @@
1
- import { AdapterToolkit } from "./core.cjs";
2
- import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
1
+ import { n as FrameworkHandlerOptions } from "./integration-7--zN-83.cjs";
2
+ import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
3
3
 
4
4
  //#region src/cloudflare.d.ts
5
5
  interface CloudflareRequestLike {
@@ -14,23 +14,17 @@ interface CloudflareExecutionContextLike {
14
14
  waitUntil?: (promise: Promise<unknown>) => void;
15
15
  passThroughOnException?: () => void;
16
16
  }
17
- interface CloudflareWithAutotelOptions<TEnv = unknown> {
17
+ interface CloudflareHandlerContext<TEnv, TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike> {
18
+ request: TRequest;
19
+ env: TEnv;
20
+ executionContext: TContext;
21
+ }
22
+ interface CloudflareWithAutotelOptions<TEnv = unknown> extends Omit<FrameworkHandlerOptions, 'spanName'> {
18
23
  spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);
19
- requestLoggerOptions?: RequestLoggerOptions;
20
- enrich?: (request: CloudflareRequestLike, env: TEnv, ctx: CloudflareExecutionContextLike) => Record<string, unknown> | undefined;
21
- /** Emit one wide event automatically when the handler settles. Default `true`. */
22
- autoEmit?: boolean;
24
+ enrichRequest?: (request: CloudflareRequestLike, env: TEnv, ctx: CloudflareExecutionContextLike) => Record<string, unknown> | undefined;
23
25
  }
24
26
  declare function useLogger(request?: CloudflareRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
25
27
  declare function withAutotelFetch<TEnv, TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike, TReturn>(handler: (request: TRequest, env: TEnv, ctx: TContext) => TReturn | Promise<TReturn>, options?: CloudflareWithAutotelOptions<TEnv>): (request: TRequest, env: TEnv, ctx: TContext) => Promise<TReturn>;
26
- declare function createCloudflareAdapter<TEnv = unknown>(options?: CloudflareWithAutotelOptions<TEnv>): {
27
- withAutotelFetch: <TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike, TReturn>(handler: (request: TRequest, env: TEnv, ctx: TContext) => TReturn | Promise<TReturn>) => (request: TRequest, env: TEnv, ctx: TContext) => Promise<TReturn>;
28
- useLogger: typeof useLogger;
29
- parseError: (error: unknown) => ParsedError;
30
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
31
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
32
- };
33
- declare const cloudflareToolkit: AdapterToolkit<CloudflareRequestLike>;
34
28
  //#endregion
35
- export { CloudflareExecutionContextLike, CloudflareRequestLike, CloudflareWithAutotelOptions, cloudflareToolkit, createCloudflareAdapter, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
29
+ export { CloudflareExecutionContextLike, CloudflareHandlerContext, CloudflareRequestLike, CloudflareWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
36
30
  //# sourceMappingURL=cloudflare.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.cts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAgBiB,qBAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAA;EACJ,EAAA,GAAK,MAAM;AAAA;AAAA,UAGI,8BAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAO;EAC7B,sBAAA;AAAA;AAAA,UAGe,4BAAA;EACf,QAAA,cAAsB,OAAA,EAAS,qBAAA,EAAuB,GAAA,EAAK,IAAA;EAC3D,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IACE,OAAA,EAAS,qBAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,8BAAA,KACF,MAAA;EAfM;EAiBX,QAAA;AAAA;AAAA,iBAuCc,SAAA,CACd,OAAA,GAAU,qBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAQa,gBAAA,wBAEG,qBAAA,mBACA,8BAAA,WAGjB,OAAA,GACE,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,GACvB,OAAA,GAAU,4BAAA,CAA6B,IAAA,KAEvC,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,CAAQ,OAAA;AAAA,iBAgDG,uBAAA,iBACd,OAAA,GAAU,4BAAA,CAA6B,IAAA;sCAIlB,qBAAA,mBACA,8BAAA,WACV,OAAA,GAGL,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,OAAA,EAAA,QAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,QAAA,KAAA,OAAA,CAAA,OAAA;;kCAGH,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,iBAAA,EAAiB,cAAA,CAAA,qBAAA"}
1
+ {"version":3,"file":"cloudflare.d.cts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB,qBAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAA;EACJ,EAAA,GAAK,MAAM;AAAA;AAAA,UAGI,8BAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAO;EAC7B,sBAAA;AAAA;AAAA,UAGe,wBAAA,wBAEE,qBAAA,mBACA,8BAAA;EAEjB,OAAA,EAAS,QAAA;EACT,GAAA,EAAK,IAAA;EACL,gBAAA,EAAkB,QAAA;AAAA;AAAA,UAGH,4BAAA,yBACP,IAAA,CAAK,uBAAA;EACb,QAAA,cAAsB,OAAA,EAAS,qBAAA,EAAuB,GAAA,EAAK,IAAA;EAC3D,aAAA,IACE,OAAA,EAAS,qBAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,8BAAA,KACF,MAAA;AAAA;AAAA,iBAuCS,SAAA,CACd,OAAA,GAAU,qBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAwDa,gBAAA,wBAEG,qBAAA,mBACA,8BAAA,WAGjB,OAAA,GACE,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,GACvB,OAAA,GAAU,4BAAA,CAA6B,IAAA,KAEvC,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,CAAQ,OAAA"}
@@ -1,5 +1,5 @@
1
- import { AdapterToolkit } from "./core.js";
2
- import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
1
+ import { n as FrameworkHandlerOptions } from "./integration-CaG_l5xr.js";
2
+ import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
3
3
 
4
4
  //#region src/cloudflare.d.ts
5
5
  interface CloudflareRequestLike {
@@ -14,23 +14,17 @@ interface CloudflareExecutionContextLike {
14
14
  waitUntil?: (promise: Promise<unknown>) => void;
15
15
  passThroughOnException?: () => void;
16
16
  }
17
- interface CloudflareWithAutotelOptions<TEnv = unknown> {
17
+ interface CloudflareHandlerContext<TEnv, TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike> {
18
+ request: TRequest;
19
+ env: TEnv;
20
+ executionContext: TContext;
21
+ }
22
+ interface CloudflareWithAutotelOptions<TEnv = unknown> extends Omit<FrameworkHandlerOptions, 'spanName'> {
18
23
  spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);
19
- requestLoggerOptions?: RequestLoggerOptions;
20
- enrich?: (request: CloudflareRequestLike, env: TEnv, ctx: CloudflareExecutionContextLike) => Record<string, unknown> | undefined;
21
- /** Emit one wide event automatically when the handler settles. Default `true`. */
22
- autoEmit?: boolean;
24
+ enrichRequest?: (request: CloudflareRequestLike, env: TEnv, ctx: CloudflareExecutionContextLike) => Record<string, unknown> | undefined;
23
25
  }
24
26
  declare function useLogger(request?: CloudflareRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
25
27
  declare function withAutotelFetch<TEnv, TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike, TReturn>(handler: (request: TRequest, env: TEnv, ctx: TContext) => TReturn | Promise<TReturn>, options?: CloudflareWithAutotelOptions<TEnv>): (request: TRequest, env: TEnv, ctx: TContext) => Promise<TReturn>;
26
- declare function createCloudflareAdapter<TEnv = unknown>(options?: CloudflareWithAutotelOptions<TEnv>): {
27
- withAutotelFetch: <TRequest extends CloudflareRequestLike, TContext extends CloudflareExecutionContextLike, TReturn>(handler: (request: TRequest, env: TEnv, ctx: TContext) => TReturn | Promise<TReturn>) => (request: TRequest, env: TEnv, ctx: TContext) => Promise<TReturn>;
28
- useLogger: typeof useLogger;
29
- parseError: (error: unknown) => ParsedError;
30
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
31
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
32
- };
33
- declare const cloudflareToolkit: AdapterToolkit<CloudflareRequestLike>;
34
28
  //#endregion
35
- export { CloudflareExecutionContextLike, CloudflareRequestLike, CloudflareWithAutotelOptions, cloudflareToolkit, createCloudflareAdapter, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
29
+ export { CloudflareExecutionContextLike, CloudflareHandlerContext, CloudflareRequestLike, CloudflareWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
36
30
  //# sourceMappingURL=cloudflare.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAgBiB,qBAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAA;EACJ,EAAA,GAAK,MAAM;AAAA;AAAA,UAGI,8BAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAO;EAC7B,sBAAA;AAAA;AAAA,UAGe,4BAAA;EACf,QAAA,cAAsB,OAAA,EAAS,qBAAA,EAAuB,GAAA,EAAK,IAAA;EAC3D,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IACE,OAAA,EAAS,qBAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,8BAAA,KACF,MAAA;EAfM;EAiBX,QAAA;AAAA;AAAA,iBAuCc,SAAA,CACd,OAAA,GAAU,qBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAQa,gBAAA,wBAEG,qBAAA,mBACA,8BAAA,WAGjB,OAAA,GACE,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,GACvB,OAAA,GAAU,4BAAA,CAA6B,IAAA,KAEvC,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,CAAQ,OAAA;AAAA,iBAgDG,uBAAA,iBACd,OAAA,GAAU,4BAAA,CAA6B,IAAA;sCAIlB,qBAAA,mBACA,8BAAA,WACV,OAAA,GAGL,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,OAAQ,OAAA,EAAA,QAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,EAAA,QAAA,KAAA,OAAA,CAAA,OAAA;;kCAGH,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,iBAAA,EAAiB,cAAA,CAAA,qBAAA"}
1
+ {"version":3,"file":"cloudflare.d.ts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB,qBAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAA;EACJ,EAAA,GAAK,MAAM;AAAA;AAAA,UAGI,8BAAA;EACf,SAAA,IAAa,OAAA,EAAS,OAAO;EAC7B,sBAAA;AAAA;AAAA,UAGe,wBAAA,wBAEE,qBAAA,mBACA,8BAAA;EAEjB,OAAA,EAAS,QAAA;EACT,GAAA,EAAK,IAAA;EACL,gBAAA,EAAkB,QAAA;AAAA;AAAA,UAGH,4BAAA,yBACP,IAAA,CAAK,uBAAA;EACb,QAAA,cAAsB,OAAA,EAAS,qBAAA,EAAuB,GAAA,EAAK,IAAA;EAC3D,aAAA,IACE,OAAA,EAAS,qBAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,8BAAA,KACF,MAAA;AAAA;AAAA,iBAuCS,SAAA,CACd,OAAA,GAAU,qBAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAwDa,gBAAA,wBAEG,qBAAA,mBACA,8BAAA,WAGjB,OAAA,GACE,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,GAAU,OAAA,CAAQ,OAAA,GACvB,OAAA,GAAU,4BAAA,CAA6B,IAAA,KAEvC,OAAA,EAAS,QAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,QAAA,KACF,OAAA,CAAQ,OAAA"}
@@ -1,5 +1,6 @@
1
- import { createAdapterToolkit, createUseLogger, getHeader } from "./core.js";
2
- import { createDrainPipeline, createStructuredError, getRequestLogger, parseError, trace } from "autotel";
1
+ import { a as runWithIntegratedHandle, i as defineFrameworkIntegration, n as buildTracedOptions, t as applyLoggerEnrichment } from "./integration-BRVGyxPG.js";
2
+ import { createUseLogger, getHeader } from "./core.js";
3
+ import { createDrainPipeline, createStructuredError, parseError } from "autotel";
3
4
 
4
5
  //#region src/cloudflare.ts
5
6
  const requestLoggers = /* @__PURE__ */ new WeakMap();
@@ -33,38 +34,54 @@ function useLogger(request, requestLoggerOptions) {
33
34
  }
34
35
  return baseUseLogger(request, requestLoggerOptions);
35
36
  }
37
+ function resolvePath(request) {
38
+ if (!request.url) return "/";
39
+ try {
40
+ return new URL(request.url).pathname;
41
+ } catch {
42
+ return request.url;
43
+ }
44
+ }
45
+ function createIntegration() {
46
+ return defineFrameworkIntegration({
47
+ name: "cloudflare",
48
+ extractRequest: ({ request }) => ({
49
+ method: request.method ?? "GET",
50
+ path: resolvePath(request),
51
+ headers: request.headers,
52
+ requestId: getHeader(request.headers, "x-request-id") ?? getHeader(request.headers, "cf-ray")
53
+ }),
54
+ attachLogger: ({ request }, logger) => {
55
+ requestLoggers.set(request, logger);
56
+ },
57
+ extractWaitUntil: ({ executionContext }) => {
58
+ return typeof executionContext.waitUntil === "function" ? executionContext.waitUntil.bind(executionContext) : void 0;
59
+ }
60
+ });
61
+ }
62
+ const integration = createIntegration();
63
+ function resolveSpanName(request, env, options) {
64
+ if (typeof options?.spanName === "function") return options.spanName(request, env);
65
+ return options?.spanName ?? `cloudflare.${request.method ?? "request"}`;
66
+ }
36
67
  function withAutotelFetch(handler, options) {
37
68
  return async (request, env, executionContext) => {
38
- return await trace({ name: typeof options?.spanName === "function" ? options.spanName(request, env) : options?.spanName ?? `cloudflare.${request.method ?? "request"}` }, (ctx) => async (innerRequest, innerEnv, innerExecutionContext) => {
39
- const log = getRequestLogger(ctx, options?.requestLoggerOptions);
40
- const auto = enrichFromRequest(innerRequest);
41
- if (auto && Object.keys(auto).length > 0) log.set(auto);
42
- const custom = options?.enrich?.(innerRequest, innerEnv, innerExecutionContext);
43
- if (custom && Object.keys(custom).length > 0) log.set(custom);
44
- requestLoggers.set(innerRequest, log);
45
- try {
46
- return await handler(innerRequest, innerEnv, innerExecutionContext);
47
- } finally {
48
- if (options?.autoEmit !== false) log.emitNow();
49
- requestLoggers.delete(innerRequest);
50
- }
51
- })(request, env, executionContext);
69
+ const ctx = {
70
+ request,
71
+ env,
72
+ executionContext
73
+ };
74
+ try {
75
+ return await integration.runTraced(ctx, buildTracedOptions(options, resolveSpanName(request, env, options)), async (handle) => runWithIntegratedHandle(handle, options, async () => {
76
+ applyLoggerEnrichment(handle.logger, enrichFromRequest(request), options?.enrichRequest?.(request, env, executionContext));
77
+ return handler(request, env, executionContext);
78
+ }));
79
+ } finally {
80
+ requestLoggers.delete(request);
81
+ }
52
82
  };
53
83
  }
54
- function createCloudflareAdapter(options) {
55
- return {
56
- withAutotelFetch: (handler) => withAutotelFetch(handler, options),
57
- useLogger,
58
- parseError: (error) => parseError(error),
59
- createStructuredError: (input) => createStructuredError(input),
60
- createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
61
- };
62
- }
63
- const cloudflareToolkit = createAdapterToolkit({
64
- adapterName: "cloudflare",
65
- enrich: enrichFromRequest
66
- });
67
84
 
68
85
  //#endregion
69
- export { cloudflareToolkit, createCloudflareAdapter, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
86
+ export { createDrainPipeline, createStructuredError, parseError, useLogger, withAutotelFetch };
70
87
  //# sourceMappingURL=cloudflare.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.js","names":[],"sources":["../src/cloudflare.ts"],"sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n trace,\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 { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface CloudflareRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n cf?: Record<string, unknown>;\n}\n\nexport interface CloudflareExecutionContextLike {\n waitUntil?: (promise: Promise<unknown>) => void;\n passThroughOnException?: () => void;\n}\n\nexport interface CloudflareWithAutotelOptions<TEnv = unknown> {\n spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (\n request: CloudflareRequestLike,\n env: TEnv,\n ctx: CloudflareExecutionContextLike,\n ) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst requestLoggers = new WeakMap<object, RequestLogger>();\n\nfunction enrichFromRequest(\n request?: CloudflareRequestLike,\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\n const requestId =\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray');\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 ...(request.cf?.country ? { 'cloudflare.country': request.cf.country } : {}),\n ...(request.cf?.colo ? { 'cloudflare.colo': request.cf.colo } : {}),\n ...(request.cf?.city ? { 'cloudflare.city': request.cf.city } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: CloudflareRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n if (request) {\n const existing = requestLoggers.get(request as object);\n if (existing) return existing;\n }\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotelFetch<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n>(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n) => Promise<TReturn> {\n return async (\n request: TRequest,\n env: TEnv,\n executionContext: TContext,\n ): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request, env)\n : (options?.spanName ?? `cloudflare.${request.method ?? 'request'}`);\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (\n innerRequest: TRequest,\n innerEnv: TEnv,\n innerExecutionContext: TContext,\n ) => {\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?.(\n innerRequest,\n innerEnv,\n innerExecutionContext,\n );\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n\n requestLoggers.set(innerRequest as object, log);\n try {\n return await handler(innerRequest, innerEnv, innerExecutionContext);\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n requestLoggers.delete(innerRequest as object);\n }\n },\n );\n\n return await wrapped(request, env, executionContext);\n };\n}\n\nexport function createCloudflareAdapter<TEnv = unknown>(\n options?: CloudflareWithAutotelOptions<TEnv>,\n) {\n return {\n withAutotelFetch: <\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n >(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n ) => withAutotelFetch(handler, options),\n useLogger,\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 cloudflareToolkit = createAdapterToolkit<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;AA0CA,MAAM,iCAAiB,IAAI,QAA+B;AAE1D,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;CAGF,MAAM,YACJ,UAAU,QAAQ,SAAS,cAAc,KACzC,UAAU,QAAQ,SAAS,QAAQ;CAErC,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;EACpD,GAAI,QAAQ,IAAI,UAAU,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAAI,CAAC;EAC1E,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;EACjE,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;CACnE;AACF;AAEA,MAAM,gBAAgB,gBAAuC;CAC3D,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI,SAAS;EACX,MAAM,WAAW,eAAe,IAAI,OAAiB;EACrD,IAAI,UAAU,OAAO;CACvB;CACA,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAgB,iBAMd,SAKA,SAKoB;CACpB,OAAO,OACL,SACA,KACA,qBACqB;EAuCrB,OAAO,MAjCS,MACd,EAAE,MALF,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,SAAS,GAAG,IAC5B,SAAS,YAAY,cAAc,QAAQ,UAAU,YAGzC,IAChB,QAAQ,OACP,cACA,UACA,0BACG;GACH,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,SACtB,cACA,UACA,qBACF;GACA,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAGhB,eAAe,IAAI,cAAwB,GAAG;GAC9C,IAAI;IACF,OAAO,MAAM,QAAQ,cAAc,UAAU,qBAAqB;GACpE,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;IAEd,eAAe,OAAO,YAAsB;GAC9C;EACF,CAGiB,CAAC,CAAC,SAAS,KAAK,gBAAgB;CACrD;AACF;AAEA,SAAgB,wBACd,SACA;CACA,OAAO;EACL,mBAKE,YAKG,iBAAiB,SAAS,OAAO;EACtC;EACA,aAAa,UAAgC,WAAW,KAAK;EAC7D,wBACE,UACoB,sBAAsB,KAAK;EACjD,sBACE,iBAEA,oBAAoB,YAAY;CACpC;AACF;AAEA,MAAa,oBAAoB,qBAA4C;CAC3E,aAAa;CACb,QAAQ;AACV,CAAC"}
1
+ {"version":3,"file":"cloudflare.js","names":[],"sources":["../src/cloudflare.ts"],"sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface CloudflareRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n cf?: Record<string, unknown>;\n}\n\nexport interface CloudflareExecutionContextLike {\n waitUntil?: (promise: Promise<unknown>) => void;\n passThroughOnException?: () => void;\n}\n\nexport interface CloudflareHandlerContext<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n> {\n request: TRequest;\n env: TEnv;\n executionContext: TContext;\n}\n\nexport interface CloudflareWithAutotelOptions<TEnv = unknown>\n extends Omit<FrameworkHandlerOptions, 'spanName'> {\n spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);\n enrichRequest?: (\n request: CloudflareRequestLike,\n env: TEnv,\n ctx: CloudflareExecutionContextLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst requestLoggers = new WeakMap<object, RequestLogger>();\n\nfunction enrichFromRequest(\n request?: CloudflareRequestLike,\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\n const requestId =\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray');\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 ...(request.cf?.country ? { 'cloudflare.country': request.cf.country } : {}),\n ...(request.cf?.colo ? { 'cloudflare.colo': request.cf.colo } : {}),\n ...(request.cf?.city ? { 'cloudflare.city': request.cf.city } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: CloudflareRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n if (request) {\n const existing = requestLoggers.get(request as object);\n if (existing) return existing;\n }\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nfunction resolvePath(request: CloudflareRequestLike): string {\n if (!request.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nfunction createIntegration<TEnv>() {\n return defineFrameworkIntegration<\n CloudflareHandlerContext<TEnv, CloudflareRequestLike, CloudflareExecutionContextLike>\n >({\n name: 'cloudflare',\n extractRequest: ({ request }) => ({\n method: request.method ?? 'GET',\n path: resolvePath(request),\n headers: request.headers,\n requestId:\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray'),\n }),\n attachLogger: ({ request }, logger) => {\n requestLoggers.set(request as object, logger);\n },\n extractWaitUntil: ({ executionContext }) => {\n const waitUntil =\n typeof executionContext.waitUntil === 'function'\n ? executionContext.waitUntil.bind(executionContext)\n : undefined;\n return waitUntil;\n },\n });\n}\n\nconst integration = createIntegration<unknown>();\n\nfunction resolveSpanName<TEnv>(\n request: CloudflareRequestLike,\n env: TEnv,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request, env);\n }\n return options?.spanName ?? `cloudflare.${request.method ?? 'request'}`;\n}\n\nexport function withAutotelFetch<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n>(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n) => Promise<TReturn> {\n return async (\n request: TRequest,\n env: TEnv,\n executionContext: TContext,\n ): Promise<TReturn> => {\n const ctx = { request, env, executionContext };\n try {\n return await integration.runTraced(\n ctx,\n buildTracedOptions(options, resolveSpanName(request, env, options)),\n async (handle) =>\n runWithIntegratedHandle(handle, options, async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n options?.enrichRequest?.(request, env, executionContext),\n );\n return handler(request, env, executionContext);\n }),\n );\n } finally {\n requestLoggers.delete(request as object);\n }\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;AAqDA,MAAM,iCAAiB,IAAI,QAA+B;AAE1D,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;CAGF,MAAM,YACJ,UAAU,QAAQ,SAAS,cAAc,KACzC,UAAU,QAAQ,SAAS,QAAQ;CAErC,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;EACpD,GAAI,QAAQ,IAAI,UAAU,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAAI,CAAC;EAC1E,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;EACjE,GAAI,QAAQ,IAAI,OAAO,EAAE,mBAAmB,QAAQ,GAAG,KAAK,IAAI,CAAC;CACnE;AACF;AAEA,MAAM,gBAAgB,gBAAuC;CAC3D,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI,SAAS;EACX,MAAM,WAAW,eAAe,IAAI,OAAiB;EACrD,IAAI,UAAU,OAAO;CACvB;CACA,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAS,YAAY,SAAwC;CAC3D,IAAI,CAAC,QAAQ,KAAK,OAAO;CACzB,IAAI;EACF,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC9B,QAAQ;EACN,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,oBAA0B;CACjC,OAAO,2BAEL;EACA,MAAM;EACN,iBAAiB,EAAE,eAAe;GAChC,QAAQ,QAAQ,UAAU;GAC1B,MAAM,YAAY,OAAO;GACzB,SAAS,QAAQ;GACjB,WACE,UAAU,QAAQ,SAAS,cAAc,KACzC,UAAU,QAAQ,SAAS,QAAQ;EACvC;EACA,eAAe,EAAE,WAAW,WAAW;GACrC,eAAe,IAAI,SAAmB,MAAM;EAC9C;EACA,mBAAmB,EAAE,uBAAuB;GAK1C,OAHE,OAAO,iBAAiB,cAAc,aAClC,iBAAiB,UAAU,KAAK,gBAAgB,IAChD;EAER;CACF,CAAC;AACH;AAEA,MAAM,cAAc,kBAA2B;AAE/C,SAAS,gBACP,SACA,KACA,SACQ;CACR,IAAI,OAAO,SAAS,aAAa,YAC/B,OAAO,QAAQ,SAAS,SAAS,GAAG;CAEtC,OAAO,SAAS,YAAY,cAAc,QAAQ,UAAU;AAC9D;AAEA,SAAgB,iBAMd,SAKA,SAKoB;CACpB,OAAO,OACL,SACA,KACA,qBACqB;EACrB,MAAM,MAAM;GAAE;GAAS;GAAK;EAAiB;EAC7C,IAAI;GACF,OAAO,MAAM,YAAY,UACvB,KACA,mBAAmB,SAAS,gBAAgB,SAAS,KAAK,OAAO,CAAC,GAClE,OAAO,WACL,wBAAwB,QAAQ,SAAS,YAAY;IACnD,sBACE,OAAO,QACP,kBAAkB,OAAO,GACzB,SAAS,gBAAgB,SAAS,KAAK,gBAAgB,CACzD;IACA,OAAO,QAAQ,SAAS,KAAK,gBAAgB;GAC/C,CAAC,CACL;EACF,UAAU;GACR,eAAe,OAAO,OAAiB;EACzC;CACF;AACF"}
package/dist/core.cjs CHANGED
@@ -1,5 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_integration = require('./integration-Dd8Pi7jc.cjs');
2
3
  let autotel = require("autotel");
4
+ let autotel_edge = require("autotel-edge");
3
5
 
4
6
  //#region src/core.ts
5
7
  function createUseLogger(options) {
@@ -25,8 +27,10 @@ function createUseLogger(options) {
25
27
  */
26
28
  function createRequestRunner(storage) {
27
29
  return function runRequest(spanName, enrich, handler, options) {
30
+ if (options?.path && !(0, autotel_edge.shouldInstrumentPath)(options.path, options)) return Promise.resolve(handler());
31
+ const loggerOptions = require_integration.mergeRequestLoggerOptions(options?.requestLoggerOptions, options?.waitUntil);
28
32
  return (0, autotel.trace)({ name: spanName }, (ctx) => async () => {
29
- const log = (0, autotel.getRequestLogger)(ctx, options?.requestLoggerOptions);
33
+ const log = (0, autotel.getRequestLogger)(ctx, loggerOptions);
30
34
  enrich(log);
31
35
  try {
32
36
  return await storage.run(log, () => handler());
@@ -39,14 +43,6 @@ function createRequestRunner(storage) {
39
43
  })();
40
44
  };
41
45
  }
42
- function createAdapterToolkit(options) {
43
- return {
44
- useLogger: createUseLogger(options),
45
- parseError: autotel.parseError,
46
- createStructuredError: autotel.createStructuredError,
47
- createDrainPipeline: autotel.createDrainPipeline
48
- };
49
- }
50
46
  function resolveEnv(envKeys) {
51
47
  if (!envKeys) return void 0;
52
48
  for (const key of envKeys) {
@@ -108,10 +104,10 @@ function getHeader(headers, name) {
108
104
  }
109
105
 
110
106
  //#endregion
111
- exports.createAdapterToolkit = createAdapterToolkit;
112
107
  exports.createRequestRunner = createRequestRunner;
113
108
  exports.createUseLogger = createUseLogger;
114
109
  exports.getHeader = getHeader;
115
110
  exports.resolveAdapterConfig = resolveAdapterConfig;
116
111
  exports.shouldProbeRuntime = shouldProbeRuntime;
112
+ exports.toRouteAdapterOptions = require_integration.toRouteAdapterOptions;
117
113
  //# sourceMappingURL=core.cjs.map
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","names":[],"sources":["../src/core.ts"],"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"],"mappings":";;;;AAkCA,SAAgB,gBACd,SACA;CACA,OAAO,SAAS,UACd,SACA,sBACe;EACf,IAAI;EACJ,IAAI;GACF,uCAA0B,QAAW,oBAAoB;EAC3D,QAAQ;GACN,MAAM,IAAI,MACR,qBAAqB,QAAQ,YAAY,4GAE3C;EACF;EAEA,IAAI,WAAW,QAAQ,QAAQ;GAC7B,MAAM,QAAQ,QAAQ,OAAO,OAAO;GACpC,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GACvC,OAAO,IAAI,KAAK;EAEpB;EAEA,OAAO;CACT;AACF;;;;;;;AAgBA,SAAgB,oBAAoB,SAA2C;CAC7E,OAAO,SAAS,WACd,UACA,QACA,SACA,SACY;EAkBZ,0BAhBE,EAAE,MAAM,SAAS,IAChB,QAAQ,YAAwB;GAC/B,MAAM,oCAAuB,KAAK,SAAS,oBAAoB;GAC/D,OAAO,GAAG;GACV,IAAI;IACF,OAAO,MAAM,QAAQ,IAAI,WAAW,QAAQ,CAAC;GAC/C,SAAS,OAAO;IACd,IAAI,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;IACnE,MAAM;GACR,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ,SAAS,WAAW,CAAC;GAErC;EACF,CAEW,CAAC,CAAC;CACjB;AACF;AAEA,SAAgB,qBACd,SAC0B;CAC1B,OAAO;EACL,WAAW,gBAAgB,OAAO;EAClC;EACA;EACA;CACF;AACF;AAWA,SAAS,WAAW,SAAwC;CAC1D,IAAI,CAAC,SAAS,OAAO;CACrB,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,QAAQ,QAAQ,IAAI;EAC1B,IAAI,OAAO,OAAO;CACpB;AAEF;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,mBACd,QACA,WACS;CACT,OAAO,OAAO,MAAM,EAAE,KAAK,UAAU;EACnC,IAAI,CAAC,OAAO,IAAI,WAAW,GAAG,OAAO;EACrC,IAAI,YAAY,SAAS,QAAW,OAAO;EAC3C,OAAO;CACT,CAAC;AACH;;;;;;;;;;;;;;AAeA,eAAsB,qBACpB,WACA,QACA,WACA,OACqB;CACrB,MAAM,gBAAgB,mBAAmB,QAAQ,SAAS,IACtD,MAAM,MAAM,IACZ;CACJ,MAAM,YAAY,eAAe,UAAU;CAC3C,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,EAAE,KAAK,SAAS,QACzB,OAAO,OACL,YAAY,QACZ,YAAY,QACZ,SAAS,QACT,WAAW,GAAG;CAGlB,OAAO;AACT;AAMA,SAAgB,UACd,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAO,QAAQ,IAAI,IAAI,KAAK;CAE9B,MAAM,aAAa;CACnB,MAAM,QAAQ,WAAW,SAAS,WAAW,KAAK,YAAY;CAC9D,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C"}
1
+ {"version":3,"file":"core.cjs","names":["mergeRequestLoggerOptions"],"sources":["../src/core.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\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';\nimport {\n mergeRequestLoggerOptions,\n shouldInstrumentPath,\n type RouteAdapterOptions,\n} from './toolkit/middleware';\nimport {\n toRouteAdapterOptions,\n type FrameworkHandlerOptions,\n type IntegratedCompletionOptions,\n} from './toolkit/integration';\n\nexport { toRouteAdapterOptions };\nexport type {\n RouteAdapterOptions,\n FrameworkHandlerOptions,\n IntegratedCompletionOptions,\n};\nexport type BaseAdapterOptions = RouteAdapterOptions;\n\nexport interface AdapterUseLoggerOptions<TContext> {\n adapterName: string;\n enrich?: (context: TContext) => Record<string, unknown> | undefined;\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 extends RouteAdapterOptions {\n requestLoggerOptions?: RequestLoggerOptions;\n /** HTTP route used for include/exclude filtering. */\n path?: string;\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 if (options?.path && !shouldInstrumentPath(options.path, options)) {\n return Promise.resolve(handler());\n }\n\n const loggerOptions = mergeRequestLoggerOptions(\n options?.requestLoggerOptions,\n options?.waitUntil,\n );\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (): Promise<T> => {\n const log = getRequestLogger(ctx, loggerOptions);\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\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"],"mappings":";;;;;;AAqCA,SAAgB,gBACd,SACA;CACA,OAAO,SAAS,UACd,SACA,sBACe;EACf,IAAI;EACJ,IAAI;GACF,uCAA0B,QAAW,oBAAoB;EAC3D,QAAQ;GACN,MAAM,IAAI,MACR,qBAAqB,QAAQ,YAAY,4GAE3C;EACF;EAEA,IAAI,WAAW,QAAQ,QAAQ;GAC7B,MAAM,QAAQ,QAAQ,OAAO,OAAO;GACpC,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GACvC,OAAO,IAAI,KAAK;EAEpB;EAEA,OAAO;CACT;AACF;;;;;;;AAkBA,SAAgB,oBAAoB,SAA2C;CAC7E,OAAO,SAAS,WACd,UACA,QACA,SACA,SACY;EACZ,IAAI,SAAS,QAAQ,wCAAsB,QAAQ,MAAM,OAAO,GAC9D,OAAO,QAAQ,QAAQ,QAAQ,CAAC;EAGlC,MAAM,gBAAgBA,8CACpB,SAAS,sBACT,SAAS,SACX;EAmBA,0BAhBE,EAAE,MAAM,SAAS,IAChB,QAAQ,YAAwB;GAC/B,MAAM,oCAAuB,KAAK,aAAa;GAC/C,OAAO,GAAG;GACV,IAAI;IACF,OAAO,MAAM,QAAQ,IAAI,WAAW,QAAQ,CAAC;GAC/C,SAAS,OAAO;IACd,IAAI,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;IACnE,MAAM;GACR,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ,SAAS,WAAW,CAAC;GAErC;EACF,CAEW,CAAC,CAAC;CACjB;AACF;AAWA,SAAS,WAAW,SAAwC;CAC1D,IAAI,CAAC,SAAS,OAAO;CACrB,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,QAAQ,QAAQ,IAAI;EAC1B,IAAI,OAAO,OAAO;CACpB;AAEF;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,mBACd,QACA,WACS;CACT,OAAO,OAAO,MAAM,EAAE,KAAK,UAAU;EACnC,IAAI,CAAC,OAAO,IAAI,WAAW,GAAG,OAAO;EACrC,IAAI,YAAY,SAAS,QAAW,OAAO;EAC3C,OAAO;CACT,CAAC;AACH;;;;;;;;;;;;;;AAeA,eAAsB,qBACpB,WACA,QACA,WACA,OACqB;CACrB,MAAM,gBAAgB,mBAAmB,QAAQ,SAAS,IACtD,MAAM,MAAM,IACZ;CACJ,MAAM,YAAY,eAAe,UAAU;CAC3C,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,CAAC;CACzC,KAAK,MAAM,EAAE,KAAK,SAAS,QACzB,OAAO,OACL,YAAY,QACZ,YAAY,QACZ,SAAS,QACT,WAAW,GAAG;CAGlB,OAAO;AACT;AAMA,SAAgB,UACd,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,YAC7C,OAAO,QAAQ,IAAI,IAAI,KAAK;CAE9B,MAAM,aAAa;CACnB,MAAM,QAAQ,WAAW,SAAS,WAAW,KAAK,YAAY;CAC9D,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C"}
package/dist/core.d.cts CHANGED
@@ -1,20 +1,18 @@
1
- import { AsyncLocalStorage } from "node:async_hooks";
1
+ import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-7--zN-83.cjs";
2
2
  import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
3
+ import { AsyncLocalStorage } from "node:async_hooks";
3
4
 
4
5
  //#region src/core.d.ts
6
+ type BaseAdapterOptions = RouteAdapterOptions;
5
7
  interface AdapterUseLoggerOptions<TContext> {
6
8
  adapterName: string;
7
9
  enrich?: (context: TContext) => Record<string, unknown> | undefined;
8
10
  }
9
- interface AdapterToolkit<TContext> {
10
- useLogger: (context?: TContext, options?: RequestLoggerOptions) => RequestLogger;
11
- parseError: (error: unknown) => ParsedError;
12
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
13
- createDrainPipeline: <T = unknown>(options?: DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;
14
- }
15
11
  declare function createUseLogger<TContext = unknown>(options: AdapterUseLoggerOptions<TContext>): (context?: TContext, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
16
- interface RequestRunnerOptions {
12
+ interface RequestRunnerOptions extends RouteAdapterOptions {
17
13
  requestLoggerOptions?: RequestLoggerOptions;
14
+ /** HTTP route used for include/exclude filtering. */
15
+ path?: string;
18
16
  /** Emit one wide event automatically when the handler settles. Default `true`. */
19
17
  autoEmit?: boolean;
20
18
  /** Fields merged into the wide event at emit time (e.g. response status). */
@@ -27,7 +25,6 @@ interface RequestRunnerOptions {
27
25
  * wide event when the handler settles (unless `autoEmit` is `false`).
28
26
  */
29
27
  declare function createRequestRunner(storage: AsyncLocalStorage<RequestLogger>): <T>(spanName: string, enrich: (log: RequestLogger) => void, handler: () => T | Promise<T>, options?: RequestRunnerOptions) => Promise<T>;
30
- declare function createAdapterToolkit<TContext = unknown>(options: AdapterUseLoggerOptions<TContext>): AdapterToolkit<TContext>;
31
28
  /**
32
29
  * Description of a single adapter config field. `env` is the ordered list of
33
30
  * environment variables to fall back to.
@@ -73,5 +70,5 @@ type HeadersLike = {
73
70
  } | Record<string, string | undefined>;
74
71
  declare function getHeader(headers: HeadersLike | undefined, name: string): string | undefined;
75
72
  //#endregion
76
- export { AdapterToolkit, AdapterUseLoggerOptions, ConfigField, type DrainPipelineOptions, HeadersLike, type ParsedError, type PipelineDrainFn, type RequestLogSnapshot, type RequestLogger, type RequestLoggerOptions, RequestRunnerOptions, type StructuredError, type StructuredErrorInput, createAdapterToolkit, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime };
73
+ export { AdapterUseLoggerOptions, BaseAdapterOptions, ConfigField, type DrainPipelineOptions, type FrameworkHandlerOptions, HeadersLike, type IntegratedCompletionOptions, type ParsedError, type PipelineDrainFn, type RequestLogSnapshot, type RequestLogger, type RequestLoggerOptions, RequestRunnerOptions, type RouteAdapterOptions, type StructuredError, type StructuredErrorInput, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime, toRouteAdapterOptions };
77
74
  //# sourceMappingURL=core.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.cts","names":[],"sources":["../src/core.ts"],"mappings":";;;;UAiBiB,uBAAA;EACf,WAAA;EACA,MAAA,IAAU,OAAA,EAAS,QAAA,KAAa,MAAM;AAAA;AAAA,UAGvB,cAAA;EACf,SAAA,GACE,OAAA,GAAU,QAAA,EACV,OAAA,GAAU,oBAAA,KACP,aAAA;EACL,UAAA,GAAa,KAAA,cAAmB,WAAA;EAChC,qBAAA,GAAwB,KAAA,EAAO,oBAAA,KAAyB,eAAA;EACxD,mBAAA,gBACE,OAAA,GAAU,oBAAA,CAAqB,CAAA,OAC3B,KAAA,GAAQ,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,iBAGxD,eAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,KAG/B,OAAA,GAAU,QAAA,EACV,oBAAA,GAAuB,oBAAA,KACtB,aAAA;AAAA,UAsBY,oBAAA;EACf,oBAAA,GAAuB,oBAAA;EA5Ce;EA8CtC,QAAA;EA3C6B;EA6C7B,QAAA,SAAiB,MAAM;AAAA;;;;;;;iBAST,mBAAA,CAAoB,OAAA,EAAS,iBAAA,CAAkB,aAAA,QAE3D,QAAA,UACA,MAAA,GAAS,GAAA,EAAK,aAAA,WACd,OAAA,QAAe,CAAA,GAAI,OAAA,CAAQ,CAAA,GAC3B,OAAA,GAAU,oBAAA,KACT,OAAA,CAAQ,CAAA;AAAA,iBAsBG,oBAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,IAChC,cAAA,CAAe,QAAA;;;;;UAaD,WAAA;EACf,GAAA,QAAW,CAAC;EACZ,GAAA;AAAA;;;;;;;;;;;;;;;;;;iBA6Bc,kBAAA,IACd,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,GAAY,OAAA,CAAQ,CAAA;;;;;;AAzHmD;AAGzE;;;;;;;iBA4IsB,oBAAA,IACpB,SAAA,UACA,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,EAAW,OAAA,CAAQ,CAAA,eACnB,KAAA,QAAa,OAAA,CAAQ,MAAA,6BACpB,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,KAmBP,WAAA;EACN,GAAA,CAAI,IAAA;AAAA,IACN,MAAM;AAAA,iBAEM,SAAA,CACd,OAAA,EAAS,WAAW,cACpB,IAAA"}
1
+ {"version":3,"file":"core.d.cts","names":[],"sources":["../src/core.ts"],"mappings":";;;;;KA8BY,kBAAA,GAAqB,mBAAmB;AAAA,UAEnC,uBAAA;EACf,WAAA;EACA,MAAA,IAAU,OAAA,EAAS,QAAA,KAAa,MAAM;AAAA;AAAA,iBAGxB,eAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,KAG/B,OAAA,GAAU,QAAA,EACV,oBAAA,GAAuB,oBAAA,KACtB,aAAA;AAAA,UAsBY,oBAAA,SAA6B,mBAAA;EAC5C,oBAAA,GAAuB,oBAAA;EAlCgB;EAoCvC,IAAA;EAlCA;EAoCA,QAAA;EApCU;EAsCV,QAAA,SAAiB,MAAA;AAAA;AAtCqB;AAGxC;;;;;AAHwC,iBA+CxB,mBAAA,CAAoB,OAAA,EAAS,iBAAA,CAAkB,aAAA,QAE3D,QAAA,UACA,MAAA,GAAS,GAAA,EAAK,aAAA,WACd,OAAA,QAAe,CAAA,GAAI,OAAA,CAAQ,CAAA,GAC3B,OAAA,GAAU,oBAAA,KACT,OAAA,CAAQ,CAAA;;;;;UAmCI,WAAA;EACf,GAAA,QAAW,CAAC;EACZ,GAAA;AAAA;;;;;;;AAjFgB;AAsBlB;;;;;;;;;;iBAwFgB,kBAAA,IACd,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,GAAY,OAAA,CAAQ,CAAA;;;;;;AAnFG;AASzB;;;;;;;iBAgGsB,oBAAA,IACpB,SAAA,UACA,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,EAAW,OAAA,CAAQ,CAAA,eACnB,KAAA,QAAa,OAAA,CAAQ,MAAA,6BACpB,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,KAmBP,WAAA;EACN,GAAA,CAAI,IAAA;AAAA,IACN,MAAM;AAAA,iBAEM,SAAA,CACd,OAAA,EAAS,WAAW,cACpB,IAAA"}
package/dist/core.d.ts CHANGED
@@ -1,20 +1,18 @@
1
+ import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-CaG_l5xr.js";
1
2
  import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
2
3
  import { AsyncLocalStorage } from "node:async_hooks";
3
4
 
4
5
  //#region src/core.d.ts
6
+ type BaseAdapterOptions = RouteAdapterOptions;
5
7
  interface AdapterUseLoggerOptions<TContext> {
6
8
  adapterName: string;
7
9
  enrich?: (context: TContext) => Record<string, unknown> | undefined;
8
10
  }
9
- interface AdapterToolkit<TContext> {
10
- useLogger: (context?: TContext, options?: RequestLoggerOptions) => RequestLogger;
11
- parseError: (error: unknown) => ParsedError;
12
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
13
- createDrainPipeline: <T = unknown>(options?: DrainPipelineOptions<T>) => (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;
14
- }
15
11
  declare function createUseLogger<TContext = unknown>(options: AdapterUseLoggerOptions<TContext>): (context?: TContext, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
16
- interface RequestRunnerOptions {
12
+ interface RequestRunnerOptions extends RouteAdapterOptions {
17
13
  requestLoggerOptions?: RequestLoggerOptions;
14
+ /** HTTP route used for include/exclude filtering. */
15
+ path?: string;
18
16
  /** Emit one wide event automatically when the handler settles. Default `true`. */
19
17
  autoEmit?: boolean;
20
18
  /** Fields merged into the wide event at emit time (e.g. response status). */
@@ -27,7 +25,6 @@ interface RequestRunnerOptions {
27
25
  * wide event when the handler settles (unless `autoEmit` is `false`).
28
26
  */
29
27
  declare function createRequestRunner(storage: AsyncLocalStorage<RequestLogger>): <T>(spanName: string, enrich: (log: RequestLogger) => void, handler: () => T | Promise<T>, options?: RequestRunnerOptions) => Promise<T>;
30
- declare function createAdapterToolkit<TContext = unknown>(options: AdapterUseLoggerOptions<TContext>): AdapterToolkit<TContext>;
31
28
  /**
32
29
  * Description of a single adapter config field. `env` is the ordered list of
33
30
  * environment variables to fall back to.
@@ -73,5 +70,5 @@ type HeadersLike = {
73
70
  } | Record<string, string | undefined>;
74
71
  declare function getHeader(headers: HeadersLike | undefined, name: string): string | undefined;
75
72
  //#endregion
76
- export { AdapterToolkit, AdapterUseLoggerOptions, ConfigField, type DrainPipelineOptions, HeadersLike, type ParsedError, type PipelineDrainFn, type RequestLogSnapshot, type RequestLogger, type RequestLoggerOptions, RequestRunnerOptions, type StructuredError, type StructuredErrorInput, createAdapterToolkit, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime };
73
+ export { AdapterUseLoggerOptions, BaseAdapterOptions, ConfigField, type DrainPipelineOptions, type FrameworkHandlerOptions, HeadersLike, type IntegratedCompletionOptions, type ParsedError, type PipelineDrainFn, type RequestLogSnapshot, type RequestLogger, type RequestLoggerOptions, RequestRunnerOptions, type RouteAdapterOptions, type StructuredError, type StructuredErrorInput, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime, toRouteAdapterOptions };
77
74
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","names":[],"sources":["../src/core.ts"],"mappings":";;;;UAiBiB,uBAAA;EACf,WAAA;EACA,MAAA,IAAU,OAAA,EAAS,QAAA,KAAa,MAAM;AAAA;AAAA,UAGvB,cAAA;EACf,SAAA,GACE,OAAA,GAAU,QAAA,EACV,OAAA,GAAU,oBAAA,KACP,aAAA;EACL,UAAA,GAAa,KAAA,cAAmB,WAAA;EAChC,qBAAA,GAAwB,KAAA,EAAO,oBAAA,KAAyB,eAAA;EACxD,mBAAA,gBACE,OAAA,GAAU,oBAAA,CAAqB,CAAA,OAC3B,KAAA,GAAQ,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,iBAGxD,eAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,KAG/B,OAAA,GAAU,QAAA,EACV,oBAAA,GAAuB,oBAAA,KACtB,aAAA;AAAA,UAsBY,oBAAA;EACf,oBAAA,GAAuB,oBAAA;EA5Ce;EA8CtC,QAAA;EA3C6B;EA6C7B,QAAA,SAAiB,MAAM;AAAA;;;;;;;iBAST,mBAAA,CAAoB,OAAA,EAAS,iBAAA,CAAkB,aAAA,QAE3D,QAAA,UACA,MAAA,GAAS,GAAA,EAAK,aAAA,WACd,OAAA,QAAe,CAAA,GAAI,OAAA,CAAQ,CAAA,GAC3B,OAAA,GAAU,oBAAA,KACT,OAAA,CAAQ,CAAA;AAAA,iBAsBG,oBAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,IAChC,cAAA,CAAe,QAAA;;;;;UAaD,WAAA;EACf,GAAA,QAAW,CAAC;EACZ,GAAA;AAAA;;;;;;;;;;;;;;;;;;iBA6Bc,kBAAA,IACd,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,GAAY,OAAA,CAAQ,CAAA;;;;;;AAzHmD;AAGzE;;;;;;;iBA4IsB,oBAAA,IACpB,SAAA,UACA,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,EAAW,OAAA,CAAQ,CAAA,eACnB,KAAA,QAAa,OAAA,CAAQ,MAAA,6BACpB,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,KAmBP,WAAA;EACN,GAAA,CAAI,IAAA;AAAA,IACN,MAAM;AAAA,iBAEM,SAAA,CACd,OAAA,EAAS,WAAW,cACpB,IAAA"}
1
+ {"version":3,"file":"core.d.ts","names":[],"sources":["../src/core.ts"],"mappings":";;;;;KA8BY,kBAAA,GAAqB,mBAAmB;AAAA,UAEnC,uBAAA;EACf,WAAA;EACA,MAAA,IAAU,OAAA,EAAS,QAAA,KAAa,MAAM;AAAA;AAAA,iBAGxB,eAAA,qBACd,OAAA,EAAS,uBAAA,CAAwB,QAAA,KAG/B,OAAA,GAAU,QAAA,EACV,oBAAA,GAAuB,oBAAA,KACtB,aAAA;AAAA,UAsBY,oBAAA,SAA6B,mBAAA;EAC5C,oBAAA,GAAuB,oBAAA;EAlCgB;EAoCvC,IAAA;EAlCA;EAoCA,QAAA;EApCU;EAsCV,QAAA,SAAiB,MAAA;AAAA;AAtCqB;AAGxC;;;;;AAHwC,iBA+CxB,mBAAA,CAAoB,OAAA,EAAS,iBAAA,CAAkB,aAAA,QAE3D,QAAA,UACA,MAAA,GAAS,GAAA,EAAK,aAAA,WACd,OAAA,QAAe,CAAA,GAAI,OAAA,CAAQ,CAAA,GAC3B,OAAA,GAAU,oBAAA,KACT,OAAA,CAAQ,CAAA;;;;;UAmCI,WAAA;EACf,GAAA,QAAW,CAAC;EACZ,GAAA;AAAA;;;;;;;AAjFgB;AAsBlB;;;;;;;;;;iBAwFgB,kBAAA,IACd,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,GAAY,OAAA,CAAQ,CAAA;;;;;;AAnFG;AASzB;;;;;;;iBAgGsB,oBAAA,IACpB,SAAA,UACA,MAAA,EAAQ,WAAA,CAAY,CAAA,KACpB,SAAA,EAAW,OAAA,CAAQ,CAAA,eACnB,KAAA,QAAa,OAAA,CAAQ,MAAA,6BACpB,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,KAmBP,WAAA;EACN,GAAA,CAAI,IAAA;AAAA,IACN,MAAM;AAAA,iBAEM,SAAA,CACd,OAAA,EAAS,WAAW,cACpB,IAAA"}