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/nitro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nitro.js","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createUseLogger, type FrameworkHandlerOptions } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions extends Omit
|
|
1
|
+
{"version":3,"file":"nitro.js","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createUseLogger, type FrameworkHandlerOptions } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\n spanName?: string | ((event: NitroEventLike) => string);\n enrichRequest?: (\n event: NitroEventLike,\n ) => Record<string, unknown> | undefined;\n}\n\nfunction enrichFromEvent(\n event?: NitroEventLike,\n): Record<string, unknown> | undefined {\n if (!event) return undefined;\n\n return {\n ...(event.method ? { 'http.request.method': event.method } : {}),\n ...(event.path ? { 'http.route': event.path } : {}),\n ...(typeof event.context?.requestId === 'string'\n ? { 'http.request.id': event.context.requestId }\n : {}),\n };\n}\n\nconst { storage: nitroLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Wrap handlers with withAutotelEventHandler() first.',\n );\n\nconst baseUseLogger = createUseLogger<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\n\nexport function useLogger(\n event?: NitroEventLike,\n serviceOrOptions?: string | RequestLoggerOptions,\n): RequestLogger {\n try {\n const logger = storageUseLogger();\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n return logger;\n } catch {\n const logger =\n typeof serviceOrOptions === 'string'\n ? baseUseLogger(event)\n : baseUseLogger(event, serviceOrOptions);\n\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n\n return logger;\n }\n}\n\nconst integration = defineFrameworkIntegration<NitroEventLike>({\n name: 'nitro',\n storage: nitroLoggerStorage,\n extractRequest: (event) => ({\n method: event.method ?? 'GET',\n path: event.path ?? '/',\n requestId:\n typeof event.context?.requestId === 'string'\n ? event.context.requestId\n : undefined,\n }),\n attachLogger: () => {},\n});\n\nfunction resolveSpanName(\n event: NitroEventLike,\n options?: NitroWithAutotelOptions,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(event);\n }\n return options?.spanName ?? `nitro.${event.method ?? 'request'}`;\n}\n\nexport function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n options?: NitroWithAutotelOptions,\n): (event: TEvent) => Promise<TReturn> {\n return async (event: TEvent): Promise<TReturn> =>\n integration.runTraced(\n event,\n buildTracedOptions(options, resolveSpanName(event, options)),\n async (handle) =>\n runWithIntegratedHandle(handle, options, async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromEvent(event),\n options?.enrichRequest?.(event),\n );\n return handler(event);\n }),\n );\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAgCA,SAAS,gBACP,OACqC;CACrC,IAAI,CAAC,OAAO,OAAO;CAEnB,OAAO;EACL,GAAI,MAAM,SAAS,EAAE,uBAAuB,MAAM,OAAO,IAAI,CAAC;EAC9D,GAAI,MAAM,OAAO,EAAE,cAAc,MAAM,KAAK,IAAI,CAAC;EACjD,GAAI,OAAO,MAAM,SAAS,cAAc,WACpC,EAAE,mBAAmB,MAAM,QAAQ,UAAU,IAC7C,CAAC;CACP;AACF;AAEA,MAAM,EAAE,SAAS,oBAAoB,WAAW,qBAC9C,oBACE,sEACF;AAEF,MAAM,gBAAgB,gBAAgC;CACpD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,OACA,kBACe;CACf,IAAI;EACF,MAAM,SAAS,iBAAiB;EAChC,IAAI,OAAO,qBAAqB,YAAY,iBAAiB,SAAS,GACpE,OAAO,IAAI,EAAE,SAAS,iBAAiB,CAAC;EAE1C,OAAO;CACT,QAAQ;EACN,MAAM,SACJ,OAAO,qBAAqB,WACxB,cAAc,KAAK,IACnB,cAAc,OAAO,gBAAgB;EAE3C,IAAI,OAAO,qBAAqB,YAAY,iBAAiB,SAAS,GACpE,OAAO,IAAI,EAAE,SAAS,iBAAiB,CAAC;EAG1C,OAAO;CACT;AACF;AAEA,MAAM,cAAc,2BAA2C;CAC7D,MAAM;CACN,SAAS;CACT,iBAAiB,WAAW;EAC1B,QAAQ,MAAM,UAAU;EACxB,MAAM,MAAM,QAAQ;EACpB,WACE,OAAO,MAAM,SAAS,cAAc,WAChC,MAAM,QAAQ,YACd;CACR;CACA,oBAAoB,CAAC;AACvB,CAAC;AAED,SAAS,gBACP,OACA,SACQ;CACR,IAAI,OAAO,SAAS,aAAa,YAC/B,OAAO,QAAQ,SAAS,KAAK;CAE/B,OAAO,SAAS,YAAY,SAAS,MAAM,UAAU;AACvD;AAEA,SAAgB,wBACd,SACA,SACqC;CACrC,OAAO,OAAO,UACZ,YAAY,UACV,OACA,mBAAmB,SAAS,gBAAgB,OAAO,OAAO,CAAC,GAC3D,OAAO,WACL,wBAAwB,QAAQ,SAAS,YAAY;EACnD,sBACE,OAAO,QACP,gBAAgB,KAAK,GACrB,SAAS,gBAAgB,KAAK,CAChC;EACA,OAAO,QAAQ,KAAK;CACtB,CAAC,CACL;AACJ"}
|
package/dist/sveltekit.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
|
let autotel = require("autotel");
|
|
5
5
|
|
package/dist/sveltekit.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/sveltekit.d.ts
|
|
5
5
|
interface SvelteKitEventLike {
|
|
6
6
|
request: Request;
|
|
@@ -18,10 +18,7 @@ interface SvelteKitWithAutotelOptions extends FrameworkHandlerOptions {
|
|
|
18
18
|
enrichRequest?: (event: SvelteKitEventLike) => Record<string, unknown> | undefined;
|
|
19
19
|
}
|
|
20
20
|
declare function useLogger(): RequestLogger;
|
|
21
|
-
declare function autotelHandle(options?: SvelteKitWithAutotelOptions): ({
|
|
22
|
-
event,
|
|
23
|
-
resolve
|
|
24
|
-
}: SvelteKitHandleInput) => Promise<Response>;
|
|
21
|
+
declare function autotelHandle(options?: SvelteKitWithAutotelOptions): ({ event, resolve }: SvelteKitHandleInput) => Promise<Response>;
|
|
25
22
|
//#endregion
|
|
26
23
|
export { SvelteKitEventLike, SvelteKitHandleInput, SvelteKitWithAutotelOptions, autotelHandle, createDrainPipeline, createStructuredError, parseError, useLogger };
|
|
27
24
|
//# sourceMappingURL=sveltekit.d.cts.map
|
package/dist/sveltekit.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit.d.cts","names":[],"sources":["../src/sveltekit.ts"],"mappings":";;;;UAciB
|
|
1
|
+
{"version":3,"file":"sveltekit.d.cts","names":[],"sources":["../src/sveltekit.ts"],"mappings":";;;;UAciB;EACf,SAAS;EACT,KAAK;EACL;IAAU;;EACV,SAAS;;UAGM;EACf,OAAO;EACP,UAAU,OAAO,uBAAuB,WAAW,QAAQ;;UAG5C,oCAAoC;EACnD,iBACE,OAAO,uBACJ;;iBAsCS,aAAa;iBAIb,cAAc,UAAS,iCACvB,OAAA,WAAoB,yBAAuB,QAAQ"}
|
package/dist/sveltekit.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/sveltekit.d.ts
|
|
5
5
|
interface SvelteKitEventLike {
|
|
6
6
|
request: Request;
|
|
@@ -18,10 +18,7 @@ interface SvelteKitWithAutotelOptions extends FrameworkHandlerOptions {
|
|
|
18
18
|
enrichRequest?: (event: SvelteKitEventLike) => Record<string, unknown> | undefined;
|
|
19
19
|
}
|
|
20
20
|
declare function useLogger(): RequestLogger;
|
|
21
|
-
declare function autotelHandle(options?: SvelteKitWithAutotelOptions): ({
|
|
22
|
-
event,
|
|
23
|
-
resolve
|
|
24
|
-
}: SvelteKitHandleInput) => Promise<Response>;
|
|
21
|
+
declare function autotelHandle(options?: SvelteKitWithAutotelOptions): ({ event, resolve }: SvelteKitHandleInput) => Promise<Response>;
|
|
25
22
|
//#endregion
|
|
26
23
|
export { SvelteKitEventLike, SvelteKitHandleInput, SvelteKitWithAutotelOptions, autotelHandle, createDrainPipeline, createStructuredError, parseError, useLogger };
|
|
27
24
|
//# sourceMappingURL=sveltekit.d.ts.map
|
package/dist/sveltekit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit.d.ts","names":[],"sources":["../src/sveltekit.ts"],"mappings":";;;;UAciB
|
|
1
|
+
{"version":3,"file":"sveltekit.d.ts","names":[],"sources":["../src/sveltekit.ts"],"mappings":";;;;UAciB;EACf,SAAS;EACT,KAAK;EACL;IAAU;;EACV,SAAS;;UAGM;EACf,OAAO;EACP,UAAU,OAAO,uBAAuB,WAAW,QAAQ;;UAG5C,oCAAoC;EACnD,iBACE,OAAO,uBACJ;;iBAsCS,aAAa;iBAIb,cAAc,UAAS,iCACvB,OAAA,WAAoB,yBAAuB,QAAQ"}
|
package/dist/sveltekit.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 { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
|
package/dist/tanstack.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack.d.cts","names":[],"sources":["../src/tanstack.ts"],"mappings":";cAEa,
|
|
1
|
+
{"version":3,"file":"tanstack.d.cts","names":[],"sources":["../src/tanstack.ts"],"mappings":";cAEa,YAAS;EACT;EACF;eAOT,yCAAA,2CAAA"}
|
package/dist/tanstack.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack.d.ts","names":[],"sources":["../src/tanstack.ts"],"mappings":";cAEa,
|
|
1
|
+
{"version":3,"file":"tanstack.d.ts","names":[],"sources":["../src/tanstack.ts"],"mappings":";cAEa,YAAS;EACT;EACF;eAOT,yCAAA,2CAAA"}
|
package/dist/toolkit/index.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('./storage.cjs');
|
|
4
4
|
let autotel_edge = require("autotel-edge");
|
|
5
5
|
|
package/dist/toolkit/index.d.cts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { C as matchesRoutePattern, S as getServiceForPath, T as shouldInstrumentPath, _ as RouteAdapterOptions, a as FrameworkRequestHandle, b as TailSamplingContext, c as buildTracedOptions, d as runWithIntegratedHandle, f as toRouteAdapterOptions, g as MiddlewareLoggerResult, h as MiddlewareLoggerOptions, i as FrameworkIntegrationSpec, l as completeIntegratedRequest, m as ForkLifecycle, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions, p as BaseAdapterOptions, r as FrameworkIntegrationHelpers, s as applyLoggerEnrichment, t as ExtractedRequest, u as defineFrameworkIntegration, v as RouteFilterOptions, w as mergeRequestLoggerOptions, x as createMiddlewareLogger, y as RouteServiceConfig } from "../integration-
|
|
1
|
+
import { C as matchesRoutePattern, S as getServiceForPath, T as shouldInstrumentPath, _ as RouteAdapterOptions, a as FrameworkRequestHandle, b as TailSamplingContext, c as buildTracedOptions, d as runWithIntegratedHandle, f as toRouteAdapterOptions, g as MiddlewareLoggerResult, h as MiddlewareLoggerOptions, i as FrameworkIntegrationSpec, l as completeIntegratedRequest, m as ForkLifecycle, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions, p as BaseAdapterOptions, r as FrameworkIntegrationHelpers, s as applyLoggerEnrichment, t as ExtractedRequest, u as defineFrameworkIntegration, v as RouteFilterOptions, w as mergeRequestLoggerOptions, x as createMiddlewareLogger, y as RouteServiceConfig } from "../integration-DI-1RuTh.cjs";
|
|
2
2
|
import { createLoggerStorage, createStorageForkLifecycle } from "./storage.cjs";
|
|
3
3
|
import { ForkLifecycle as ForkLifecycle$1, RequestLogger } from "autotel";
|
|
4
|
-
|
|
5
4
|
//#region src/toolkit/deferred-drain.d.ts
|
|
6
5
|
/**
|
|
7
6
|
* Extend drain lifetime on serverless runtimes without blocking the HTTP response.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/toolkit/deferred-drain.ts","../../src/toolkit/fork.ts","../../src/toolkit/stream-response.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/toolkit/deferred-drain.ts","../../src/toolkit/fork.ts","../../src/toolkit/stream-response.ts"],"mappings":";;;;;;;;;;;;;iBASgB,oBACd,cAAc,kBACd,aAAa,SAAS;;;;;;;iBCLR,mBACd,QAAQ,eACR,WAAW;;;UCRI;EACf;EACA,QAAQ;;iBAGM,oBAAoB,UAAU;;;;;;iBAS9B,2BAA2B,UAAU;;;;;iBAiFrC,+BACd,UAAU,UACV,aAAa,MAAM,8BAA8B,gBAChD"}
|
package/dist/toolkit/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { C as matchesRoutePattern, S as getServiceForPath, T as shouldInstrumentPath, _ as RouteAdapterOptions, a as FrameworkRequestHandle, b as TailSamplingContext, c as buildTracedOptions, d as runWithIntegratedHandle, f as toRouteAdapterOptions, g as MiddlewareLoggerResult, h as MiddlewareLoggerOptions, i as FrameworkIntegrationSpec, l as completeIntegratedRequest, m as ForkLifecycle, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions, p as BaseAdapterOptions, r as FrameworkIntegrationHelpers, s as applyLoggerEnrichment, t as ExtractedRequest, u as defineFrameworkIntegration, v as RouteFilterOptions, w as mergeRequestLoggerOptions, x as createMiddlewareLogger, y as RouteServiceConfig } from "../integration-
|
|
1
|
+
import { C as matchesRoutePattern, S as getServiceForPath, T as shouldInstrumentPath, _ as RouteAdapterOptions, a as FrameworkRequestHandle, b as TailSamplingContext, c as buildTracedOptions, d as runWithIntegratedHandle, f as toRouteAdapterOptions, g as MiddlewareLoggerResult, h as MiddlewareLoggerOptions, i as FrameworkIntegrationSpec, l as completeIntegratedRequest, m as ForkLifecycle, n as FrameworkHandlerOptions, o as IntegratedCompletionOptions, p as BaseAdapterOptions, r as FrameworkIntegrationHelpers, s as applyLoggerEnrichment, t as ExtractedRequest, u as defineFrameworkIntegration, v as RouteFilterOptions, w as mergeRequestLoggerOptions, x as createMiddlewareLogger, y as RouteServiceConfig } from "../integration-rYoX8QLk.js";
|
|
2
2
|
import { createLoggerStorage, createStorageForkLifecycle } from "./storage.js";
|
|
3
3
|
import { ForkLifecycle as ForkLifecycle$1, RequestLogger } from "autotel";
|
|
4
|
-
|
|
5
4
|
//#region src/toolkit/deferred-drain.d.ts
|
|
6
5
|
/**
|
|
7
6
|
* Extend drain lifetime on serverless runtimes without blocking the HTTP response.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/toolkit/deferred-drain.ts","../../src/toolkit/fork.ts","../../src/toolkit/stream-response.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/toolkit/deferred-drain.ts","../../src/toolkit/fork.ts","../../src/toolkit/stream-response.ts"],"mappings":";;;;;;;;;;;;;iBASgB,oBACd,cAAc,kBACd,aAAa,SAAS;;;;;;;iBCLR,mBACd,QAAQ,eACR,WAAW;;;UCRI;EACf;EACA,QAAQ;;iBAGM,oBAAoB,UAAU;;;;;;iBAS9B,2BAA2B,UAAU;;;;;iBAiFrC,+BACd,UAAU,UACV,aAAa,MAAM,8BAA8B,gBAChD"}
|
package/dist/toolkit/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as runWithIntegratedHandle, c as createMiddlewareLogger, d as mergeRequestLoggerOptions, f as shouldInstrumentPath, g as extendDeferredDrain, h as shouldDeferEmitForResponse, i as defineFrameworkIntegration, l as getServiceForPath, m as isStreamingResponse, n as buildTracedOptions, o as toRouteAdapterOptions, p as bindStreamingResponseLifecycle, r as completeIntegratedRequest, s as attachForkToLogger, t as applyLoggerEnrichment, u as matchesRoutePattern } from "../integration-
|
|
1
|
+
import { a as runWithIntegratedHandle, c as createMiddlewareLogger, d as mergeRequestLoggerOptions, f as shouldInstrumentPath, g as extendDeferredDrain, h as shouldDeferEmitForResponse, i as defineFrameworkIntegration, l as getServiceForPath, m as isStreamingResponse, n as buildTracedOptions, o as toRouteAdapterOptions, p as bindStreamingResponseLifecycle, r as completeIntegratedRequest, s as attachForkToLogger, t as applyLoggerEnrichment, u as matchesRoutePattern } from "../integration-IUpfttGT.js";
|
|
2
2
|
import { createLoggerStorage, createStorageForkLifecycle } from "./storage.js";
|
|
3
3
|
|
|
4
4
|
export { applyLoggerEnrichment, attachForkToLogger, bindStreamingResponseLifecycle, buildTracedOptions, completeIntegratedRequest, createLoggerStorage, createMiddlewareLogger, createStorageForkLifecycle, defineFrameworkIntegration, extendDeferredDrain, getServiceForPath, isStreamingResponse, matchesRoutePattern, mergeRequestLoggerOptions, runWithIntegratedHandle, shouldDeferEmitForResponse, shouldInstrumentPath, toRouteAdapterOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.cts","names":[],"sources":["../../src/toolkit/storage.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.cts","names":[],"sources":["../../src/toolkit/storage.ts"],"mappings":";;;;;;;;;;;iBAWgB,oBAAoB;;EAGZ,iBAAA;;;iBAcR,2BACd,SAAS,kBAAkB,iBAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","names":[],"sources":["../../src/toolkit/storage.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","names":[],"sources":["../../src/toolkit/storage.ts"],"mappings":";;;;;;;;;;;iBAWgB,oBAAoB;;EAGZ,iBAAA;;;iBAcR,2BACd,SAAS,kBAAkB,iBAC1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-adapters",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Framework adapters and composable DX helpers for autotel",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -85,17 +85,17 @@
|
|
|
85
85
|
"skills"
|
|
86
86
|
],
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"autotel": "
|
|
89
|
-
"autotel-edge": "
|
|
88
|
+
"autotel": "5.0.0",
|
|
89
|
+
"autotel-edge": "4.0.0"
|
|
90
90
|
},
|
|
91
91
|
"peerDependencies": {
|
|
92
|
-
"hono": ">=4.12.
|
|
93
|
-
"@tanstack/react-start": "^1.168.
|
|
94
|
-
"@tanstack/solid-start": "^1.168.
|
|
92
|
+
"hono": ">=4.12.31",
|
|
93
|
+
"@tanstack/react-start": "^1.168.32",
|
|
94
|
+
"@tanstack/solid-start": "^1.168.32",
|
|
95
95
|
"next": ">=16.2.10",
|
|
96
96
|
"h3": "^2.0.0",
|
|
97
97
|
"nitropack": "^2.13.4",
|
|
98
|
-
"rxjs": ">=7.
|
|
98
|
+
"rxjs": ">=7.8.2"
|
|
99
99
|
},
|
|
100
100
|
"peerDependenciesMeta": {
|
|
101
101
|
"rxjs": {
|
|
@@ -121,11 +121,11 @@
|
|
|
121
121
|
}
|
|
122
122
|
},
|
|
123
123
|
"devDependencies": {
|
|
124
|
-
"@types/node": "^26.1.
|
|
124
|
+
"@types/node": "^26.1.1",
|
|
125
125
|
"hono": "^4.12.28",
|
|
126
126
|
"rimraf": "^6.1.3",
|
|
127
127
|
"rxjs": "^7.8.2",
|
|
128
|
-
"tsdown": "^0.22.
|
|
128
|
+
"tsdown": "^0.22.12",
|
|
129
129
|
"typescript": "^6.0.3",
|
|
130
130
|
"vitest": "^4.1.10"
|
|
131
131
|
},
|
|
@@ -12,10 +12,10 @@ Framework-specific wrappers around autotel's core tracing primitives. Each adapt
|
|
|
12
12
|
- A `useLogger()` function that retrieves the logger from within the handler
|
|
13
13
|
- Direct re-exports of the utilities `parseError`, `createStructuredError`, and `createDrainPipeline`
|
|
14
14
|
|
|
15
|
-
Options are passed per call site (e.g. `withAutotel(handler, options)`)
|
|
15
|
+
Options are passed per call site (e.g. `withAutotel(handler, options)`). There are no
|
|
16
16
|
`create*Adapter` factories or `*Toolkit` bundles.
|
|
17
17
|
|
|
18
|
-
All adapters use `AsyncLocalStorage` (or a `WeakMap` for Cloudflare) internally so logger access is implicit
|
|
18
|
+
All adapters use `AsyncLocalStorage` (or a `WeakMap` for Cloudflare) internally so logger access is implicit. You never pass a logger through call chains manually.
|
|
19
19
|
|
|
20
20
|
## Setup
|
|
21
21
|
|
|
@@ -35,7 +35,7 @@ pnpm add hono # Hono
|
|
|
35
35
|
|
|
36
36
|
Import from the subpath `autotel-adapters/next` (or from the barrel `autotel-adapters`).
|
|
37
37
|
|
|
38
|
-
**Option A
|
|
38
|
+
**Option A, per-handler wrap:**
|
|
39
39
|
|
|
40
40
|
```typescript
|
|
41
41
|
import { withAutotel, useLogger } from 'autotel-adapters/next';
|
|
@@ -47,7 +47,7 @@ export const GET = withAutotel(async (request) => {
|
|
|
47
47
|
});
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
**Option B
|
|
50
|
+
**Option B, share defaults by passing options at each wrap:**
|
|
51
51
|
|
|
52
52
|
```typescript
|
|
53
53
|
// lib/autotel.ts
|
|
@@ -74,7 +74,7 @@ export default defineEventHandler(
|
|
|
74
74
|
const log = useLogger(event);
|
|
75
75
|
log.info('handling event');
|
|
76
76
|
return { ok: true };
|
|
77
|
-
})
|
|
77
|
+
}),
|
|
78
78
|
);
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -131,12 +131,12 @@ log.info('handling request');
|
|
|
131
131
|
Each subpath re-exports `parseError`, `createStructuredError`, and
|
|
132
132
|
`createDrainPipeline` directly (they also live in `autotel`):
|
|
133
133
|
|
|
134
|
-
| Export
|
|
135
|
-
|
|
136
|
-
| `useLogger(ctx?, opts?)`
|
|
137
|
-
| `parseError(error)`
|
|
134
|
+
| Export | Description |
|
|
135
|
+
| ------------------------------ | --------------------------------------------------------- |
|
|
136
|
+
| `useLogger(ctx?, opts?)` | Get the request-scoped `RequestLogger` |
|
|
137
|
+
| `parseError(error)` | Normalise any thrown value into `ParsedError` |
|
|
138
138
|
| `createStructuredError(input)` | Build a `StructuredError` for consistent API error shapes |
|
|
139
|
-
| `createDrainPipeline(opts?)`
|
|
139
|
+
| `createDrainPipeline(opts?)` | Create a batching drain pipeline |
|
|
140
140
|
|
|
141
141
|
### Custom adapter (createUseLogger)
|
|
142
142
|
|
|
@@ -151,7 +151,7 @@ const useLogger = createUseLogger<MyContext>({
|
|
|
151
151
|
|
|
152
152
|
## Common Mistakes
|
|
153
153
|
|
|
154
|
-
### HIGH
|
|
154
|
+
### HIGH: Calling useLogger outside a traced handler
|
|
155
155
|
|
|
156
156
|
```typescript
|
|
157
157
|
// WRONG: no active trace context
|
|
@@ -164,13 +164,13 @@ export async function myFunction() {
|
|
|
164
164
|
// CORRECT: always call useLogger inside a handler wrapped with withAutotel / withAutotelEventHandler
|
|
165
165
|
export const GET = withAutotel(async (request) => {
|
|
166
166
|
const log = useLogger(request); // ok — trace context is active
|
|
167
|
-
await myFunction(log);
|
|
167
|
+
await myFunction(log); // pass the logger down if needed
|
|
168
168
|
});
|
|
169
169
|
```
|
|
170
170
|
|
|
171
171
|
`useLogger` looks up an `AsyncLocalStorage` store populated by the handler wrapper. Calling it outside that wrapper throws.
|
|
172
172
|
|
|
173
|
-
### HIGH
|
|
173
|
+
### HIGH: Importing from wrong subpath
|
|
174
174
|
|
|
175
175
|
```typescript
|
|
176
176
|
// WRONG
|
|
@@ -184,7 +184,7 @@ import { useLogger } from 'autotel-adapters/next';
|
|
|
184
184
|
import { withAutotelEventHandler } from 'autotel-adapters/nitro';
|
|
185
185
|
```
|
|
186
186
|
|
|
187
|
-
### MEDIUM
|
|
187
|
+
### MEDIUM: Skipping the request argument in Next.js useLogger
|
|
188
188
|
|
|
189
189
|
```typescript
|
|
190
190
|
// WRONG: loses auto-enrichment (method, url, route, requestId)
|
|
@@ -198,7 +198,7 @@ const log = useLogger(request);
|
|
|
198
198
|
|
|
199
199
|
The request argument is optional only when you are certain the `AsyncLocalStorage` store is already populated (i.e., called from code deeply nested inside a `withAutotel`-wrapped handler).
|
|
200
200
|
|
|
201
|
-
### MEDIUM
|
|
201
|
+
### MEDIUM: Not passing request to useLogger on Cloudflare
|
|
202
202
|
|
|
203
203
|
In Cloudflare Workers, the logger is stored per-request in a `WeakMap`. If you call `useLogger()` without the request object, you always get a new logger with no stored enrichment.
|
|
204
204
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-7--zN-83.d.cts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-BRVGyxPG.js","names":[],"sources":["../src/toolkit/deferred-drain.ts","../src/toolkit/stream-response.ts","../src/toolkit/middleware.ts","../src/toolkit/fork.ts","../src/toolkit/integration.ts"],"sourcesContent":["/**\n * Extend drain lifetime on serverless runtimes without blocking the HTTP response.\n *\n * The drain always runs in the background (its rejection is logged, never\n * thrown). When `waitUntil` is provided, the promise is also handed to the\n * platform so the isolate stays alive until the drain settles. When it is\n * omitted there is no keep-alive guarantee: on a freezing runtime the drain may\n * not finish, so callers that need delivery must supply `waitUntil`.\n */\nexport function extendDeferredDrain(\n drainPromise: Promise<unknown>,\n waitUntil?: (promise: Promise<unknown>) => void,\n): void {\n void drainPromise.catch((err) => {\n console.error('[autotel-adapters] background drain failed:', err);\n });\n if (typeof waitUntil === 'function') {\n waitUntil(drainPromise);\n }\n}\n","export interface StreamCompleteMeta {\n status: number;\n error?: Error;\n}\n\nexport function isStreamingResponse(response: Response): boolean {\n return response.body !== null;\n}\n\n/**\n * Whether framework integrations should defer wide-event emit until the response\n * body finishes. Static string/JSON bodies are excluded even though they use a\n * ReadableStream under the hood in the Fetch API.\n */\nexport function shouldDeferEmitForResponse(response: Response): boolean {\n if (!response.body) return false;\n\n const contentType = (response.headers.get('content-type') ?? '').toLowerCase();\n\n if (contentType.includes('text/event-stream')) return true;\n if (contentType.includes('application/x-ndjson')) return true;\n if (response.headers.has('x-vercel-ai-ui-message-stream')) return true;\n if (response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')) {\n return true;\n }\n\n return false;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction createObservedBody(\n body: ReadableStream<Uint8Array>,\n onDone: () => void | Promise<void>,\n onError: (error: unknown) => void | Promise<void>,\n): ReadableStream<Uint8Array> | null {\n if (body.locked) {\n void Promise.resolve(onError(new TypeError('stream is already locked'))).catch(\n (err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\n },\n );\n return null;\n }\n\n const reader = body.getReader();\n let settled = false;\n\n const settle = (fn: () => void | Promise<void>) => {\n if (settled) return;\n settled = true;\n void Promise.resolve(fn()).catch((err: unknown) => {\n console.error('[autotel-adapters] stream completion handling failed:', err);\n });\n };\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n settle(onDone);\n controller.close();\n return;\n }\n controller.enqueue(value);\n } catch (err) {\n settle(() => onError(err));\n controller.error(err);\n }\n },\n\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n settle(onDone);\n }\n },\n });\n}\n\n/**\n * Observe a streaming Response body and invoke `onComplete` once when the body\n * closes, errors, or is cancelled.\n */\nexport function bindStreamingResponseLifecycle(\n response: Response,\n onComplete: (meta: StreamCompleteMeta) => void | Promise<void>,\n): Response {\n if (!response.body) {\n void Promise.resolve(onComplete({ status: response.status })).catch(\n (err: unknown) => {\n console.error('[autotel-adapters] stream completion handling failed:', err);\n },\n );\n return response;\n }\n\n const body = createObservedBody(\n response.body,\n () => onComplete({ status: response.status }),\n (err) => onComplete({ status: response.status, error: toError(err) }),\n );\n if (!body) return response;\n\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n} from 'autotel';\nimport { createNoopRequestLogger } from 'autotel';\nimport type { RouteFilterOptions, RouteServiceConfig } from 'autotel-edge';\nimport {\n getServiceForPath,\n matchesRoutePattern,\n shouldInstrumentPath,\n} from 'autotel-edge';\nimport { extendDeferredDrain } from './deferred-drain';\nimport {\n bindStreamingResponseLifecycle,\n shouldDeferEmitForResponse,\n} from './stream-response';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport type { RouteFilterOptions, RouteServiceConfig };\nexport { getServiceForPath, matchesRoutePattern, shouldInstrumentPath };\n\nexport interface RouteAdapterOptions {\n include?: string[];\n exclude?: string[];\n routes?: Record<string, RouteServiceConfig>;\n waitUntil?: (promise: Promise<unknown>) => void;\n keep?: (ctx: TailSamplingContext) => Awaitable<void>;\n requestLoggerOptions?: RequestLoggerOptions;\n}\n\n/** @deprecated Use {@link RouteAdapterOptions}. */\nexport type BaseAdapterOptions = RouteAdapterOptions;\n\nexport interface TailSamplingContext {\n status?: number;\n durationMs: number;\n path: string;\n method: string;\n context: Record<string, unknown>;\n shouldKeep: boolean;\n}\n\nexport interface MiddlewareLoggerOptions extends RouteAdapterOptions {\n onFinish?: (ctx: {\n logger: RequestLogger;\n method: string;\n path: string;\n status?: number;\n durationMs: number;\n }) => Awaitable<void>;\n method: string;\n path: string;\n requestId?: string;\n}\n\nexport interface MiddlewareLoggerResult {\n logger: RequestLogger;\n finish: (opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n }) => Promise<RequestLogSnapshot | null>;\n finishResponse: (\n response: Response,\n opts?: { status?: number; overrides?: Record<string, unknown> },\n ) => Promise<Response>;\n skipped: boolean;\n}\n\nconst noopResult: MiddlewareLoggerResult = {\n logger: createNoopRequestLogger(),\n finish: () => Promise.resolve(null),\n finishResponse: (response) => Promise.resolve(response),\n skipped: true,\n};\n\nexport function mergeRequestLoggerOptions(\n base: RequestLoggerOptions | undefined,\n waitUntil?: (promise: Promise<unknown>) => void,\n): RequestLoggerOptions | undefined {\n if (!waitUntil) return base;\n\n const userOnEmit = base?.onEmit;\n return {\n ...base,\n onEmit: (snapshot) => {\n const drain = userOnEmit\n ? Promise.resolve(userOnEmit(snapshot))\n : Promise.resolve();\n extendDeferredDrain(drain, waitUntil);\n },\n };\n}\n\nasync function performFinish(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n startedAt: number,\n opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n },\n): Promise<RequestLogSnapshot | null> {\n const { status, error, overrides } = opts ?? {};\n\n if (error) {\n logger.error(error);\n logger.set({\n 'http.response.status_code': status ?? 500,\n error_message: error.message,\n });\n } else if (status !== undefined) {\n logger.set({ 'http.response.status_code': status });\n }\n\n const durationMs = Date.now() - startedAt;\n logger.set({ duration_ms: durationMs });\n\n const tailCtx: TailSamplingContext = {\n status:\n status ??\n (logger.getContext()['http.response.status_code'] as number | undefined),\n durationMs,\n path: options.path,\n method: options.method,\n context: logger.getContext(),\n shouldKeep: false,\n };\n\n if (options.keep) {\n await options.keep(tailCtx);\n }\n\n if (options.onFinish) {\n try {\n await options.onFinish({\n logger,\n method: options.method,\n path: options.path,\n status: tailCtx.status,\n durationMs,\n });\n } catch (err) {\n console.error('[autotel-adapters] onFinish failed:', err);\n }\n }\n\n const mergedOverrides = {\n ...(overrides ?? {}),\n ...(tailCtx.shouldKeep ? { 'autotel.sampling.tail.keep': true } : {}),\n };\n\n return logger.emitNow(\n Object.keys(mergedOverrides).length > 0 ? mergedOverrides : undefined,\n );\n}\n\n/**\n * Create a request logger handle for use inside an active autotel trace span.\n * Call `finish()` or `finishResponse()` when the request completes.\n */\nexport function createMiddlewareLogger(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n): MiddlewareLoggerResult {\n if (!shouldInstrumentPath(options.path, options)) {\n return noopResult;\n }\n\n const routeService = getServiceForPath(options.path, options.routes);\n if (routeService) {\n logger.set({ service: routeService });\n }\n\n if (options.requestId) {\n logger.set({ 'http.request.id': options.requestId });\n }\n\n const startedAt = Date.now();\n\n return {\n logger,\n skipped: false,\n finish: (opts) => performFinish(logger, options, startedAt, opts),\n finishResponse: async (response, opts) => {\n const status = opts?.status ?? response.status;\n if (!shouldDeferEmitForResponse(response)) {\n await performFinish(logger, options, startedAt, {\n status,\n overrides: opts?.overrides,\n });\n return response;\n }\n\n return bindStreamingResponseLifecycle(response, async (meta) => {\n await performFinish(logger, options, startedAt, {\n status: meta.status ?? status,\n error: meta.error,\n overrides: opts?.overrides,\n });\n });\n },\n };\n}\n\nexport type { ForkLifecycle };\n","import type { ForkLifecycle, RequestLogger } from 'autotel';\n\n/**\n * Wrap an existing request logger's `fork()` so adapter lifecycle hooks run\n * for background work spawned after the response returns.\n */\nexport function attachForkToLogger(\n logger: RequestLogger,\n lifecycle: ForkLifecycle,\n): void {\n const originalFork = logger.fork.bind(logger);\n logger.fork = (\n label: string,\n fn: () => void | Promise<void>,\n options?: { lifecycle?: ForkLifecycle },\n ) => {\n originalFork(label, fn, {\n lifecycle: {\n onChildEnter: (child) => {\n lifecycle.onChildEnter?.(child);\n options?.lifecycle?.onChildEnter?.(child);\n },\n onChildExit: (child) => {\n lifecycle.onChildExit?.(child);\n options?.lifecycle?.onChildExit?.(child);\n },\n },\n });\n };\n}\n","import type { AsyncLocalStorage } from 'node:async_hooks';\nimport type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n TraceContext,\n} from 'autotel';\nimport { createNoopRequestLogger, getRequestLogger, trace } from 'autotel';\nimport { attachForkToLogger } from './fork';\nimport { createStorageForkLifecycle } from './storage';\nimport {\n createMiddlewareLogger,\n mergeRequestLoggerOptions,\n shouldInstrumentPath,\n type MiddlewareLoggerOptions,\n type MiddlewareLoggerResult,\n type RouteAdapterOptions,\n} from './middleware';\n\nexport interface ExtractedRequest {\n method: string;\n path: string;\n headers?:\n | Headers\n | Record<string, string | string[] | undefined>\n | { get(name: string): string | null };\n requestId?: string;\n}\n\nexport interface IntegratedCompletionOptions {\n autoEmit?: boolean;\n}\n\nexport type TracedOptionInput = RouteAdapterOptions & {\n requestLoggerOptions?: RequestLoggerOptions;\n autoEmit?: boolean;\n};\n\nexport interface FrameworkHandlerOptions extends TracedOptionInput {\n spanName?: string;\n}\n\nexport interface FrameworkIntegrationSpec<TCtx> {\n name: string;\n extractRequest: (ctx: TCtx) => ExtractedRequest;\n attachLogger: (ctx: TCtx, logger: RequestLogger) => void;\n storage?: AsyncLocalStorage<RequestLogger>;\n forkLifecycle?: ForkLifecycle;\n extractWaitUntil?: (\n ctx: TCtx,\n ) => ((promise: Promise<unknown>) => void) | undefined;\n spanName?: string | ((ctx: TCtx, request: ExtractedRequest) => string);\n}\n\nexport interface FrameworkRequestHandle extends MiddlewareLoggerResult {\n middlewareOptions: MiddlewareLoggerOptions;\n runWith: <T>(fn: () => T | Promise<T>) => Promise<T>;\n}\n\nexport interface FrameworkIntegrationHelpers<TCtx> {\n begin: (\n traceCtx: TraceContext,\n ctx: TCtx,\n options?: FrameworkHandlerOptions,\n ) => FrameworkRequestHandle;\n runTraced: <T>(\n ctx: TCtx,\n options: FrameworkHandlerOptions | undefined,\n handler: (handle: FrameworkRequestHandle) => Promise<T>,\n ) => Promise<T>;\n}\n\nexport function applyLoggerEnrichment(\n logger: RequestLogger,\n ...attributeSets: Array<Record<string, unknown> | undefined | null>\n): void {\n for (const attrs of attributeSets) {\n if (attrs && Object.keys(attrs).length > 0) {\n logger.set(attrs);\n }\n }\n}\n\nexport async function completeIntegratedRequest<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n result: T,\n): Promise<T> {\n if (handle.skipped || options?.autoEmit === false) {\n return result;\n }\n\n if (result instanceof Response) {\n return handle.finishResponse(result) as unknown as T;\n }\n\n await handle.finish({});\n return result;\n}\n\nexport async function runWithIntegratedHandle<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n fn: () => T | Promise<T>,\n): Promise<T> {\n if (handle.skipped) {\n return handle.runWith(fn);\n }\n\n try {\n const result = await handle.runWith(fn);\n return completeIntegratedRequest(handle, options, result);\n } catch (error) {\n if (options?.autoEmit !== false) {\n await handle.finish({\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n throw error;\n }\n}\n\nexport function toRouteAdapterOptions(\n options?: Pick<\n FrameworkHandlerOptions,\n keyof RouteAdapterOptions | 'requestLoggerOptions'\n >,\n): RouteAdapterOptions {\n if (!options) return {};\n const { include, exclude, routes, waitUntil, keep, requestLoggerOptions } =\n options;\n return { include, exclude, routes, waitUntil, keep, requestLoggerOptions };\n}\n\nexport function buildTracedOptions(\n options: TracedOptionInput | undefined,\n spanName: string,\n): FrameworkHandlerOptions {\n return {\n ...toRouteAdapterOptions(options),\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n spanName,\n };\n}\n\nfunction resolveSpanName<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n request: ExtractedRequest,\n): string {\n if (typeof spec.spanName === 'function') {\n return spec.spanName(ctx, request);\n }\n if (typeof spec.spanName === 'string') {\n return spec.spanName;\n }\n return `http.${request.method.toLowerCase() || 'request'}`;\n}\n\nfunction buildHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n traceCtx: TraceContext,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const extracted = spec.extractRequest(ctx);\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n requestLoggerOptions: mergeRequestLoggerOptions(\n options.requestLoggerOptions,\n waitUntil,\n ),\n };\n\n const log = getRequestLogger(\n traceCtx,\n middlewareOptions.requestLoggerOptions,\n );\n log.set({\n 'http.request.method': extracted.method,\n 'http.route': extracted.path,\n ...(extracted.requestId ? { 'http.request.id': extracted.requestId } : {}),\n });\n\n if (spec.storage) {\n attachForkToLogger(\n log,\n spec.forkLifecycle ?? createStorageForkLifecycle(spec.storage),\n );\n }\n\n spec.attachLogger(ctx, log);\n\n const result = createMiddlewareLogger(log, middlewareOptions);\n const storage = spec.storage;\n\n return {\n ...result,\n middlewareOptions,\n runWith: async (fn) => {\n if (!storage || result.skipped) return fn();\n return storage.run(log, fn);\n },\n };\n}\n\nfunction buildSkippedHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n extracted: ExtractedRequest,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n };\n\n const logger = createNoopRequestLogger();\n spec.attachLogger(ctx, logger);\n\n return {\n logger,\n middlewareOptions,\n skipped: true,\n finish: async () => null,\n finishResponse: async (response) => response,\n runWith: async (fn) => {\n if (!spec.storage) return fn();\n return spec.storage.run(logger, fn);\n },\n };\n}\n\nexport function defineFrameworkIntegration<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n): FrameworkIntegrationHelpers<TCtx> {\n return {\n begin(traceCtx, ctx, options = {}) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return buildSkippedHandle(spec, ctx, extracted, options);\n }\n return buildHandle(spec, ctx, traceCtx, options);\n },\n\n runTraced(ctx, options, handler) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return handler(buildSkippedHandle(spec, ctx, extracted, options));\n }\n\n const spanName =\n options?.spanName ?? resolveSpanName(spec, ctx, extracted);\n\n return trace({ name: spanName }, (traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n })();\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-CaG_l5xr.d.ts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-Dd8Pi7jc.cjs","names":["createStorageForkLifecycle"],"sources":["../src/toolkit/deferred-drain.ts","../src/toolkit/stream-response.ts","../src/toolkit/middleware.ts","../src/toolkit/fork.ts","../src/toolkit/integration.ts"],"sourcesContent":["/**\n * Extend drain lifetime on serverless runtimes without blocking the HTTP response.\n *\n * The drain always runs in the background (its rejection is logged, never\n * thrown). When `waitUntil` is provided, the promise is also handed to the\n * platform so the isolate stays alive until the drain settles. When it is\n * omitted there is no keep-alive guarantee: on a freezing runtime the drain may\n * not finish, so callers that need delivery must supply `waitUntil`.\n */\nexport function extendDeferredDrain(\n drainPromise: Promise<unknown>,\n waitUntil?: (promise: Promise<unknown>) => void,\n): void {\n void drainPromise.catch((err) => {\n console.error('[autotel-adapters] background drain failed:', err);\n });\n if (typeof waitUntil === 'function') {\n waitUntil(drainPromise);\n }\n}\n","export interface StreamCompleteMeta {\n status: number;\n error?: Error;\n}\n\nexport function isStreamingResponse(response: Response): boolean {\n return response.body !== null;\n}\n\n/**\n * Whether framework integrations should defer wide-event emit until the response\n * body finishes. Static string/JSON bodies are excluded even though they use a\n * ReadableStream under the hood in the Fetch API.\n */\nexport function shouldDeferEmitForResponse(response: Response): boolean {\n if (!response.body) return false;\n\n const contentType = (response.headers.get('content-type') ?? '').toLowerCase();\n\n if (contentType.includes('text/event-stream')) return true;\n if (contentType.includes('application/x-ndjson')) return true;\n if (response.headers.has('x-vercel-ai-ui-message-stream')) return true;\n if (response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')) {\n return true;\n }\n\n return false;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction createObservedBody(\n body: ReadableStream<Uint8Array>,\n onDone: () => void | Promise<void>,\n onError: (error: unknown) => void | Promise<void>,\n): ReadableStream<Uint8Array> | null {\n if (body.locked) {\n void Promise.resolve(onError(new TypeError('stream is already locked'))).catch(\n (err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\n },\n );\n return null;\n }\n\n const reader = body.getReader();\n let settled = false;\n\n const settle = (fn: () => void | Promise<void>) => {\n if (settled) return;\n settled = true;\n void Promise.resolve(fn()).catch((err: unknown) => {\n console.error('[autotel-adapters] stream completion handling failed:', err);\n });\n };\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n settle(onDone);\n controller.close();\n return;\n }\n controller.enqueue(value);\n } catch (err) {\n settle(() => onError(err));\n controller.error(err);\n }\n },\n\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n settle(onDone);\n }\n },\n });\n}\n\n/**\n * Observe a streaming Response body and invoke `onComplete` once when the body\n * closes, errors, or is cancelled.\n */\nexport function bindStreamingResponseLifecycle(\n response: Response,\n onComplete: (meta: StreamCompleteMeta) => void | Promise<void>,\n): Response {\n if (!response.body) {\n void Promise.resolve(onComplete({ status: response.status })).catch(\n (err: unknown) => {\n console.error('[autotel-adapters] stream completion handling failed:', err);\n },\n );\n return response;\n }\n\n const body = createObservedBody(\n response.body,\n () => onComplete({ status: response.status }),\n (err) => onComplete({ status: response.status, error: toError(err) }),\n );\n if (!body) return response;\n\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n} from 'autotel';\nimport { createNoopRequestLogger } from 'autotel';\nimport type { RouteFilterOptions, RouteServiceConfig } from 'autotel-edge';\nimport {\n getServiceForPath,\n matchesRoutePattern,\n shouldInstrumentPath,\n} from 'autotel-edge';\nimport { extendDeferredDrain } from './deferred-drain';\nimport {\n bindStreamingResponseLifecycle,\n shouldDeferEmitForResponse,\n} from './stream-response';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport type { RouteFilterOptions, RouteServiceConfig };\nexport { getServiceForPath, matchesRoutePattern, shouldInstrumentPath };\n\nexport interface RouteAdapterOptions {\n include?: string[];\n exclude?: string[];\n routes?: Record<string, RouteServiceConfig>;\n waitUntil?: (promise: Promise<unknown>) => void;\n keep?: (ctx: TailSamplingContext) => Awaitable<void>;\n requestLoggerOptions?: RequestLoggerOptions;\n}\n\n/** @deprecated Use {@link RouteAdapterOptions}. */\nexport type BaseAdapterOptions = RouteAdapterOptions;\n\nexport interface TailSamplingContext {\n status?: number;\n durationMs: number;\n path: string;\n method: string;\n context: Record<string, unknown>;\n shouldKeep: boolean;\n}\n\nexport interface MiddlewareLoggerOptions extends RouteAdapterOptions {\n onFinish?: (ctx: {\n logger: RequestLogger;\n method: string;\n path: string;\n status?: number;\n durationMs: number;\n }) => Awaitable<void>;\n method: string;\n path: string;\n requestId?: string;\n}\n\nexport interface MiddlewareLoggerResult {\n logger: RequestLogger;\n finish: (opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n }) => Promise<RequestLogSnapshot | null>;\n finishResponse: (\n response: Response,\n opts?: { status?: number; overrides?: Record<string, unknown> },\n ) => Promise<Response>;\n skipped: boolean;\n}\n\nconst noopResult: MiddlewareLoggerResult = {\n logger: createNoopRequestLogger(),\n finish: () => Promise.resolve(null),\n finishResponse: (response) => Promise.resolve(response),\n skipped: true,\n};\n\nexport function mergeRequestLoggerOptions(\n base: RequestLoggerOptions | undefined,\n waitUntil?: (promise: Promise<unknown>) => void,\n): RequestLoggerOptions | undefined {\n if (!waitUntil) return base;\n\n const userOnEmit = base?.onEmit;\n return {\n ...base,\n onEmit: (snapshot) => {\n const drain = userOnEmit\n ? Promise.resolve(userOnEmit(snapshot))\n : Promise.resolve();\n extendDeferredDrain(drain, waitUntil);\n },\n };\n}\n\nasync function performFinish(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n startedAt: number,\n opts?: {\n status?: number;\n error?: Error;\n overrides?: Record<string, unknown>;\n },\n): Promise<RequestLogSnapshot | null> {\n const { status, error, overrides } = opts ?? {};\n\n if (error) {\n logger.error(error);\n logger.set({\n 'http.response.status_code': status ?? 500,\n error_message: error.message,\n });\n } else if (status !== undefined) {\n logger.set({ 'http.response.status_code': status });\n }\n\n const durationMs = Date.now() - startedAt;\n logger.set({ duration_ms: durationMs });\n\n const tailCtx: TailSamplingContext = {\n status:\n status ??\n (logger.getContext()['http.response.status_code'] as number | undefined),\n durationMs,\n path: options.path,\n method: options.method,\n context: logger.getContext(),\n shouldKeep: false,\n };\n\n if (options.keep) {\n await options.keep(tailCtx);\n }\n\n if (options.onFinish) {\n try {\n await options.onFinish({\n logger,\n method: options.method,\n path: options.path,\n status: tailCtx.status,\n durationMs,\n });\n } catch (err) {\n console.error('[autotel-adapters] onFinish failed:', err);\n }\n }\n\n const mergedOverrides = {\n ...(overrides ?? {}),\n ...(tailCtx.shouldKeep ? { 'autotel.sampling.tail.keep': true } : {}),\n };\n\n return logger.emitNow(\n Object.keys(mergedOverrides).length > 0 ? mergedOverrides : undefined,\n );\n}\n\n/**\n * Create a request logger handle for use inside an active autotel trace span.\n * Call `finish()` or `finishResponse()` when the request completes.\n */\nexport function createMiddlewareLogger(\n logger: RequestLogger,\n options: MiddlewareLoggerOptions,\n): MiddlewareLoggerResult {\n if (!shouldInstrumentPath(options.path, options)) {\n return noopResult;\n }\n\n const routeService = getServiceForPath(options.path, options.routes);\n if (routeService) {\n logger.set({ service: routeService });\n }\n\n if (options.requestId) {\n logger.set({ 'http.request.id': options.requestId });\n }\n\n const startedAt = Date.now();\n\n return {\n logger,\n skipped: false,\n finish: (opts) => performFinish(logger, options, startedAt, opts),\n finishResponse: async (response, opts) => {\n const status = opts?.status ?? response.status;\n if (!shouldDeferEmitForResponse(response)) {\n await performFinish(logger, options, startedAt, {\n status,\n overrides: opts?.overrides,\n });\n return response;\n }\n\n return bindStreamingResponseLifecycle(response, async (meta) => {\n await performFinish(logger, options, startedAt, {\n status: meta.status ?? status,\n error: meta.error,\n overrides: opts?.overrides,\n });\n });\n },\n };\n}\n\nexport type { ForkLifecycle };\n","import type { ForkLifecycle, RequestLogger } from 'autotel';\n\n/**\n * Wrap an existing request logger's `fork()` so adapter lifecycle hooks run\n * for background work spawned after the response returns.\n */\nexport function attachForkToLogger(\n logger: RequestLogger,\n lifecycle: ForkLifecycle,\n): void {\n const originalFork = logger.fork.bind(logger);\n logger.fork = (\n label: string,\n fn: () => void | Promise<void>,\n options?: { lifecycle?: ForkLifecycle },\n ) => {\n originalFork(label, fn, {\n lifecycle: {\n onChildEnter: (child) => {\n lifecycle.onChildEnter?.(child);\n options?.lifecycle?.onChildEnter?.(child);\n },\n onChildExit: (child) => {\n lifecycle.onChildExit?.(child);\n options?.lifecycle?.onChildExit?.(child);\n },\n },\n });\n };\n}\n","import type { AsyncLocalStorage } from 'node:async_hooks';\nimport type {\n ForkLifecycle,\n RequestLogger,\n RequestLoggerOptions,\n TraceContext,\n} from 'autotel';\nimport { createNoopRequestLogger, getRequestLogger, trace } from 'autotel';\nimport { attachForkToLogger } from './fork';\nimport { createStorageForkLifecycle } from './storage';\nimport {\n createMiddlewareLogger,\n mergeRequestLoggerOptions,\n shouldInstrumentPath,\n type MiddlewareLoggerOptions,\n type MiddlewareLoggerResult,\n type RouteAdapterOptions,\n} from './middleware';\n\nexport interface ExtractedRequest {\n method: string;\n path: string;\n headers?:\n | Headers\n | Record<string, string | string[] | undefined>\n | { get(name: string): string | null };\n requestId?: string;\n}\n\nexport interface IntegratedCompletionOptions {\n autoEmit?: boolean;\n}\n\nexport type TracedOptionInput = RouteAdapterOptions & {\n requestLoggerOptions?: RequestLoggerOptions;\n autoEmit?: boolean;\n};\n\nexport interface FrameworkHandlerOptions extends TracedOptionInput {\n spanName?: string;\n}\n\nexport interface FrameworkIntegrationSpec<TCtx> {\n name: string;\n extractRequest: (ctx: TCtx) => ExtractedRequest;\n attachLogger: (ctx: TCtx, logger: RequestLogger) => void;\n storage?: AsyncLocalStorage<RequestLogger>;\n forkLifecycle?: ForkLifecycle;\n extractWaitUntil?: (\n ctx: TCtx,\n ) => ((promise: Promise<unknown>) => void) | undefined;\n spanName?: string | ((ctx: TCtx, request: ExtractedRequest) => string);\n}\n\nexport interface FrameworkRequestHandle extends MiddlewareLoggerResult {\n middlewareOptions: MiddlewareLoggerOptions;\n runWith: <T>(fn: () => T | Promise<T>) => Promise<T>;\n}\n\nexport interface FrameworkIntegrationHelpers<TCtx> {\n begin: (\n traceCtx: TraceContext,\n ctx: TCtx,\n options?: FrameworkHandlerOptions,\n ) => FrameworkRequestHandle;\n runTraced: <T>(\n ctx: TCtx,\n options: FrameworkHandlerOptions | undefined,\n handler: (handle: FrameworkRequestHandle) => Promise<T>,\n ) => Promise<T>;\n}\n\nexport function applyLoggerEnrichment(\n logger: RequestLogger,\n ...attributeSets: Array<Record<string, unknown> | undefined | null>\n): void {\n for (const attrs of attributeSets) {\n if (attrs && Object.keys(attrs).length > 0) {\n logger.set(attrs);\n }\n }\n}\n\nexport async function completeIntegratedRequest<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n result: T,\n): Promise<T> {\n if (handle.skipped || options?.autoEmit === false) {\n return result;\n }\n\n if (result instanceof Response) {\n return handle.finishResponse(result) as unknown as T;\n }\n\n await handle.finish({});\n return result;\n}\n\nexport async function runWithIntegratedHandle<T>(\n handle: FrameworkRequestHandle,\n options: IntegratedCompletionOptions | undefined,\n fn: () => T | Promise<T>,\n): Promise<T> {\n if (handle.skipped) {\n return handle.runWith(fn);\n }\n\n try {\n const result = await handle.runWith(fn);\n return completeIntegratedRequest(handle, options, result);\n } catch (error) {\n if (options?.autoEmit !== false) {\n await handle.finish({\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n throw error;\n }\n}\n\nexport function toRouteAdapterOptions(\n options?: Pick<\n FrameworkHandlerOptions,\n keyof RouteAdapterOptions | 'requestLoggerOptions'\n >,\n): RouteAdapterOptions {\n if (!options) return {};\n const { include, exclude, routes, waitUntil, keep, requestLoggerOptions } =\n options;\n return { include, exclude, routes, waitUntil, keep, requestLoggerOptions };\n}\n\nexport function buildTracedOptions(\n options: TracedOptionInput | undefined,\n spanName: string,\n): FrameworkHandlerOptions {\n return {\n ...toRouteAdapterOptions(options),\n requestLoggerOptions: options?.requestLoggerOptions,\n autoEmit: options?.autoEmit,\n spanName,\n };\n}\n\nfunction resolveSpanName<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n request: ExtractedRequest,\n): string {\n if (typeof spec.spanName === 'function') {\n return spec.spanName(ctx, request);\n }\n if (typeof spec.spanName === 'string') {\n return spec.spanName;\n }\n return `http.${request.method.toLowerCase() || 'request'}`;\n}\n\nfunction buildHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n traceCtx: TraceContext,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const extracted = spec.extractRequest(ctx);\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n requestLoggerOptions: mergeRequestLoggerOptions(\n options.requestLoggerOptions,\n waitUntil,\n ),\n };\n\n const log = getRequestLogger(\n traceCtx,\n middlewareOptions.requestLoggerOptions,\n );\n log.set({\n 'http.request.method': extracted.method,\n 'http.route': extracted.path,\n ...(extracted.requestId ? { 'http.request.id': extracted.requestId } : {}),\n });\n\n if (spec.storage) {\n attachForkToLogger(\n log,\n spec.forkLifecycle ?? createStorageForkLifecycle(spec.storage),\n );\n }\n\n spec.attachLogger(ctx, log);\n\n const result = createMiddlewareLogger(log, middlewareOptions);\n const storage = spec.storage;\n\n return {\n ...result,\n middlewareOptions,\n runWith: async (fn) => {\n if (!storage || result.skipped) return fn();\n return storage.run(log, fn);\n },\n };\n}\n\nfunction buildSkippedHandle<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n ctx: TCtx,\n extracted: ExtractedRequest,\n options: FrameworkHandlerOptions = {},\n): FrameworkRequestHandle {\n const waitUntil = options.waitUntil ?? spec.extractWaitUntil?.(ctx);\n const middlewareOptions: MiddlewareLoggerOptions = {\n method: extracted.method,\n path: extracted.path,\n requestId: extracted.requestId,\n ...toRouteAdapterOptions(options),\n waitUntil,\n };\n\n const logger = createNoopRequestLogger();\n spec.attachLogger(ctx, logger);\n\n return {\n logger,\n middlewareOptions,\n skipped: true,\n finish: async () => null,\n finishResponse: async (response) => response,\n runWith: async (fn) => {\n if (!spec.storage) return fn();\n return spec.storage.run(logger, fn);\n },\n };\n}\n\nexport function defineFrameworkIntegration<TCtx>(\n spec: FrameworkIntegrationSpec<TCtx>,\n): FrameworkIntegrationHelpers<TCtx> {\n return {\n begin(traceCtx, ctx, options = {}) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return buildSkippedHandle(spec, ctx, extracted, options);\n }\n return buildHandle(spec, ctx, traceCtx, options);\n },\n\n runTraced(ctx, options, handler) {\n const extracted = spec.extractRequest(ctx);\n if (\n !shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))\n ) {\n return handler(buildSkippedHandle(spec, ctx, extracted, options));\n }\n\n const spanName =\n options?.spanName ?? resolveSpanName(spec, ctx, extracted);\n\n return trace({ name: spanName }, (traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n })();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AASA,SAAgB,oBACd,cACA,WACM;CACN,AAAK,aAAa,OAAO,QAAQ;EAC/B,QAAQ,MAAM,+CAA+C,GAAG;CAClE,CAAC;CACD,IAAI,OAAO,cAAc,YACvB,UAAU,YAAY;AAE1B;;;;ACdA,SAAgB,oBAAoB,UAA6B;CAC/D,OAAO,SAAS,SAAS;AAC3B;;;;;;AAOA,SAAgB,2BAA2B,UAA6B;CACtE,IAAI,CAAC,SAAS,MAAM,OAAO;CAE3B,MAAM,eAAe,SAAS,QAAQ,IAAI,cAAc,KAAK,GAAE,CAAE,YAAY;CAE7E,IAAI,YAAY,SAAS,mBAAmB,GAAG,OAAO;CACtD,IAAI,YAAY,SAAS,sBAAsB,GAAG,OAAO;CACzD,IAAI,SAAS,QAAQ,IAAI,+BAA+B,GAAG,OAAO;CAClE,IAAI,SAAS,QAAQ,IAAI,mBAAmB,CAAC,EAAE,YAAY,CAAC,CAAC,SAAS,SAAS,GAC7E,OAAO;CAGT,OAAO;AACT;AAEA,SAAS,QAAQ,OAAuB;CACtC,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACjE;AAEA,SAAS,mBACP,MACA,QACA,SACmC;CACnC,IAAI,KAAK,QAAQ;EACf,AAAK,QAAQ,QAAQ,wBAAQ,IAAI,UAAU,0BAA0B,CAAC,CAAC,CAAC,CAAC,OACtE,QAAiB;GAChB,QAAQ,MAAM,oDAAoD,GAAG;EACvE,CACF;EACA,OAAO;CACT;CAEA,MAAM,SAAS,KAAK,UAAU;CAC9B,IAAI,UAAU;CAEd,MAAM,UAAU,OAAmC;EACjD,IAAI,SAAS;EACb,UAAU;EACV,AAAK,QAAQ,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,QAAiB;GACjD,QAAQ,MAAM,yDAAyD,GAAG;EAC5E,CAAC;CACH;CAEA,OAAO,IAAI,eAA2B;EACpC,MAAM,KAAK,YAAY;GACrB,IAAI;IACF,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;KACR,OAAO,MAAM;KACb,WAAW,MAAM;KACjB;IACF;IACA,WAAW,QAAQ,KAAK;GAC1B,SAAS,KAAK;IACZ,aAAa,QAAQ,GAAG,CAAC;IACzB,WAAW,MAAM,GAAG;GACtB;EACF;EAEA,MAAM,OAAO,QAAQ;GACnB,IAAI;IACF,MAAM,OAAO,OAAO,MAAM;GAC5B,UAAU;IACR,OAAO,MAAM;GACf;EACF;CACF,CAAC;AACH;;;;;AAMA,SAAgB,+BACd,UACA,YACU;CACV,IAAI,CAAC,SAAS,MAAM;EAClB,AAAK,QAAQ,QAAQ,WAAW,EAAE,QAAQ,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,OAC3D,QAAiB;GAChB,QAAQ,MAAM,yDAAyD,GAAG;EAC5E,CACF;EACA,OAAO;CACT;CAEA,MAAM,OAAO,mBACX,SAAS,YACH,WAAW,EAAE,QAAQ,SAAS,OAAO,CAAC,IAC3C,QAAQ,WAAW;EAAE,QAAQ,SAAS;EAAQ,OAAO,QAAQ,GAAG;CAAE,CAAC,CACtE;CACA,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO,IAAI,SAAS,MAAM;EACxB,QAAQ,SAAS;EACjB,YAAY,SAAS;EACrB,SAAS,SAAS;CACpB,CAAC;AACH;;;;ACzCA,MAAM,aAAqC;CACzC,6CAAgC;CAChC,cAAc,QAAQ,QAAQ,IAAI;CAClC,iBAAiB,aAAa,QAAQ,QAAQ,QAAQ;CACtD,SAAS;AACX;AAEA,SAAgB,0BACd,MACA,WACkC;CAClC,IAAI,CAAC,WAAW,OAAO;CAEvB,MAAM,aAAa,MAAM;CACzB,OAAO;EACL,GAAG;EACH,SAAS,aAAa;GAIpB,oBAHc,aACV,QAAQ,QAAQ,WAAW,QAAQ,CAAC,IACpC,QAAQ,QAAQ,GACO,SAAS;EACtC;CACF;AACF;AAEA,eAAe,cACb,QACA,SACA,WACA,MAKoC;CACpC,MAAM,EAAE,QAAQ,OAAO,cAAc,QAAQ,CAAC;CAE9C,IAAI,OAAO;EACT,OAAO,MAAM,KAAK;EAClB,OAAO,IAAI;GACT,6BAA6B,UAAU;GACvC,eAAe,MAAM;EACvB,CAAC;CACH,OAAO,IAAI,WAAW,QACpB,OAAO,IAAI,EAAE,6BAA6B,OAAO,CAAC;CAGpD,MAAM,aAAa,KAAK,IAAI,IAAI;CAChC,OAAO,IAAI,EAAE,aAAa,WAAW,CAAC;CAEtC,MAAM,UAA+B;EACnC,QACE,UACC,OAAO,WAAW,CAAC,CAAC;EACvB;EACA,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB,SAAS,OAAO,WAAW;EAC3B,YAAY;CACd;CAEA,IAAI,QAAQ,MACV,MAAM,QAAQ,KAAK,OAAO;CAG5B,IAAI,QAAQ,UACV,IAAI;EACF,MAAM,QAAQ,SAAS;GACrB;GACA,QAAQ,QAAQ;GAChB,MAAM,QAAQ;GACd,QAAQ,QAAQ;GAChB;EACF,CAAC;CACH,SAAS,KAAK;EACZ,QAAQ,MAAM,uCAAuC,GAAG;CAC1D;CAGF,MAAM,kBAAkB;EACtB,GAAI,aAAa,CAAC;EAClB,GAAI,QAAQ,aAAa,EAAE,8BAA8B,KAAK,IAAI,CAAC;CACrE;CAEA,OAAO,OAAO,QACZ,OAAO,KAAK,eAAe,CAAC,CAAC,SAAS,IAAI,kBAAkB,MAC9D;AACF;;;;;AAMA,SAAgB,uBACd,QACA,SACwB;CACxB,IAAI,wCAAsB,QAAQ,MAAM,OAAO,GAC7C,OAAO;CAGT,MAAM,mDAAiC,QAAQ,MAAM,QAAQ,MAAM;CACnE,IAAI,cACF,OAAO,IAAI,EAAE,SAAS,aAAa,CAAC;CAGtC,IAAI,QAAQ,WACV,OAAO,IAAI,EAAE,mBAAmB,QAAQ,UAAU,CAAC;CAGrD,MAAM,YAAY,KAAK,IAAI;CAE3B,OAAO;EACL;EACA,SAAS;EACT,SAAS,SAAS,cAAc,QAAQ,SAAS,WAAW,IAAI;EAChE,gBAAgB,OAAO,UAAU,SAAS;GACxC,MAAM,SAAS,MAAM,UAAU,SAAS;GACxC,IAAI,CAAC,2BAA2B,QAAQ,GAAG;IACzC,MAAM,cAAc,QAAQ,SAAS,WAAW;KAC9C;KACA,WAAW,MAAM;IACnB,CAAC;IACD,OAAO;GACT;GAEA,OAAO,+BAA+B,UAAU,OAAO,SAAS;IAC9D,MAAM,cAAc,QAAQ,SAAS,WAAW;KAC9C,QAAQ,KAAK,UAAU;KACvB,OAAO,KAAK;KACZ,WAAW,MAAM;IACnB,CAAC;GACH,CAAC;EACH;CACF;AACF;;;;;;;;ACzMA,SAAgB,mBACd,QACA,WACM;CACN,MAAM,eAAe,OAAO,KAAK,KAAK,MAAM;CAC5C,OAAO,QACL,OACA,IACA,YACG;EACH,aAAa,OAAO,IAAI,EACtB,WAAW;GACT,eAAe,UAAU;IACvB,UAAU,eAAe,KAAK;IAC9B,SAAS,WAAW,eAAe,KAAK;GAC1C;GACA,cAAc,UAAU;IACtB,UAAU,cAAc,KAAK;IAC7B,SAAS,WAAW,cAAc,KAAK;GACzC;EACF,EACF,CAAC;CACH;AACF;;;;AC2CA,SAAgB,sBACd,QACA,GAAG,eACG;CACN,KAAK,MAAM,SAAS,eAClB,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GACvC,OAAO,IAAI,KAAK;AAGtB;AAEA,eAAsB,0BACpB,QACA,SACA,QACY;CACZ,IAAI,OAAO,WAAW,SAAS,aAAa,OAC1C,OAAO;CAGT,IAAI,kBAAkB,UACpB,OAAO,OAAO,eAAe,MAAM;CAGrC,MAAM,OAAO,OAAO,CAAC,CAAC;CACtB,OAAO;AACT;AAEA,eAAsB,wBACpB,QACA,SACA,IACY;CACZ,IAAI,OAAO,SACT,OAAO,OAAO,QAAQ,EAAE;CAG1B,IAAI;EAEF,OAAO,0BAA0B,QAAQ,SAAS,MAD7B,OAAO,QAAQ,EAAE,CACkB;CAC1D,SAAS,OAAO;EACd,IAAI,SAAS,aAAa,OACxB,MAAM,OAAO,OAAO,EAClB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,EACjE,CAAC;EAEH,MAAM;CACR;AACF;AAEA,SAAgB,sBACd,SAIqB;CACrB,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,MAAM,EAAE,SAAS,SAAS,QAAQ,WAAW,MAAM,yBACjD;CACF,OAAO;EAAE;EAAS;EAAS;EAAQ;EAAW;EAAM;CAAqB;AAC3E;AAEA,SAAgB,mBACd,SACA,UACyB;CACzB,OAAO;EACL,GAAG,sBAAsB,OAAO;EAChC,sBAAsB,SAAS;EAC/B,UAAU,SAAS;EACnB;CACF;AACF;AAEA,SAAS,gBACP,MACA,KACA,SACQ;CACR,IAAI,OAAO,KAAK,aAAa,YAC3B,OAAO,KAAK,SAAS,KAAK,OAAO;CAEnC,IAAI,OAAO,KAAK,aAAa,UAC3B,OAAO,KAAK;CAEd,OAAO,QAAQ,QAAQ,OAAO,YAAY,KAAK;AACjD;AAEA,SAAS,YACP,MACA,KACA,UACA,UAAmC,CAAC,GACZ;CACxB,MAAM,YAAY,KAAK,eAAe,GAAG;CACzC,MAAM,YAAY,QAAQ,aAAa,KAAK,mBAAmB,GAAG;CAClE,MAAM,oBAA6C;EACjD,QAAQ,UAAU;EAClB,MAAM,UAAU;EAChB,WAAW,UAAU;EACrB,GAAG,sBAAsB,OAAO;EAChC;EACA,sBAAsB,0BACpB,QAAQ,sBACR,SACF;CACF;CAEA,MAAM,oCACJ,UACA,kBAAkB,oBACpB;CACA,IAAI,IAAI;EACN,uBAAuB,UAAU;EACjC,cAAc,UAAU;EACxB,GAAI,UAAU,YAAY,EAAE,mBAAmB,UAAU,UAAU,IAAI,CAAC;CAC1E,CAAC;CAED,IAAI,KAAK,SACP,mBACE,KACA,KAAK,iBAAiBA,mDAA2B,KAAK,OAAO,CAC/D;CAGF,KAAK,aAAa,KAAK,GAAG;CAE1B,MAAM,SAAS,uBAAuB,KAAK,iBAAiB;CAC5D,MAAM,UAAU,KAAK;CAErB,OAAO;EACL,GAAG;EACH;EACA,SAAS,OAAO,OAAO;GACrB,IAAI,CAAC,WAAW,OAAO,SAAS,OAAO,GAAG;GAC1C,OAAO,QAAQ,IAAI,KAAK,EAAE;EAC5B;CACF;AACF;AAEA,SAAS,mBACP,MACA,KACA,WACA,UAAmC,CAAC,GACZ;CACxB,MAAM,YAAY,QAAQ,aAAa,KAAK,mBAAmB,GAAG;CAClE,MAAM,oBAA6C;EACjD,QAAQ,UAAU;EAClB,MAAM,UAAU;EAChB,WAAW,UAAU;EACrB,GAAG,sBAAsB,OAAO;EAChC;CACF;CAEA,MAAM,8CAAiC;CACvC,KAAK,aAAa,KAAK,MAAM;CAE7B,OAAO;EACL;EACA;EACA,SAAS;EACT,QAAQ,YAAY;EACpB,gBAAgB,OAAO,aAAa;EACpC,SAAS,OAAO,OAAO;GACrB,IAAI,CAAC,KAAK,SAAS,OAAO,GAAG;GAC7B,OAAO,KAAK,QAAQ,IAAI,QAAQ,EAAE;EACpC;CACF;AACF;AAEA,SAAgB,2BACd,MACmC;CACnC,OAAO;EACL,MAAM,UAAU,KAAK,UAAU,CAAC,GAAG;GACjC,MAAM,YAAY,KAAK,eAAe,GAAG;GACzC,IACE,wCAAsB,UAAU,MAAM,sBAAsB,OAAO,CAAC,GAEpE,OAAO,mBAAmB,MAAM,KAAK,WAAW,OAAO;GAEzD,OAAO,YAAY,MAAM,KAAK,UAAU,OAAO;EACjD;EAEA,UAAU,KAAK,SAAS,SAAS;GAC/B,MAAM,YAAY,KAAK,eAAe,GAAG;GACzC,IACE,wCAAsB,UAAU,MAAM,sBAAsB,OAAO,CAAC,GAEpE,OAAO,QAAQ,mBAAmB,MAAM,KAAK,WAAW,OAAO,CAAC;GAMlE,0BAAa,EAAE,MAFb,SAAS,YAAY,gBAAgB,MAAM,KAAK,SAAS,EAE7B,IAAI,aAAa,YAAY;IAEzD,OAAO,QADQ,YAAY,MAAM,KAAK,UAAU,WAAW,CAAC,CACxC,CAAC;GACvB,CAAC,CAAC,CAAC;EACL;CACF;AACF"}
|