autotel-adapters 1.0.0 → 2.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.
- package/dist/cloudflare.cjs +1 -1
- package/dist/cloudflare.cjs.map +1 -1
- package/dist/cloudflare.d.cts +2 -2
- package/dist/cloudflare.d.cts.map +1 -1
- package/dist/cloudflare.d.ts +2 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +1 -1
- package/dist/cloudflare.js.map +1 -1
- package/dist/core.cjs +2 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +1 -2
- package/dist/core.d.cts.map +1 -1
- package/dist/core.d.ts +1 -2
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +3 -3
- package/dist/core.js.map +1 -1
- package/dist/elysia.cjs +1 -1
- package/dist/elysia.d.cts +2 -2
- package/dist/elysia.d.cts.map +1 -1
- package/dist/elysia.d.ts +2 -2
- package/dist/elysia.d.ts.map +1 -1
- package/dist/elysia.js +1 -1
- package/dist/express.cjs +1 -1
- package/dist/express.cjs.map +1 -1
- package/dist/express.d.cts +2 -2
- package/dist/express.d.cts.map +1 -1
- package/dist/express.d.ts +2 -2
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +1 -1
- package/dist/express.js.map +1 -1
- package/dist/fastify.cjs +1 -1
- package/dist/fastify.cjs.map +1 -1
- package/dist/fastify.d.cts +2 -2
- package/dist/fastify.d.cts.map +1 -1
- package/dist/fastify.d.ts +2 -2
- package/dist/fastify.d.ts.map +1 -1
- package/dist/fastify.js +1 -1
- package/dist/fastify.js.map +1 -1
- package/dist/hono.cjs +1 -1
- package/dist/hono.d.cts +2 -2
- package/dist/hono.d.cts.map +1 -1
- package/dist/hono.d.ts +2 -2
- package/dist/hono.d.ts.map +1 -1
- package/dist/hono.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{integration-CaG_l5xr.d.ts → integration-DI-1RuTh.d.cts} +2 -3
- package/dist/integration-DI-1RuTh.d.cts.map +1 -0
- package/dist/{integration-BRVGyxPG.js → integration-IUpfttGT.js} +3 -3
- package/dist/integration-IUpfttGT.js.map +1 -0
- package/dist/{integration-Dd8Pi7jc.cjs → integration-guh7BHTF.cjs} +2 -2
- package/dist/integration-guh7BHTF.cjs.map +1 -0
- package/dist/{integration-7--zN-83.d.cts → integration-rYoX8QLk.d.ts} +2 -3
- package/dist/integration-rYoX8QLk.d.ts.map +1 -0
- package/dist/nestjs.cjs +1 -1
- package/dist/nestjs.d.cts +2 -2
- package/dist/nestjs.d.cts.map +1 -1
- package/dist/nestjs.d.ts +2 -2
- package/dist/nestjs.d.ts.map +1 -1
- package/dist/nestjs.js +1 -1
- package/dist/next.cjs +1 -1
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +2 -2
- package/dist/next.d.cts.map +1 -1
- package/dist/next.d.ts +2 -2
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +1 -1
- package/dist/next.js.map +1 -1
- package/dist/nitro.cjs +1 -1
- package/dist/nitro.cjs.map +1 -1
- package/dist/nitro.d.cts +2 -2
- package/dist/nitro.d.cts.map +1 -1
- package/dist/nitro.d.ts +2 -2
- package/dist/nitro.d.ts.map +1 -1
- package/dist/nitro.js +1 -1
- package/dist/nitro.js.map +1 -1
- package/dist/sveltekit.cjs +1 -1
- package/dist/sveltekit.d.cts +3 -6
- package/dist/sveltekit.d.cts.map +1 -1
- package/dist/sveltekit.d.ts +3 -6
- package/dist/sveltekit.d.ts.map +1 -1
- package/dist/sveltekit.js +1 -1
- package/dist/tanstack.d.cts.map +1 -1
- package/dist/tanstack.d.ts.map +1 -1
- package/dist/toolkit/index.cjs +1 -1
- package/dist/toolkit/index.d.cts +1 -2
- package/dist/toolkit/index.d.cts.map +1 -1
- package/dist/toolkit/index.d.ts +1 -2
- package/dist/toolkit/index.d.ts.map +1 -1
- package/dist/toolkit/index.js +1 -1
- package/dist/toolkit/storage.d.cts +0 -1
- package/dist/toolkit/storage.d.cts.map +1 -1
- package/dist/toolkit/storage.d.ts +0 -1
- package/dist/toolkit/storage.d.ts.map +1 -1
- package/package.json +9 -9
- package/skills/autotel-adapters/SKILL.md +15 -15
- package/dist/integration-7--zN-83.d.cts.map +0 -1
- package/dist/integration-BRVGyxPG.js.map +0 -1
- package/dist/integration-CaG_l5xr.d.ts.map +0 -1
- package/dist/integration-Dd8Pi7jc.cjs.map +0 -1
package/dist/cloudflare.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-guh7BHTF.cjs');
|
|
3
3
|
const require_core = require('./core.cjs');
|
|
4
4
|
let autotel = require("autotel");
|
|
5
5
|
|
package/dist/cloudflare.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
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 } | 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> extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\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\n ? { 'cloudflare.country': request.cf.country }\n : {}),\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<\n TEnv,\n CloudflareRequestLike,\n CloudflareExecutionContextLike\n >\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): (request: TRequest, env: TEnv, ctx: TContext) => 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":";;;;;;AAsDA,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,UACZ,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAC3C,CAAC;EACL,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,+CAML;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,SACmE;CACnE,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"}
|
package/dist/cloudflare.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-DI-1RuTh.cjs";
|
|
2
|
+
import "./core.cjs";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/cloudflare.d.ts
|
|
5
5
|
interface CloudflareRequestLike {
|
|
6
6
|
method?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.d.cts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB
|
|
1
|
+
{"version":3,"file":"cloudflare.d.cts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;EACzC,KAAK;;UAGU;EACf,aAAa,SAAS;EACtB;;UAGe,yBACf,MACA,iBAAiB,uBACjB,iBAAiB;EAEjB,SAAS;EACT,KAAK;EACL,kBAAkB;;UAGH,6BAA6B,wBAAwB,KACpE;EAGA,sBAAsB,SAAS,uBAAuB,KAAK;EAC3D,iBACE,SAAS,uBACT,KAAK,MACL,KAAK,mCACF;;iBAyCS,UACd,UAAU,uBACV,uBAAuB,uBACtB;iBA4Da,iBACd,MACA,iBAAiB,uBACjB,iBAAiB,gCACjB,SAEA,UACE,SAAS,UACT,KAAK,MACL,KAAK,aACF,UAAU,QAAQ,UACvB,UAAU,6BAA6B,SACrC,SAAS,UAAU,KAAK,MAAM,KAAK,aAAa,QAAQ"}
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-rYoX8QLk.js";
|
|
2
|
+
import "./core.js";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/cloudflare.d.ts
|
|
5
5
|
interface CloudflareRequestLike {
|
|
6
6
|
method?: string;
|
package/dist/cloudflare.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.d.ts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","names":[],"sources":["../src/cloudflare.ts"],"mappings":";;;;UAmBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;EACzC,KAAK;;UAGU;EACf,aAAa,SAAS;EACtB;;UAGe,yBACf,MACA,iBAAiB,uBACjB,iBAAiB;EAEjB,SAAS;EACT,KAAK;EACL,kBAAkB;;UAGH,6BAA6B,wBAAwB,KACpE;EAGA,sBAAsB,SAAS,uBAAuB,KAAK;EAC3D,iBACE,SAAS,uBACT,KAAK,MACL,KAAK,mCACF;;iBAyCS,UACd,UAAU,uBACV,uBAAuB,uBACtB;iBA4Da,iBACd,MACA,iBAAiB,uBACjB,iBAAiB,gCACjB,SAEA,UACE,SAAS,UACT,KAAK,MACL,KAAK,aACF,UAAU,QAAQ,UACvB,UAAU,6BAA6B,SACrC,SAAS,UAAU,KAAK,MAAM,KAAK,aAAa,QAAQ"}
|
package/dist/cloudflare.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as runWithIntegratedHandle, i as defineFrameworkIntegration, n as buildTracedOptions, t as applyLoggerEnrichment } from "./integration-
|
|
1
|
+
import { a as runWithIntegratedHandle, i as defineFrameworkIntegration, n as buildTracedOptions, t as applyLoggerEnrichment } from "./integration-IUpfttGT.js";
|
|
2
2
|
import { createUseLogger, getHeader } from "./core.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
|
package/dist/cloudflare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
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 } | 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> extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\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\n ? { 'cloudflare.country': request.cf.country }\n : {}),\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<\n TEnv,\n CloudflareRequestLike,\n CloudflareExecutionContextLike\n >\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): (request: TRequest, env: TEnv, ctx: TContext) => 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":";;;;;AAsDA,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,UACZ,EAAE,sBAAsB,QAAQ,GAAG,QAAQ,IAC3C,CAAC;EACL,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,2BAML;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,SACmE;CACnE,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,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-guh7BHTF.cjs');
|
|
3
3
|
let autotel = require("autotel");
|
|
4
4
|
let autotel_edge = require("autotel-edge");
|
|
5
5
|
|
|
@@ -29,7 +29,7 @@ function createRequestRunner(storage) {
|
|
|
29
29
|
return function runRequest(spanName, enrich, handler, options) {
|
|
30
30
|
if (options?.path && !(0, autotel_edge.shouldInstrumentPath)(options.path, options)) return Promise.resolve(handler());
|
|
31
31
|
const loggerOptions = require_integration.mergeRequestLoggerOptions(options?.requestLoggerOptions, options?.waitUntil);
|
|
32
|
-
return (0, autotel.
|
|
32
|
+
return (0, autotel.withTracing)({ name: spanName })((ctx) => async () => {
|
|
33
33
|
const log = (0, autotel.getRequestLogger)(ctx, loggerOptions);
|
|
34
34
|
enrich(log);
|
|
35
35
|
try {
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.cjs","names":["mergeRequestLoggerOptions"],"sources":["../src/core.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n
|
|
1
|
+
{"version":3,"file":"core.cjs","names":["mergeRequestLoggerOptions"],"sources":["../src/core.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\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 withTracing,\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 = withTracing({ 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 // The wrapped factory is async, so the call always yields a Promise.\n return wrapped() as Promise<T>;\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] ?? autotelNs?.[key] ?? rootNs?.[key] ?? resolveEnv(env);\n }\n\n return config as Partial<T>;\n}\n\nexport type HeadersLike =\n { get(name: string): string | null } | 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,gCAjB4B,EAAE,MAAM,SAAS,CAAC,CAAC,EAC5C,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,CAGW,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,QAAQ,YAAY,QAAQ,SAAS,QAAQ,WAAW,GAAG;CAG3E,OAAO;AACT;AAKA,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,7 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-DI-1RuTh.cjs";
|
|
2
2
|
import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
|
-
|
|
5
4
|
//#region src/core.d.ts
|
|
6
5
|
type BaseAdapterOptions = RouteAdapterOptions;
|
|
7
6
|
interface AdapterUseLoggerOptions<TContext> {
|
package/dist/core.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.cts","names":[],"sources":["../src/core.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.d.cts","names":[],"sources":["../src/core.ts"],"mappings":";;;;KA8BY,qBAAqB;UAEhB,wBAAwB;EACvC;EACA,UAAU,SAAS,aAAa;;iBAGlB,gBAAgB,oBAC9B,SAAS,wBAAwB,aAG/B,UAAU,UACV,uBAAuB,yBACtB;UAsBY,6BAA6B;EAC5C,uBAAuB;;EAEvB;;EAEA;;EAEA,iBAAiB;;;;;;;;iBASH,oBAAoB,SAAS,kBAAkB,kBAClC,GACzB,kBACA,SAAS,KAAK,wBACd,eAAe,IAAI,QAAQ,IAC3B,UAAU,yBACT,QAAQ;;;;;UAmCI,YAAY;EAC3B,WAAW;EACX;;;;;;;;;;;;;;;;;;;iBA6Bc,mBAAmB,GACjC,QAAQ,YAAY,MACpB,YAAY,QAAQ;;;;;;;;;;;;;;iBAsBA,qBAAqB,GACzC,mBACA,QAAQ,YAAY,MACpB,WAAW,QAAQ,gBACnB,aAAa,QAAQ,mCACpB,QAAQ,QAAQ;KAgBP;EACR,IAAI;IAAiC;iBAEzB,UACd,SAAS,yBACT"}
|
package/dist/core.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions, f as toRouteAdapterOptions, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions } from "./integration-rYoX8QLk.js";
|
|
2
2
|
import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
|
-
|
|
5
4
|
//#region src/core.d.ts
|
|
6
5
|
type BaseAdapterOptions = RouteAdapterOptions;
|
|
7
6
|
interface AdapterUseLoggerOptions<TContext> {
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","names":[],"sources":["../src/core.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.d.ts","names":[],"sources":["../src/core.ts"],"mappings":";;;;KA8BY,qBAAqB;UAEhB,wBAAwB;EACvC;EACA,UAAU,SAAS,aAAa;;iBAGlB,gBAAgB,oBAC9B,SAAS,wBAAwB,aAG/B,UAAU,UACV,uBAAuB,yBACtB;UAsBY,6BAA6B;EAC5C,uBAAuB;;EAEvB;;EAEA;;EAEA,iBAAiB;;;;;;;;iBASH,oBAAoB,SAAS,kBAAkB,kBAClC,GACzB,kBACA,SAAS,KAAK,wBACd,eAAe,IAAI,QAAQ,IAC3B,UAAU,yBACT,QAAQ;;;;;UAmCI,YAAY;EAC3B,WAAW;EACX;;;;;;;;;;;;;;;;;;;iBA6Bc,mBAAmB,GACjC,QAAQ,YAAY,MACpB,YAAY,QAAQ;;;;;;;;;;;;;;iBAsBA,qBAAqB,GACzC,mBACA,QAAQ,YAAY,MACpB,WAAW,QAAQ,gBACnB,aAAa,QAAQ,mCACpB,QAAQ,QAAQ;KAgBP;EACR,IAAI;IAAiC;iBAEzB,UACd,SAAS,yBACT"}
|
package/dist/core.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { d as mergeRequestLoggerOptions, f as shouldInstrumentPath, o as toRouteAdapterOptions } from "./integration-
|
|
2
|
-
import { getRequestLogger,
|
|
1
|
+
import { d as mergeRequestLoggerOptions, f as shouldInstrumentPath, o as toRouteAdapterOptions } from "./integration-IUpfttGT.js";
|
|
2
|
+
import { getRequestLogger, withTracing } from "autotel";
|
|
3
3
|
|
|
4
4
|
//#region src/core.ts
|
|
5
5
|
function createUseLogger(options) {
|
|
@@ -27,7 +27,7 @@ function createRequestRunner(storage) {
|
|
|
27
27
|
return function runRequest(spanName, enrich, handler, options) {
|
|
28
28
|
if (options?.path && !shouldInstrumentPath(options.path, options)) return Promise.resolve(handler());
|
|
29
29
|
const loggerOptions = mergeRequestLoggerOptions(options?.requestLoggerOptions, options?.waitUntil);
|
|
30
|
-
return
|
|
30
|
+
return withTracing({ name: spanName })((ctx) => async () => {
|
|
31
31
|
const log = getRequestLogger(ctx, loggerOptions);
|
|
32
32
|
enrich(log);
|
|
33
33
|
try {
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n
|
|
1
|
+
{"version":3,"file":"core.js","names":[],"sources":["../src/core.ts"],"sourcesContent":["import type { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\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 withTracing,\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 = withTracing({ 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 // The wrapped factory is async, so the call always yields a Promise.\n return wrapped() as Promise<T>;\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] ?? autotelNs?.[key] ?? rootNs?.[key] ?? resolveEnv(env);\n }\n\n return config as Partial<T>;\n}\n\nexport type HeadersLike =\n { get(name: string): string | null } | 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,SAAS,iBAAiB,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,CAAC,qBAAqB,QAAQ,MAAM,OAAO,GAC9D,OAAO,QAAQ,QAAQ,QAAQ,CAAC;EAGlC,MAAM,gBAAgB,0BACpB,SAAS,sBACT,SAAS,SACX;EAmBA,OAjBgB,YAAY,EAAE,MAAM,SAAS,CAAC,CAAC,EAC5C,QAAQ,YAAwB;GAC/B,MAAM,MAAM,iBAAiB,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,CAGW,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,QAAQ,YAAY,QAAQ,SAAS,QAAQ,WAAW,GAAG;CAG3E,OAAO;AACT;AAKA,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/elysia.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-guh7BHTF.cjs');
|
|
3
3
|
const require_toolkit_storage = require('./toolkit/storage.cjs');
|
|
4
4
|
const require_core = require('./core.cjs');
|
|
5
5
|
let autotel = require("autotel");
|
package/dist/elysia.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-DI-1RuTh.cjs";
|
|
2
|
+
import "./core.cjs";
|
|
2
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/elysia.d.ts
|
|
5
5
|
interface ElysiaContextLike {
|
|
6
6
|
request: Request;
|
package/dist/elysia.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elysia.d.cts","names":[],"sources":["../src/elysia.ts"],"mappings":";;;;UAciB
|
|
1
|
+
{"version":3,"file":"elysia.d.cts","names":[],"sources":["../src/elysia.ts"],"mappings":";;;;UAciB;EACf,SAAS;EACT;;UAGe,iCAAiC;EAChD,iBACE,KAAK,sBACF;;iBAmCS,aAAa;iBAIb,mBAAmB,GACjC,UAAU,KAAK,sBAAsB,IAAI,QAAQ,IACjD,UAAS,4BAED,KAAK,sBAAiB,QAAA;;cAiBnB,gBAAO"}
|
package/dist/elysia.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-rYoX8QLk.js";
|
|
2
|
+
import "./core.js";
|
|
2
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/elysia.d.ts
|
|
5
5
|
interface ElysiaContextLike {
|
|
6
6
|
request: Request;
|
package/dist/elysia.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elysia.d.ts","names":[],"sources":["../src/elysia.ts"],"mappings":";;;;UAciB
|
|
1
|
+
{"version":3,"file":"elysia.d.ts","names":[],"sources":["../src/elysia.ts"],"mappings":";;;;UAciB;EACf,SAAS;EACT;;UAGe,iCAAiC;EAChD,iBACE,KAAK,sBACF;;iBAmCS,aAAa;iBAIb,mBAAmB,GACjC,UAAU,KAAK,sBAAsB,IAAI,QAAQ,IACjD,UAAS,4BAED,KAAK,sBAAiB,QAAA;;cAiBnB,gBAAO"}
|
package/dist/elysia.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as runWithIntegratedHandle, i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-
|
|
1
|
+
import { a as runWithIntegratedHandle, i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-IUpfttGT.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { getHeader } from "./core.js";
|
|
4
4
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
package/dist/express.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-guh7BHTF.cjs');
|
|
3
3
|
const require_core = require('./core.cjs');
|
|
4
4
|
let autotel = require("autotel");
|
|
5
5
|
let node_async_hooks = require("node:async_hooks");
|
package/dist/express.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.cjs","names":["AsyncLocalStorage","createUseLogger","createRequestRunner","toRouteAdapterOptions"],"sources":["../src/express.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n route?: { path?: string };\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n}\n\nexport type ExpressNext = (err?: unknown) => void;\n\nexport interface ExpressWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: ExpressRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (request: ExpressRequestLike) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst expressLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: ExpressRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: ExpressRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.route?.path ?? request.path ?? url;\n const requestId = headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: ExpressRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = expressLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(expressLoggerStorage);\n\n/**\n * Wrap an Express route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(req)`), and emits one wide event when\n * the handler settles. Thrown errors are recorded and forwarded to `next`.\n */\nexport function withAutotel<\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n>(\n handler: (req: TReq
|
|
1
|
+
{"version":3,"file":"express.cjs","names":["AsyncLocalStorage","createUseLogger","createRequestRunner","toRouteAdapterOptions"],"sources":["../src/express.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n route?: { path?: string };\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n}\n\nexport type ExpressNext = (err?: unknown) => void;\n\nexport interface ExpressWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: ExpressRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (\n request: ExpressRequestLike,\n ) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst expressLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: ExpressRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: ExpressRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.route?.path ?? request.path ?? url;\n const requestId = headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: ExpressRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = expressLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(expressLoggerStorage);\n\n/**\n * Wrap an Express route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(req)`), and emits one wide event when\n * the handler settles. Thrown errors are recorded and forwarded to `next`.\n */\nexport function withAutotel<\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n>(\n handler: (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ) => TReturn | Promise<TReturn>,\n options?: ExpressWithAutotelOptions,\n): (req: TReq, res: TRes, next?: ExpressNext) => Promise<TReturn | undefined> {\n return async (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ): Promise<TReturn | undefined> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(req)\n : (options?.spanName ?? `express.${req.method ?? 'request'}`);\n\n const route =\n req.route?.path ?? req.path ?? req.originalUrl ?? req.url ?? '/';\n\n try {\n return await runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(req);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrichRequest?.(req);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(req, res, next),\n {\n ...toRouteAdapterOptions(options),\n path: route,\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n res.statusCode\n ? { 'http.response.status_code': res.statusCode }\n : undefined,\n },\n );\n } catch (error) {\n if (typeof next === 'function') {\n next(error);\n return undefined;\n }\n throw error;\n }\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;AAuCA,MAAM,uBAAuB,IAAIA,mCAAiC;AAElE,SAAS,YACP,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,YAAY;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM;CACvC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,MAAM,QAAQ,eAAe,QAAQ;CAC3C,MAAM,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;CACrD,MAAM,YAAY,YAAY,QAAQ,SAAS,cAAc;CAE7D,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;EACjC,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;CACtD;AACF;AAEA,MAAM,gBAAgBC,6BAAoC;CACxD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,qBAAqB,SAAS;CAC7C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,MAAM,aAAaC,iCAAoB,oBAAoB;;;;;;AAO3D,SAAgB,YAKd,SAKA,SAC4E;CAC5E,OAAO,OACL,KACA,KACA,SACiC;EACjC,MAAM,WACJ,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,GAAG,IACnB,SAAS,YAAY,WAAW,IAAI,UAAU;EAErD,MAAM,QACJ,IAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI,eAAe,IAAI,OAAO;EAE/D,IAAI;GACF,OAAO,MAAM,WACX,WACC,QAAQ;IACP,MAAM,OAAO,kBAAkB,GAAG;IAClC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI;IACtD,MAAM,SAAS,SAAS,gBAAgB,GAAG;IAC3C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM;GAC9D,SACM,QAAQ,KAAK,KAAK,IAAI,GAC5B;IACE,GAAGC,0CAAsB,OAAO;IAChC,MAAM;IACN,sBAAsB,SAAS;IAC/B,UAAU,SAAS;IACnB,gBACE,IAAI,aACA,EAAE,6BAA6B,IAAI,WAAW,IAC9C;GACR,CACF;EACF,SAAS,OAAO;GACd,IAAI,OAAO,SAAS,YAAY;IAC9B,KAAK,KAAK;IACV;GACF;GACA,MAAM;EACR;CACF;AACF"}
|
package/dist/express.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-DI-1RuTh.cjs";
|
|
2
|
+
import "./core.cjs";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/express.d.ts
|
|
5
5
|
interface ExpressRequestLike {
|
|
6
6
|
method?: string;
|
package/dist/express.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.cts","names":[],"sources":["../src/express.ts"],"mappings":";;;;UAeiB
|
|
1
|
+
{"version":3,"file":"express.d.cts","names":[],"sources":["../src/express.ts"],"mappings":";;;;UAeiB;EACf;EACA;EACA;EACA;EACA;IAAU;;EACV,UAAU;;UAGK;EACf;;KAGU,eAAe;UAEV,kCAAkC;EACjD,sBAAsB,SAAS;EAC/B,uBAAuB;EACvB,iBACE,SAAS,uBACN;EACL;;iBAqCc,UACd,UAAU,oBACV,uBAAuB,uBACtB;;;;;;iBAaa,YACd,aAAa,oBACb,aAAa,qBACb,SAEA,UACE,KAAK,MACL,KAAK,MACL,OAAO,gBACJ,UAAU,QAAQ,UACvB,UAAU,6BACR,KAAK,MAAM,KAAK,MAAM,OAAO,gBAAgB,QAAQ"}
|
package/dist/express.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-rYoX8QLk.js";
|
|
2
|
+
import "./core.js";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/express.d.ts
|
|
5
5
|
interface ExpressRequestLike {
|
|
6
6
|
method?: string;
|
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","names":[],"sources":["../src/express.ts"],"mappings":";;;;UAeiB
|
|
1
|
+
{"version":3,"file":"express.d.ts","names":[],"sources":["../src/express.ts"],"mappings":";;;;UAeiB;EACf;EACA;EACA;EACA;EACA;IAAU;;EACV,UAAU;;UAGK;EACf;;KAGU,eAAe;UAEV,kCAAkC;EACjD,sBAAsB,SAAS;EAC/B,uBAAuB;EACvB,iBACE,SAAS,uBACN;EACL;;iBAqCc,UACd,UAAU,oBACV,uBAAuB,uBACtB;;;;;;iBAaa,YACd,aAAa,oBACb,aAAa,qBACb,SAEA,UACE,KAAK,MACL,KAAK,MACL,OAAO,gBACJ,UAAU,QAAQ,UACvB,UAAU,6BACR,KAAK,MAAM,KAAK,MAAM,OAAO,gBAAgB,QAAQ"}
|
package/dist/express.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { o as toRouteAdapterOptions } from "./integration-IUpfttGT.js";
|
|
2
2
|
import { createRequestRunner, createUseLogger } from "./core.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","names":[],"sources":["../src/express.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n route?: { path?: string };\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n}\n\nexport type ExpressNext = (err?: unknown) => void;\n\nexport interface ExpressWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: ExpressRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (request: ExpressRequestLike) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst expressLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: ExpressRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: ExpressRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.route?.path ?? request.path ?? url;\n const requestId = headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: ExpressRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = expressLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(expressLoggerStorage);\n\n/**\n * Wrap an Express route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(req)`), and emits one wide event when\n * the handler settles. Thrown errors are recorded and forwarded to `next`.\n */\nexport function withAutotel<\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n>(\n handler: (req: TReq
|
|
1
|
+
{"version":3,"file":"express.js","names":[],"sources":["../src/express.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface ExpressRequestLike {\n method?: string;\n originalUrl?: string;\n url?: string;\n path?: string;\n route?: { path?: string };\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface ExpressResponseLike {\n statusCode?: number;\n}\n\nexport type ExpressNext = (err?: unknown) => void;\n\nexport interface ExpressWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: ExpressRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (\n request: ExpressRequestLike,\n ) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst expressLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: ExpressRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: ExpressRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.route?.path ?? request.path ?? url;\n const requestId = headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<ExpressRequestLike>({\n adapterName: 'express',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: ExpressRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = expressLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(expressLoggerStorage);\n\n/**\n * Wrap an Express route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(req)`), and emits one wide event when\n * the handler settles. Thrown errors are recorded and forwarded to `next`.\n */\nexport function withAutotel<\n TReq extends ExpressRequestLike,\n TRes extends ExpressResponseLike,\n TReturn,\n>(\n handler: (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ) => TReturn | Promise<TReturn>,\n options?: ExpressWithAutotelOptions,\n): (req: TReq, res: TRes, next?: ExpressNext) => Promise<TReturn | undefined> {\n return async (\n req: TReq,\n res: TRes,\n next?: ExpressNext,\n ): Promise<TReturn | undefined> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(req)\n : (options?.spanName ?? `express.${req.method ?? 'request'}`);\n\n const route =\n req.route?.path ?? req.path ?? req.originalUrl ?? req.url ?? '/';\n\n try {\n return await runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(req);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrichRequest?.(req);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(req, res, next),\n {\n ...toRouteAdapterOptions(options),\n path: route,\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n res.statusCode\n ? { 'http.response.status_code': res.statusCode }\n : undefined,\n },\n );\n } catch (error) {\n if (typeof next === 'function') {\n next(error);\n return undefined;\n }\n throw error;\n }\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAuCA,MAAM,uBAAuB,IAAI,kBAAiC;AAElE,SAAS,YACP,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,YAAY;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM;CACvC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,MAAM,QAAQ,eAAe,QAAQ;CAC3C,MAAM,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;CACrD,MAAM,YAAY,YAAY,QAAQ,SAAS,cAAc;CAE7D,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;EACjC,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;CACtD;AACF;AAEA,MAAM,gBAAgB,gBAAoC;CACxD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,qBAAqB,SAAS;CAC7C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,MAAM,aAAa,oBAAoB,oBAAoB;;;;;;AAO3D,SAAgB,YAKd,SAKA,SAC4E;CAC5E,OAAO,OACL,KACA,KACA,SACiC;EACjC,MAAM,WACJ,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,GAAG,IACnB,SAAS,YAAY,WAAW,IAAI,UAAU;EAErD,MAAM,QACJ,IAAI,OAAO,QAAQ,IAAI,QAAQ,IAAI,eAAe,IAAI,OAAO;EAE/D,IAAI;GACF,OAAO,MAAM,WACX,WACC,QAAQ;IACP,MAAM,OAAO,kBAAkB,GAAG;IAClC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI;IACtD,MAAM,SAAS,SAAS,gBAAgB,GAAG;IAC3C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM;GAC9D,SACM,QAAQ,KAAK,KAAK,IAAI,GAC5B;IACE,GAAG,sBAAsB,OAAO;IAChC,MAAM;IACN,sBAAsB,SAAS;IAC/B,UAAU,SAAS;IACnB,gBACE,IAAI,aACA,EAAE,6BAA6B,IAAI,WAAW,IAC9C;GACR,CACF;EACF,SAAS,OAAO;GACd,IAAI,OAAO,SAAS,YAAY;IAC9B,KAAK,KAAK;IACV;GACF;GACA,MAAM;EACR;CACF;AACF"}
|
package/dist/fastify.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-guh7BHTF.cjs');
|
|
3
3
|
const require_core = require('./core.cjs');
|
|
4
4
|
let autotel = require("autotel");
|
|
5
5
|
let node_async_hooks = require("node:async_hooks");
|
package/dist/fastify.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.cjs","names":["AsyncLocalStorage","createUseLogger","createRequestRunner","toRouteAdapterOptions"],"sources":["../src/fastify.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface FastifyRequestLike {\n method?: string;\n url?: string;\n routeOptions?: { url?: string };\n routerPath?: string;\n id?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface FastifyReplyLike {\n statusCode?: number;\n}\n\nexport interface FastifyWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: FastifyRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (request: FastifyRequestLike) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst fastifyLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: FastifyRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: FastifyRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const route = request.routeOptions?.url ?? request.routerPath ?? request.url;\n const requestId = request.id ?? headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: FastifyRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = fastifyLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(fastifyLoggerStorage);\n\n/**\n * Wrap a Fastify route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(request)`), and emits one wide event\n * when the handler settles. Thrown errors are recorded, then rethrown for\n * Fastify's error handling.\n */\nexport function withAutotel<\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n>(\n handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>,\n options?: FastifyWithAutotelOptions,\n): (request: TReq, reply: TRes) => Promise<TReturn> {\n return (request: TReq, reply: TRes): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? `fastify.${request.method ?? 'request'}`);\n\n const route =\n request.routeOptions?.url ?? request.routerPath ?? request.url ?? '/';\n\n return runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(request);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrichRequest?.(request);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(request, reply),\n {\n ...toRouteAdapterOptions(options),\n path: route,\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n reply.statusCode\n ? { 'http.response.status_code': reply.statusCode }\n : undefined,\n },\n );\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"fastify.cjs","names":["AsyncLocalStorage","createUseLogger","createRequestRunner","toRouteAdapterOptions"],"sources":["../src/fastify.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createRequestRunner,\n createUseLogger,\n toRouteAdapterOptions,\n type RouteAdapterOptions,\n} from './core';\n\nexport interface FastifyRequestLike {\n method?: string;\n url?: string;\n routeOptions?: { url?: string };\n routerPath?: string;\n id?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface FastifyReplyLike {\n statusCode?: number;\n}\n\nexport interface FastifyWithAutotelOptions extends RouteAdapterOptions {\n spanName?: string | ((request: FastifyRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrichRequest?: (\n request: FastifyRequestLike,\n ) => Record<string, unknown> | undefined;\n autoEmit?: boolean;\n}\n\nconst fastifyLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction headerValue(\n headers: FastifyRequestLike['headers'],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const value = headers[name] ?? headers[name.toLowerCase()];\n if (Array.isArray(value)) return value[0];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction enrichFromRequest(\n request?: FastifyRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const route = request.routeOptions?.url ?? request.routerPath ?? request.url;\n const requestId = request.id ?? headerValue(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<FastifyRequestLike>({\n adapterName: 'fastify',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: FastifyRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const stored = fastifyLoggerStorage.getStore();\n if (stored) return stored;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nconst runRequest = createRequestRunner(fastifyLoggerStorage);\n\n/**\n * Wrap a Fastify route handler. Each request opens a span, gets a\n * request-scoped logger (via `useLogger(request)`), and emits one wide event\n * when the handler settles. Thrown errors are recorded, then rethrown for\n * Fastify's error handling.\n */\nexport function withAutotel<\n TReq extends FastifyRequestLike,\n TRes extends FastifyReplyLike,\n TReturn,\n>(\n handler: (request: TReq, reply: TRes) => TReturn | Promise<TReturn>,\n options?: FastifyWithAutotelOptions,\n): (request: TReq, reply: TRes) => Promise<TReturn> {\n return (request: TReq, reply: TRes): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? `fastify.${request.method ?? 'request'}`);\n\n const route =\n request.routeOptions?.url ?? request.routerPath ?? request.url ?? '/';\n\n return runRequest<TReturn>(\n spanName,\n (log) => {\n const auto = enrichFromRequest(request);\n if (auto && Object.keys(auto).length > 0) log.set(auto);\n const custom = options?.enrichRequest?.(request);\n if (custom && Object.keys(custom).length > 0) log.set(custom);\n },\n () => handler(request, reply),\n {\n ...toRouteAdapterOptions(options),\n path: route,\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n finalize: () =>\n reply.statusCode\n ? { 'http.response.status_code': reply.statusCode }\n : undefined,\n },\n );\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;AAqCA,MAAM,uBAAuB,IAAIA,mCAAiC;AAElE,SAAS,YACP,SACA,MACoB;CACpB,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,QAAQ,SAAS,QAAQ,KAAK,YAAY;CACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM;CACvC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,QAAQ,QAAQ,cAAc,OAAO,QAAQ,cAAc,QAAQ;CACzE,MAAM,YAAY,QAAQ,MAAM,YAAY,QAAQ,SAAS,cAAc;CAE3E,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;CACtD;AACF;AAEA,MAAM,gBAAgBC,6BAAoC;CACxD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,qBAAqB,SAAS;CAC7C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,MAAM,aAAaC,iCAAoB,oBAAoB;;;;;;;AAQ3D,SAAgB,YAKd,SACA,SACkD;CAClD,QAAQ,SAAe,UAAkC;EACvD,MAAM,WACJ,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,WAAW,QAAQ,UAAU;EAEzD,MAAM,QACJ,QAAQ,cAAc,OAAO,QAAQ,cAAc,QAAQ,OAAO;EAEpE,OAAO,WACL,WACC,QAAQ;GACP,MAAM,OAAO,kBAAkB,OAAO;GACtC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,IAAI;GACtD,MAAM,SAAS,SAAS,gBAAgB,OAAO;GAC/C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,MAAM;EAC9D,SACM,QAAQ,SAAS,KAAK,GAC5B;GACE,GAAGC,0CAAsB,OAAO;GAChC,MAAM;GACN,sBAAsB,SAAS;GAC/B,UAAU,SAAS;GACnB,gBACE,MAAM,aACF,EAAE,6BAA6B,MAAM,WAAW,IAChD;EACR,CACF;CACF;AACF"}
|
package/dist/fastify.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-DI-1RuTh.cjs";
|
|
2
|
+
import "./core.cjs";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/fastify.d.ts
|
|
5
5
|
interface FastifyRequestLike {
|
|
6
6
|
method?: string;
|
package/dist/fastify.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.cts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAeiB
|
|
1
|
+
{"version":3,"file":"fastify.d.cts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAeiB;EACf;EACA;EACA;IAAiB;;EACjB;EACA;EACA,UAAU;;UAGK;EACf;;UAGe,kCAAkC;EACjD,sBAAsB,SAAS;EAC/B,uBAAuB;EACvB,iBACE,SAAS,uBACN;EACL;;iBAoCc,UACd,UAAU,oBACV,uBAAuB,uBACtB;;;;;;;iBAca,YACd,aAAa,oBACb,aAAa,kBACb,SAEA,UAAU,SAAS,MAAM,OAAO,SAAS,UAAU,QAAQ,UAC3D,UAAU,6BACR,SAAS,MAAM,OAAO,SAAS,QAAQ"}
|
package/dist/fastify.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-rYoX8QLk.js";
|
|
2
|
+
import "./core.js";
|
|
2
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
3
|
-
|
|
4
4
|
//#region src/fastify.d.ts
|
|
5
5
|
interface FastifyRequestLike {
|
|
6
6
|
method?: string;
|
package/dist/fastify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.ts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAeiB
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","names":[],"sources":["../src/fastify.ts"],"mappings":";;;;UAeiB;EACf;EACA;EACA;IAAiB;;EACjB;EACA;EACA,UAAU;;UAGK;EACf;;UAGe,kCAAkC;EACjD,sBAAsB,SAAS;EAC/B,uBAAuB;EACvB,iBACE,SAAS,uBACN;EACL;;iBAoCc,UACd,UAAU,oBACV,uBAAuB,uBACtB;;;;;;;iBAca,YACd,aAAa,oBACb,aAAa,kBACb,SAEA,UAAU,SAAS,MAAM,OAAO,SAAS,UAAU,QAAQ,UAC3D,UAAU,6BACR,SAAS,MAAM,OAAO,SAAS,QAAQ"}
|
package/dist/fastify.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { o as toRouteAdapterOptions } from "./integration-IUpfttGT.js";
|
|
2
2
|
import { createRequestRunner, createUseLogger } from "./core.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|