autotel-adapters 2.0.1 → 2.0.2
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/README.md +8 -0
- package/dist/cloudflare.cjs +1 -1
- package/dist/cloudflare.d.cts +1 -1
- package/dist/cloudflare.d.ts +1 -1
- package/dist/cloudflare.js +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/elysia.cjs +1 -1
- package/dist/elysia.d.cts +1 -1
- package/dist/elysia.d.ts +1 -1
- package/dist/elysia.js +1 -1
- package/dist/express.cjs +1 -1
- package/dist/express.d.cts +1 -1
- package/dist/express.d.ts +1 -1
- package/dist/express.js +1 -1
- package/dist/fastify.cjs +1 -1
- package/dist/fastify.d.cts +1 -1
- package/dist/fastify.d.ts +1 -1
- package/dist/fastify.js +1 -1
- package/dist/hono.cjs +2 -2
- package/dist/hono.cjs.map +1 -1
- package/dist/hono.d.cts +1 -1
- package/dist/hono.d.cts.map +1 -1
- package/dist/hono.d.ts +1 -1
- package/dist/hono.d.ts.map +1 -1
- package/dist/hono.js +2 -2
- package/dist/hono.js.map +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-DI-1RuTh.d.cts → integration-BAs5uTiD.d.ts} +5 -3
- package/dist/integration-BAs5uTiD.d.ts.map +1 -0
- package/dist/{integration-guh7BHTF.cjs → integration-Cc8bXel_.cjs} +8 -4
- package/dist/integration-Cc8bXel_.cjs.map +1 -0
- package/dist/{integration-rYoX8QLk.d.ts → integration-D_rlU8Nx.d.cts} +5 -3
- package/dist/integration-D_rlU8Nx.d.cts.map +1 -0
- package/dist/{integration-IUpfttGT.js → integration-DvibHRzI.js} +8 -4
- package/dist/integration-DvibHRzI.js.map +1 -0
- package/dist/nestjs.cjs +1 -1
- package/dist/nestjs.d.cts +1 -1
- package/dist/nestjs.d.ts +1 -1
- package/dist/nestjs.js +1 -1
- package/dist/next.cjs +29 -4
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +1 -1
- package/dist/next.d.cts.map +1 -1
- package/dist/next.d.ts +1 -1
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +29 -4
- package/dist/next.js.map +1 -1
- package/dist/nitro.cjs +1 -1
- package/dist/nitro.d.cts +1 -1
- package/dist/nitro.d.ts +1 -1
- package/dist/nitro.js +1 -1
- package/dist/sveltekit.cjs +1 -1
- package/dist/sveltekit.d.cts +1 -1
- package/dist/sveltekit.d.ts +1 -1
- package/dist/sveltekit.js +1 -1
- package/dist/toolkit/index.cjs +1 -1
- package/dist/toolkit/index.d.cts +1 -1
- package/dist/toolkit/index.d.ts +1 -1
- package/dist/toolkit/index.js +1 -1
- package/package.json +2 -2
- package/dist/integration-DI-1RuTh.d.cts.map +0 -1
- package/dist/integration-IUpfttGT.js.map +0 -1
- package/dist/integration-guh7BHTF.cjs.map +0 -1
- package/dist/integration-rYoX8QLk.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -91,6 +91,10 @@ export const POST = withAutotel(async (request: Request) => {
|
|
|
91
91
|
});
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
Navigation helpers such as `redirect()` and `notFound()` remain framework
|
|
95
|
+
control flow: `withAutotel()` rethrows their signals without recording a
|
|
96
|
+
phantom request error, including when a signal is wrapped in `cause`.
|
|
97
|
+
|
|
94
98
|
## Nitro
|
|
95
99
|
|
|
96
100
|
```ts
|
|
@@ -117,6 +121,10 @@ app.get('/orders/:id', (c) => {
|
|
|
117
121
|
});
|
|
118
122
|
```
|
|
119
123
|
|
|
124
|
+
`autotelMiddleware()` also observes SSE, NDJSON, and AI response streams. The
|
|
125
|
+
request snapshot is emitted once when the body closes, errors, or is cancelled,
|
|
126
|
+
so context added during streaming is retained.
|
|
127
|
+
|
|
120
128
|
## Cloudflare Workers
|
|
121
129
|
|
|
122
130
|
```ts
|
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-Cc8bXel_.cjs');
|
|
3
3
|
const require_core = require('./core.cjs');
|
|
4
4
|
let autotel = require("autotel");
|
|
5
5
|
|
package/dist/cloudflare.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/cloudflare.d.ts
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/cloudflare.d.ts
|
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-DvibHRzI.js";
|
|
2
2
|
import { createUseLogger, getHeader } from "./core.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
|
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-Cc8bXel_.cjs');
|
|
3
3
|
let autotel = require("autotel");
|
|
4
4
|
let autotel_edge = require("autotel-edge");
|
|
5
5
|
|
package/dist/core.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-D_rlU8Nx.cjs";
|
|
2
2
|
import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
//#region src/core.d.ts
|
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-BAs5uTiD.js";
|
|
2
2
|
import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput } from "autotel";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
//#region src/core.d.ts
|
package/dist/core.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as mergeRequestLoggerOptions, f as shouldInstrumentPath, o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { d as mergeRequestLoggerOptions, f as shouldInstrumentPath, o as toRouteAdapterOptions } from "./integration-DvibHRzI.js";
|
|
2
2
|
import { getRequestLogger, withTracing } from "autotel";
|
|
3
3
|
|
|
4
4
|
//#region src/core.ts
|
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-Cc8bXel_.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,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/elysia.d.ts
|
package/dist/elysia.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/elysia.d.ts
|
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-DvibHRzI.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-Cc8bXel_.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.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/express.d.ts
|
package/dist/express.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/express.d.ts
|
package/dist/express.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { o as toRouteAdapterOptions } from "./integration-DvibHRzI.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/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-Cc8bXel_.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.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/fastify.d.ts
|
package/dist/fastify.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as RouteAdapterOptions } from "./integration-
|
|
1
|
+
import { _ as RouteAdapterOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/fastify.d.ts
|
package/dist/fastify.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { o as toRouteAdapterOptions } from "./integration-DvibHRzI.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/hono.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-Cc8bXel_.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");
|
|
@@ -45,7 +45,7 @@ function autotelMiddleware(options = {}) {
|
|
|
45
45
|
require_integration.applyLoggerEnrichment(handle.logger, enrichFromContext(c), options.enrichRequest?.(c));
|
|
46
46
|
try {
|
|
47
47
|
await handle.runWith(() => next());
|
|
48
|
-
if (options.autoEmit !== false) await handle.
|
|
48
|
+
if (options.autoEmit !== false) c.res = await handle.finishResponse(c.res);
|
|
49
49
|
} catch (error) {
|
|
50
50
|
if (options.autoEmit !== false) await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
|
|
51
51
|
throw error;
|
package/dist/hono.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.cjs","names":["createLoggerStorage","createUseLogger","defineFrameworkIntegration"],"sources":["../src/hono.ts"],"sourcesContent":["import type { Context } from 'hono';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createUseLogger } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n} from './toolkit/integration';\n\nexport interface HonoWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (c: Context) => Record<string, unknown> | undefined;\n}\n\nconst { storage: honoLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'middleware context. Register autotelMiddleware() before your routes.',\n );\n\nconst baseUseLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: enrichFromContext,\n});\n\nfunction enrichFromContext(c: Context): Record<string, unknown> {\n return {\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n };\n}\n\nconst integration = defineFrameworkIntegration<Context>({\n name: 'hono',\n storage: honoLoggerStorage,\n extractRequest: (c) => ({\n method: c.req.method,\n path: c.req.path,\n headers: c.req.raw.headers,\n requestId: c.req.header('x-request-id') ?? undefined,\n }),\n attachLogger: (c, logger) => {\n c.set('autotelLogger', logger);\n },\n});\n\n/** Request logger inside autotelMiddleware / traced handlers. */\nexport function useLogger(c?: Context): RequestLogger {\n if (honoLoggerStorage.getStore()) {\n return storageUseLogger();\n }\n return baseUseLogger(c);\n}\n\nexport function autotelMiddleware(options: HonoWithAutotelOptions = {}) {\n return async (c: Context, next: () => Promise<void>) => {\n return integration.runTraced(c, options, async (handle) => {\n if (handle.skipped) {\n await handle.runWith(() => next());\n return;\n }\n\n applyLoggerEnrichment(\n handle.logger,\n enrichFromContext(c),\n options.enrichRequest?.(c),\n );\n\n try {\n await handle.runWith(() => next());\n if (options.autoEmit !== false) {\n await handle.
|
|
1
|
+
{"version":3,"file":"hono.cjs","names":["createLoggerStorage","createUseLogger","defineFrameworkIntegration"],"sources":["../src/hono.ts"],"sourcesContent":["import type { Context } from 'hono';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createUseLogger } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n} from './toolkit/integration';\n\nexport interface HonoWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (c: Context) => Record<string, unknown> | undefined;\n}\n\nconst { storage: honoLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'middleware context. Register autotelMiddleware() before your routes.',\n );\n\nconst baseUseLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: enrichFromContext,\n});\n\nfunction enrichFromContext(c: Context): Record<string, unknown> {\n return {\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n };\n}\n\nconst integration = defineFrameworkIntegration<Context>({\n name: 'hono',\n storage: honoLoggerStorage,\n extractRequest: (c) => ({\n method: c.req.method,\n path: c.req.path,\n headers: c.req.raw.headers,\n requestId: c.req.header('x-request-id') ?? undefined,\n }),\n attachLogger: (c, logger) => {\n c.set('autotelLogger', logger);\n },\n});\n\n/** Request logger inside autotelMiddleware / traced handlers. */\nexport function useLogger(c?: Context): RequestLogger {\n if (honoLoggerStorage.getStore()) {\n return storageUseLogger();\n }\n return baseUseLogger(c);\n}\n\nexport function autotelMiddleware(options: HonoWithAutotelOptions = {}) {\n return async (c: Context, next: () => Promise<void>) => {\n return integration.runTraced(c, options, async (handle) => {\n if (handle.skipped) {\n await handle.runWith(() => next());\n return;\n }\n\n applyLoggerEnrichment(\n handle.logger,\n enrichFromContext(c),\n options.enrichRequest?.(c),\n );\n\n try {\n await handle.runWith(() => next());\n if (options.autoEmit !== false) {\n /* Hono finalizes `c.res` after middleware returns. Assign the observed\n response here so stream completion, cancellation, and failure\n drive the request snapshot without locking the original body. */\n c.res = await handle.finishResponse(c.res);\n }\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 };\n}\n\n/** Alias for {@link useLogger} inside autotelMiddleware. */\nexport const useLoggerFromContext = useLogger;\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;AAmBA,MAAM,EAAE,SAAS,mBAAmB,WAAW,qBAC7CA,4CACE,sEACF;AAEF,MAAM,gBAAgBC,6BAAyB;CAC7C,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAS,kBAAkB,GAAqC;CAC9D,OAAO;EACL,uBAAuB,EAAE,IAAI;EAC7B,YAAY,EAAE,IAAI;EAClB,cAAc,EAAE,IAAI;CACtB;AACF;AAEA,MAAM,cAAcC,+CAAoC;CACtD,MAAM;CACN,SAAS;CACT,iBAAiB,OAAO;EACtB,QAAQ,EAAE,IAAI;EACd,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI,IAAI;EACnB,WAAW,EAAE,IAAI,OAAO,cAAc,KAAK;CAC7C;CACA,eAAe,GAAG,WAAW;EAC3B,EAAE,IAAI,iBAAiB,MAAM;CAC/B;AACF,CAAC;;AAGD,SAAgB,UAAU,GAA4B;CACpD,IAAI,kBAAkB,SAAS,GAC7B,OAAO,iBAAiB;CAE1B,OAAO,cAAc,CAAC;AACxB;AAEA,SAAgB,kBAAkB,UAAkC,CAAC,GAAG;CACtE,OAAO,OAAO,GAAY,SAA8B;EACtD,OAAO,YAAY,UAAU,GAAG,SAAS,OAAO,WAAW;GACzD,IAAI,OAAO,SAAS;IAClB,MAAM,OAAO,cAAc,KAAK,CAAC;IACjC;GACF;GAEA,0CACE,OAAO,QACP,kBAAkB,CAAC,GACnB,QAAQ,gBAAgB,CAAC,CAC3B;GAEA,IAAI;IACF,MAAM,OAAO,cAAc,KAAK,CAAC;IACjC,IAAI,QAAQ,aAAa,OAIvB,EAAE,MAAM,MAAM,OAAO,eAAe,EAAE,GAAG;GAE7C,SAAS,OAAO;IACd,IAAI,QAAQ,aAAa,OACvB,MAAM,OAAO,OAAO,EAClB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,EACjE,CAAC;IAEH,MAAM;GACR;EACF,CAAC;CACH;AACF;;AAGA,MAAa,uBAAuB"}
|
package/dist/hono.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { Context } from "hono";
|
package/dist/hono.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.d.cts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;;UAeiB,+BAA+B;EAC9C,iBAAiB,GAAG,YAAY;;;iBAoClB,UAAU,IAAI,UAAU;iBAOxB,kBAAkB,UAAS,0BAC3B,GAAG,SAAS,YAAY,kBAAa;;
|
|
1
|
+
{"version":3,"file":"hono.d.cts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;;UAeiB,+BAA+B;EAC9C,iBAAiB,GAAG,YAAY;;;iBAoClB,UAAU,IAAI,UAAU;iBAOxB,kBAAkB,UAAS,0BAC3B,GAAG,SAAS,YAAY,kBAAa;;cAkCxC,6BAAoB"}
|
package/dist/hono.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { Context } from "hono";
|
package/dist/hono.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.d.ts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;;UAeiB,+BAA+B;EAC9C,iBAAiB,GAAG,YAAY;;;iBAoClB,UAAU,IAAI,UAAU;iBAOxB,kBAAkB,UAAS,0BAC3B,GAAG,SAAS,YAAY,kBAAa;;
|
|
1
|
+
{"version":3,"file":"hono.d.ts","names":[],"sources":["../src/hono.ts"],"mappings":";;;;;UAeiB,+BAA+B;EAC9C,iBAAiB,GAAG,YAAY;;;iBAoClB,UAAU,IAAI,UAAU;iBAOxB,kBAAkB,UAAS,0BAC3B,GAAG,SAAS,YAAY,kBAAa;;cAkCxC,6BAAoB"}
|
package/dist/hono.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-
|
|
1
|
+
import { i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-DvibHRzI.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { createUseLogger } from "./core.js";
|
|
4
4
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
@@ -44,7 +44,7 @@ function autotelMiddleware(options = {}) {
|
|
|
44
44
|
applyLoggerEnrichment(handle.logger, enrichFromContext(c), options.enrichRequest?.(c));
|
|
45
45
|
try {
|
|
46
46
|
await handle.runWith(() => next());
|
|
47
|
-
if (options.autoEmit !== false) await handle.
|
|
47
|
+
if (options.autoEmit !== false) c.res = await handle.finishResponse(c.res);
|
|
48
48
|
} catch (error) {
|
|
49
49
|
if (options.autoEmit !== false) await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
|
|
50
50
|
throw error;
|
package/dist/hono.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.js","names":[],"sources":["../src/hono.ts"],"sourcesContent":["import type { Context } from 'hono';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createUseLogger } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n} from './toolkit/integration';\n\nexport interface HonoWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (c: Context) => Record<string, unknown> | undefined;\n}\n\nconst { storage: honoLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'middleware context. Register autotelMiddleware() before your routes.',\n );\n\nconst baseUseLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: enrichFromContext,\n});\n\nfunction enrichFromContext(c: Context): Record<string, unknown> {\n return {\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n };\n}\n\nconst integration = defineFrameworkIntegration<Context>({\n name: 'hono',\n storage: honoLoggerStorage,\n extractRequest: (c) => ({\n method: c.req.method,\n path: c.req.path,\n headers: c.req.raw.headers,\n requestId: c.req.header('x-request-id') ?? undefined,\n }),\n attachLogger: (c, logger) => {\n c.set('autotelLogger', logger);\n },\n});\n\n/** Request logger inside autotelMiddleware / traced handlers. */\nexport function useLogger(c?: Context): RequestLogger {\n if (honoLoggerStorage.getStore()) {\n return storageUseLogger();\n }\n return baseUseLogger(c);\n}\n\nexport function autotelMiddleware(options: HonoWithAutotelOptions = {}) {\n return async (c: Context, next: () => Promise<void>) => {\n return integration.runTraced(c, options, async (handle) => {\n if (handle.skipped) {\n await handle.runWith(() => next());\n return;\n }\n\n applyLoggerEnrichment(\n handle.logger,\n enrichFromContext(c),\n options.enrichRequest?.(c),\n );\n\n try {\n await handle.runWith(() => next());\n if (options.autoEmit !== false) {\n await handle.
|
|
1
|
+
{"version":3,"file":"hono.js","names":[],"sources":["../src/hono.ts"],"sourcesContent":["import type { Context } from 'hono';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createUseLogger } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n} from './toolkit/integration';\n\nexport interface HonoWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (c: Context) => Record<string, unknown> | undefined;\n}\n\nconst { storage: honoLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'middleware context. Register autotelMiddleware() before your routes.',\n );\n\nconst baseUseLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: enrichFromContext,\n});\n\nfunction enrichFromContext(c: Context): Record<string, unknown> {\n return {\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n };\n}\n\nconst integration = defineFrameworkIntegration<Context>({\n name: 'hono',\n storage: honoLoggerStorage,\n extractRequest: (c) => ({\n method: c.req.method,\n path: c.req.path,\n headers: c.req.raw.headers,\n requestId: c.req.header('x-request-id') ?? undefined,\n }),\n attachLogger: (c, logger) => {\n c.set('autotelLogger', logger);\n },\n});\n\n/** Request logger inside autotelMiddleware / traced handlers. */\nexport function useLogger(c?: Context): RequestLogger {\n if (honoLoggerStorage.getStore()) {\n return storageUseLogger();\n }\n return baseUseLogger(c);\n}\n\nexport function autotelMiddleware(options: HonoWithAutotelOptions = {}) {\n return async (c: Context, next: () => Promise<void>) => {\n return integration.runTraced(c, options, async (handle) => {\n if (handle.skipped) {\n await handle.runWith(() => next());\n return;\n }\n\n applyLoggerEnrichment(\n handle.logger,\n enrichFromContext(c),\n options.enrichRequest?.(c),\n );\n\n try {\n await handle.runWith(() => next());\n if (options.autoEmit !== false) {\n /* Hono finalizes `c.res` after middleware returns. Assign the observed\n response here so stream completion, cancellation, and failure\n drive the request snapshot without locking the original body. */\n c.res = await handle.finishResponse(c.res);\n }\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 };\n}\n\n/** Alias for {@link useLogger} inside autotelMiddleware. */\nexport const useLoggerFromContext = useLogger;\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAmBA,MAAM,EAAE,SAAS,mBAAmB,WAAW,qBAC7C,oBACE,sEACF;AAEF,MAAM,gBAAgB,gBAAyB;CAC7C,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAS,kBAAkB,GAAqC;CAC9D,OAAO;EACL,uBAAuB,EAAE,IAAI;EAC7B,YAAY,EAAE,IAAI;EAClB,cAAc,EAAE,IAAI;CACtB;AACF;AAEA,MAAM,cAAc,2BAAoC;CACtD,MAAM;CACN,SAAS;CACT,iBAAiB,OAAO;EACtB,QAAQ,EAAE,IAAI;EACd,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI,IAAI;EACnB,WAAW,EAAE,IAAI,OAAO,cAAc,KAAK;CAC7C;CACA,eAAe,GAAG,WAAW;EAC3B,EAAE,IAAI,iBAAiB,MAAM;CAC/B;AACF,CAAC;;AAGD,SAAgB,UAAU,GAA4B;CACpD,IAAI,kBAAkB,SAAS,GAC7B,OAAO,iBAAiB;CAE1B,OAAO,cAAc,CAAC;AACxB;AAEA,SAAgB,kBAAkB,UAAkC,CAAC,GAAG;CACtE,OAAO,OAAO,GAAY,SAA8B;EACtD,OAAO,YAAY,UAAU,GAAG,SAAS,OAAO,WAAW;GACzD,IAAI,OAAO,SAAS;IAClB,MAAM,OAAO,cAAc,KAAK,CAAC;IACjC;GACF;GAEA,sBACE,OAAO,QACP,kBAAkB,CAAC,GACnB,QAAQ,gBAAgB,CAAC,CAC3B;GAEA,IAAI;IACF,MAAM,OAAO,cAAc,KAAK,CAAC;IACjC,IAAI,QAAQ,aAAa,OAIvB,EAAE,MAAM,MAAM,OAAO,eAAe,EAAE,GAAG;GAE7C,SAAS,OAAO;IACd,IAAI,QAAQ,aAAa,OACvB,MAAM,OAAO,OAAO,EAClB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,EACjE,CAAC;IAEH,MAAM;GACR;EACF,CAAC;CACH;AACF;;AAGA,MAAa,uBAAuB"}
|
package/dist/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-Cc8bXel_.cjs');
|
|
3
3
|
const require_core = require('./core.cjs');
|
|
4
4
|
const require_next = require('./next.cjs');
|
|
5
5
|
const require_nitro = require('./nitro.cjs');
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-D_rlU8Nx.cjs";
|
|
2
2
|
import { AdapterUseLoggerOptions, BaseAdapterOptions, ConfigField, DrainPipelineOptions, HeadersLike, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, RequestRunnerOptions, StructuredError, StructuredErrorInput, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime } from "./core.cjs";
|
|
3
3
|
import { withAutotelFetch } from "./cloudflare.cjs";
|
|
4
4
|
import { autotel, useLogger, withAutotelHandler } from "./elysia.cjs";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-BAs5uTiD.js";
|
|
2
2
|
import { AdapterUseLoggerOptions, BaseAdapterOptions, ConfigField, DrainPipelineOptions, HeadersLike, ParsedError, PipelineDrainFn, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, RequestRunnerOptions, StructuredError, StructuredErrorInput, createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime } from "./core.js";
|
|
3
3
|
import { withAutotelFetch } from "./cloudflare.js";
|
|
4
4
|
import { autotel, useLogger, withAutotelHandler } from "./elysia.js";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as toRouteAdapterOptions } from "./integration-
|
|
1
|
+
import { o as toRouteAdapterOptions } from "./integration-DvibHRzI.js";
|
|
2
2
|
import { createRequestRunner, createUseLogger, getHeader, resolveAdapterConfig, shouldProbeRuntime } from "./core.js";
|
|
3
3
|
import { withAutotel } from "./next.js";
|
|
4
4
|
import { withAutotelEventHandler } from "./nitro.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ForkLifecycle, ForkLifecycle as ForkLifecycle$1, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, TraceContext } from "autotel";
|
|
2
|
-
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
2
|
import { RouteFilterOptions, RouteServiceConfig, getServiceForPath, matchesRoutePattern, shouldInstrumentPath } from "autotel-edge";
|
|
3
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
//#region src/toolkit/middleware.d.ts
|
|
5
5
|
type Awaitable<T> = T | Promise<T>;
|
|
6
6
|
interface RouteAdapterOptions {
|
|
@@ -64,6 +64,8 @@ interface ExtractedRequest {
|
|
|
64
64
|
}
|
|
65
65
|
interface IntegratedCompletionOptions {
|
|
66
66
|
autoEmit?: boolean;
|
|
67
|
+
/** Return false for framework control-flow throws that are not failures. */
|
|
68
|
+
isError?: (error: unknown) => boolean;
|
|
67
69
|
}
|
|
68
70
|
type TracedOptionInput = RouteAdapterOptions & {
|
|
69
71
|
requestLoggerOptions?: RequestLoggerOptions;
|
|
@@ -87,7 +89,7 @@ interface FrameworkRequestHandle extends MiddlewareLoggerResult {
|
|
|
87
89
|
}
|
|
88
90
|
interface FrameworkIntegrationHelpers<TCtx> {
|
|
89
91
|
begin: (traceCtx: TraceContext, ctx: TCtx, options?: FrameworkHandlerOptions) => FrameworkRequestHandle;
|
|
90
|
-
runTraced: <T>(ctx: TCtx, options: FrameworkHandlerOptions | undefined, handler: (handle: FrameworkRequestHandle) => Promise<T>) => Promise<T>;
|
|
92
|
+
runTraced: <T>(ctx: TCtx, options: FrameworkHandlerOptions | undefined, handler: (handle: FrameworkRequestHandle) => Promise<T>, completion?: Pick<IntegratedCompletionOptions, 'isError'>) => Promise<T>;
|
|
91
93
|
}
|
|
92
94
|
declare function applyLoggerEnrichment(logger: RequestLogger, ...attributeSets: Array<Record<string, unknown> | undefined | null>): void;
|
|
93
95
|
declare function completeIntegratedRequest<T>(handle: FrameworkRequestHandle, options: IntegratedCompletionOptions | undefined, result: T): Promise<T>;
|
|
@@ -97,4 +99,4 @@ declare function buildTracedOptions(options: TracedOptionInput | undefined, span
|
|
|
97
99
|
declare function defineFrameworkIntegration<TCtx>(spec: FrameworkIntegrationSpec<TCtx>): FrameworkIntegrationHelpers<TCtx>;
|
|
98
100
|
//#endregion
|
|
99
101
|
export { matchesRoutePattern as C, getServiceForPath as S, shouldInstrumentPath as T, RouteAdapterOptions as _, FrameworkRequestHandle as a, TailSamplingContext as b, buildTracedOptions as c, runWithIntegratedHandle as d, toRouteAdapterOptions as f, MiddlewareLoggerResult as g, MiddlewareLoggerOptions as h, FrameworkIntegrationSpec as i, completeIntegratedRequest as l, ForkLifecycle$1 as m, FrameworkHandlerOptions as n, IntegratedCompletionOptions as o, BaseAdapterOptions as p, FrameworkIntegrationHelpers as r, applyLoggerEnrichment as s, ExtractedRequest as t, defineFrameworkIntegration as u, RouteFilterOptions as v, mergeRequestLoggerOptions as w, createMiddlewareLogger as x, RouteServiceConfig as y };
|
|
100
|
-
//# sourceMappingURL=integration-
|
|
102
|
+
//# sourceMappingURL=integration-BAs5uTiD.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-BAs5uTiD.d.ts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":";;;;KAmBY,UAAU,KAAK,IAAI,QAAQ;UAKtB;EACf;EACA;EACA,SAAS,eAAe;EACxB,aAAa,SAAS;EACtB,QAAQ,KAAK,wBAAwB;EACrC,uBAAuB;;;KAIb,qBAAqB;UAEhB;EACf;EACA;EACA;EACA;EACA,SAAS;EACT;;UAGe,gCAAgC;EAC/C,YAAY;IACV,QAAQ;IACR;IACA;IACA;IACA;QACI;EACN;EACA;EACA;;UAGe;EACf,QAAQ;EACR,SAAS;IACP;IACA,QAAQ;IACR,YAAY;QACR,QAAQ;EACd,iBACE,UAAU,UACV;IAAS;IAAiB,YAAY;QACnC,QAAQ;EACb;;iBAUc,0BACd,MAAM,kCACN,aAAa,SAAS,4BACrB;;;;;iBAmFa,uBACd,QAAQ,eACR,SAAS,0BACR;;;UCjJc;EACf;EACA;EACA,UACI,UACA;IACE,IAAI;;EACV;;UAGe;EACf;;EAEA,WAAW;;KAGD,oBAAoB;EAC9B,uBAAuB;EACvB;;UAGe,gCAAgC;EAC/C;;UAGe,yBAAyB;EACxC;EACA,iBAAiB,KAAK,SAAS;EAC/B,eAAe,KAAK,MAAM,QAAQ;EAClC,UAAU,kBAAkB;EAC5B,gBAAgB;EAChB,oBACE,KAAK,WACA,SAAS;EAChB,sBAAsB,KAAK,MAAM,SAAS;;UAG3B,+BAA+B;EAC9C,mBAAmB;EACnB,UAAU,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;UAGnC,4BAA4B;EAC3C,QACE,UAAU,cACV,KAAK,MACL,UAAU,4BACP;EACL,YAAY,GACV,KAAK,MACL,SAAS,qCACT,UAAU,QAAQ,2BAA2B,QAAQ,IACrD,aAAa,KAAK,4CACf,QAAQ;;iBAGC,sBACd,QAAQ,kBACL,eAAe,MAAM;iBASJ,0BAA0B,GAC9C,QAAQ,wBACR,SAAS,yCACT,QAAQ,IACP,QAAQ;iBAaW,wBAAwB,GAC5C,QAAQ,wBACR,SAAS,yCACT,UAAU,IAAI,QAAQ,KACrB,QAAQ;iBAsBK,sBACd,UAAU,KACR,+BACM,gDAEP;iBAOa,mBACd,SAAS,+BACT,mBACC;iBA0Ga,2BAA2B,MACzC,MAAM,yBAAyB,QAC9B,4BAA4B"}
|
|
@@ -231,7 +231,8 @@ async function runWithIntegratedHandle(handle, options, fn) {
|
|
|
231
231
|
try {
|
|
232
232
|
return completeIntegratedRequest(handle, options, await handle.runWith(fn));
|
|
233
233
|
} catch (error) {
|
|
234
|
-
if (options?.autoEmit !== false)
|
|
234
|
+
if (options?.autoEmit !== false) if (options?.isError?.(error) === false) await handle.finish({});
|
|
235
|
+
else await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
|
|
235
236
|
throw error;
|
|
236
237
|
}
|
|
237
238
|
}
|
|
@@ -320,10 +321,13 @@ function defineFrameworkIntegration(spec) {
|
|
|
320
321
|
if (!(0, autotel_edge.shouldInstrumentPath)(extracted.path, toRouteAdapterOptions(options))) return buildSkippedHandle(spec, ctx, extracted, options);
|
|
321
322
|
return buildHandle(spec, ctx, traceCtx, options);
|
|
322
323
|
},
|
|
323
|
-
runTraced(ctx, options, handler) {
|
|
324
|
+
runTraced(ctx, options, handler, completion) {
|
|
324
325
|
const extracted = spec.extractRequest(ctx);
|
|
325
326
|
if (!(0, autotel_edge.shouldInstrumentPath)(extracted.path, toRouteAdapterOptions(options))) return handler(buildSkippedHandle(spec, ctx, extracted, options));
|
|
326
|
-
return (0, autotel.withTracing)({
|
|
327
|
+
return (0, autotel.withTracing)({
|
|
328
|
+
name: options?.spanName ?? resolveSpanName(spec, ctx, extracted),
|
|
329
|
+
isError: completion?.isError
|
|
330
|
+
})((traceCtx) => async () => {
|
|
327
331
|
return handler(buildHandle(spec, ctx, traceCtx, options ?? {}));
|
|
328
332
|
})();
|
|
329
333
|
}
|
|
@@ -409,4 +413,4 @@ Object.defineProperty(exports, 'toRouteAdapterOptions', {
|
|
|
409
413
|
return toRouteAdapterOptions;
|
|
410
414
|
}
|
|
411
415
|
});
|
|
412
|
-
//# sourceMappingURL=integration-
|
|
416
|
+
//# sourceMappingURL=integration-Cc8bXel_.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-Cc8bXel_.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 = (\n response.headers.get('content-type') ?? ''\n ).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 (\n response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')\n ) {\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(\n onError(new TypeError('stream is already locked')),\n ).catch((err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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 {\n createNoopRequestLogger,\n getRequestLogger,\n withTracing,\n} 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 /** Return false for framework control-flow throws that are not failures. */\n isError?: (error: unknown) => 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 completion?: Pick<IntegratedCompletionOptions, 'isError'>,\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 if (options?.isError?.(error) === false) {\n await handle.finish({});\n } else {\n await handle.finish({\n error: error instanceof Error ? error : new Error(String(error)),\n });\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, completion) {\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 // The wrapped factory is async, so the call always yields a Promise.\n return withTracing({ name: spanName, isError: completion?.isError })(\n (traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n },\n )() as ReturnType<typeof handler>;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ForkLifecycle, ForkLifecycle as ForkLifecycle$1, RequestLogSnapshot, RequestLogger, RequestLoggerOptions, TraceContext } from "autotel";
|
|
2
|
-
import { RouteFilterOptions, RouteServiceConfig, getServiceForPath, matchesRoutePattern, shouldInstrumentPath } from "autotel-edge";
|
|
3
2
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
|
+
import { RouteFilterOptions, RouteServiceConfig, getServiceForPath, matchesRoutePattern, shouldInstrumentPath } from "autotel-edge";
|
|
4
4
|
//#region src/toolkit/middleware.d.ts
|
|
5
5
|
type Awaitable<T> = T | Promise<T>;
|
|
6
6
|
interface RouteAdapterOptions {
|
|
@@ -64,6 +64,8 @@ interface ExtractedRequest {
|
|
|
64
64
|
}
|
|
65
65
|
interface IntegratedCompletionOptions {
|
|
66
66
|
autoEmit?: boolean;
|
|
67
|
+
/** Return false for framework control-flow throws that are not failures. */
|
|
68
|
+
isError?: (error: unknown) => boolean;
|
|
67
69
|
}
|
|
68
70
|
type TracedOptionInput = RouteAdapterOptions & {
|
|
69
71
|
requestLoggerOptions?: RequestLoggerOptions;
|
|
@@ -87,7 +89,7 @@ interface FrameworkRequestHandle extends MiddlewareLoggerResult {
|
|
|
87
89
|
}
|
|
88
90
|
interface FrameworkIntegrationHelpers<TCtx> {
|
|
89
91
|
begin: (traceCtx: TraceContext, ctx: TCtx, options?: FrameworkHandlerOptions) => FrameworkRequestHandle;
|
|
90
|
-
runTraced: <T>(ctx: TCtx, options: FrameworkHandlerOptions | undefined, handler: (handle: FrameworkRequestHandle) => Promise<T>) => Promise<T>;
|
|
92
|
+
runTraced: <T>(ctx: TCtx, options: FrameworkHandlerOptions | undefined, handler: (handle: FrameworkRequestHandle) => Promise<T>, completion?: Pick<IntegratedCompletionOptions, 'isError'>) => Promise<T>;
|
|
91
93
|
}
|
|
92
94
|
declare function applyLoggerEnrichment(logger: RequestLogger, ...attributeSets: Array<Record<string, unknown> | undefined | null>): void;
|
|
93
95
|
declare function completeIntegratedRequest<T>(handle: FrameworkRequestHandle, options: IntegratedCompletionOptions | undefined, result: T): Promise<T>;
|
|
@@ -97,4 +99,4 @@ declare function buildTracedOptions(options: TracedOptionInput | undefined, span
|
|
|
97
99
|
declare function defineFrameworkIntegration<TCtx>(spec: FrameworkIntegrationSpec<TCtx>): FrameworkIntegrationHelpers<TCtx>;
|
|
98
100
|
//#endregion
|
|
99
101
|
export { matchesRoutePattern as C, getServiceForPath as S, shouldInstrumentPath as T, RouteAdapterOptions as _, FrameworkRequestHandle as a, TailSamplingContext as b, buildTracedOptions as c, runWithIntegratedHandle as d, toRouteAdapterOptions as f, MiddlewareLoggerResult as g, MiddlewareLoggerOptions as h, FrameworkIntegrationSpec as i, completeIntegratedRequest as l, ForkLifecycle$1 as m, FrameworkHandlerOptions as n, IntegratedCompletionOptions as o, BaseAdapterOptions as p, FrameworkIntegrationHelpers as r, applyLoggerEnrichment as s, ExtractedRequest as t, defineFrameworkIntegration as u, RouteFilterOptions as v, mergeRequestLoggerOptions as w, createMiddlewareLogger as x, RouteServiceConfig as y };
|
|
100
|
-
//# sourceMappingURL=integration-
|
|
102
|
+
//# sourceMappingURL=integration-D_rlU8Nx.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-D_rlU8Nx.d.cts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":";;;;KAmBY,UAAU,KAAK,IAAI,QAAQ;UAKtB;EACf;EACA;EACA,SAAS,eAAe;EACxB,aAAa,SAAS;EACtB,QAAQ,KAAK,wBAAwB;EACrC,uBAAuB;;;KAIb,qBAAqB;UAEhB;EACf;EACA;EACA;EACA;EACA,SAAS;EACT;;UAGe,gCAAgC;EAC/C,YAAY;IACV,QAAQ;IACR;IACA;IACA;IACA;QACI;EACN;EACA;EACA;;UAGe;EACf,QAAQ;EACR,SAAS;IACP;IACA,QAAQ;IACR,YAAY;QACR,QAAQ;EACd,iBACE,UAAU,UACV;IAAS;IAAiB,YAAY;QACnC,QAAQ;EACb;;iBAUc,0BACd,MAAM,kCACN,aAAa,SAAS,4BACrB;;;;;iBAmFa,uBACd,QAAQ,eACR,SAAS,0BACR;;;UCjJc;EACf;EACA;EACA,UACI,UACA;IACE,IAAI;;EACV;;UAGe;EACf;;EAEA,WAAW;;KAGD,oBAAoB;EAC9B,uBAAuB;EACvB;;UAGe,gCAAgC;EAC/C;;UAGe,yBAAyB;EACxC;EACA,iBAAiB,KAAK,SAAS;EAC/B,eAAe,KAAK,MAAM,QAAQ;EAClC,UAAU,kBAAkB;EAC5B,gBAAgB;EAChB,oBACE,KAAK,WACA,SAAS;EAChB,sBAAsB,KAAK,MAAM,SAAS;;UAG3B,+BAA+B;EAC9C,mBAAmB;EACnB,UAAU,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;UAGnC,4BAA4B;EAC3C,QACE,UAAU,cACV,KAAK,MACL,UAAU,4BACP;EACL,YAAY,GACV,KAAK,MACL,SAAS,qCACT,UAAU,QAAQ,2BAA2B,QAAQ,IACrD,aAAa,KAAK,4CACf,QAAQ;;iBAGC,sBACd,QAAQ,kBACL,eAAe,MAAM;iBASJ,0BAA0B,GAC9C,QAAQ,wBACR,SAAS,yCACT,QAAQ,IACP,QAAQ;iBAaW,wBAAwB,GAC5C,QAAQ,wBACR,SAAS,yCACT,UAAU,IAAI,QAAQ,KACrB,QAAQ;iBAsBK,sBACd,UAAU,KACR,+BACM,gDAEP;iBAOa,mBACd,SAAS,+BACT,mBACC;iBA0Ga,2BAA2B,MACzC,MAAM,yBAAyB,QAC9B,4BAA4B"}
|
|
@@ -231,7 +231,8 @@ async function runWithIntegratedHandle(handle, options, fn) {
|
|
|
231
231
|
try {
|
|
232
232
|
return completeIntegratedRequest(handle, options, await handle.runWith(fn));
|
|
233
233
|
} catch (error) {
|
|
234
|
-
if (options?.autoEmit !== false)
|
|
234
|
+
if (options?.autoEmit !== false) if (options?.isError?.(error) === false) await handle.finish({});
|
|
235
|
+
else await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
|
|
235
236
|
throw error;
|
|
236
237
|
}
|
|
237
238
|
}
|
|
@@ -320,10 +321,13 @@ function defineFrameworkIntegration(spec) {
|
|
|
320
321
|
if (!shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))) return buildSkippedHandle(spec, ctx, extracted, options);
|
|
321
322
|
return buildHandle(spec, ctx, traceCtx, options);
|
|
322
323
|
},
|
|
323
|
-
runTraced(ctx, options, handler) {
|
|
324
|
+
runTraced(ctx, options, handler, completion) {
|
|
324
325
|
const extracted = spec.extractRequest(ctx);
|
|
325
326
|
if (!shouldInstrumentPath(extracted.path, toRouteAdapterOptions(options))) return handler(buildSkippedHandle(spec, ctx, extracted, options));
|
|
326
|
-
return withTracing({
|
|
327
|
+
return withTracing({
|
|
328
|
+
name: options?.spanName ?? resolveSpanName(spec, ctx, extracted),
|
|
329
|
+
isError: completion?.isError
|
|
330
|
+
})((traceCtx) => async () => {
|
|
327
331
|
return handler(buildHandle(spec, ctx, traceCtx, options ?? {}));
|
|
328
332
|
})();
|
|
329
333
|
}
|
|
@@ -332,4 +336,4 @@ function defineFrameworkIntegration(spec) {
|
|
|
332
336
|
|
|
333
337
|
//#endregion
|
|
334
338
|
export { runWithIntegratedHandle as a, createMiddlewareLogger as c, mergeRequestLoggerOptions as d, shouldInstrumentPath as f, extendDeferredDrain as g, shouldDeferEmitForResponse as h, defineFrameworkIntegration as i, getServiceForPath as l, isStreamingResponse as m, buildTracedOptions as n, toRouteAdapterOptions as o, bindStreamingResponseLifecycle as p, completeIntegratedRequest as r, attachForkToLogger as s, applyLoggerEnrichment as t, matchesRoutePattern as u };
|
|
335
|
-
//# sourceMappingURL=integration-
|
|
339
|
+
//# sourceMappingURL=integration-DvibHRzI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-DvibHRzI.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 = (\n response.headers.get('content-type') ?? ''\n ).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 (\n response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')\n ) {\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(\n onError(new TypeError('stream is already locked')),\n ).catch((err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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 {\n createNoopRequestLogger,\n getRequestLogger,\n withTracing,\n} 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 /** Return false for framework control-flow throws that are not failures. */\n isError?: (error: unknown) => 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 completion?: Pick<IntegratedCompletionOptions, 'isError'>,\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 if (options?.isError?.(error) === false) {\n await handle.finish({});\n } else {\n await handle.finish({\n error: error instanceof Error ? error : new Error(String(error)),\n });\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, completion) {\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 // The wrapped factory is async, so the call always yields a Promise.\n return withTracing({ name: spanName, isError: completion?.isError })(\n (traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n },\n )() as ReturnType<typeof handler>;\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/nestjs.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-Cc8bXel_.cjs');
|
|
3
3
|
const require_toolkit_storage = require('./toolkit/storage.cjs');
|
|
4
4
|
let autotel = require("autotel");
|
|
5
5
|
let rxjs = require("rxjs");
|
package/dist/nestjs.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { Observable } from "rxjs";
|
package/dist/nestjs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { Observable } from "rxjs";
|
package/dist/nestjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-
|
|
1
|
+
import { i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-DvibHRzI.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
import { Observable, from, isObservable } from "rxjs";
|
package/dist/next.cjs
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_integration = require('./integration-
|
|
2
|
+
const require_integration = require('./integration-Cc8bXel_.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");
|
|
6
|
+
let next_navigation_js = require("next/navigation.js");
|
|
6
7
|
|
|
7
8
|
//#region src/next.ts
|
|
9
|
+
/**
|
|
10
|
+
* Next navigation helpers throw internal values that the framework converts
|
|
11
|
+
* into responses. Delegate classification to Next itself so new signal types
|
|
12
|
+
* and signals wrapped in `cause` stay covered without duplicating its internals.
|
|
13
|
+
*/
|
|
14
|
+
function findNextControlFlowSignal(error) {
|
|
15
|
+
try {
|
|
16
|
+
(0, next_navigation_js.unstable_rethrow)(error);
|
|
17
|
+
return null;
|
|
18
|
+
} catch (signal) {
|
|
19
|
+
return signal;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isRealNextError(error) {
|
|
23
|
+
return findNextControlFlowSignal(error) === null;
|
|
24
|
+
}
|
|
8
25
|
const { storage: nextLoggerStorage, useLogger: storageUseLogger } = require_toolkit_storage.createLoggerStorage("request context. Wrap handlers with withAutotel() first.");
|
|
9
26
|
function enrichFromRequest(request) {
|
|
10
27
|
if (!request) return void 0;
|
|
@@ -59,10 +76,18 @@ function resolveSpanName(request, options) {
|
|
|
59
76
|
function withAutotel(handler, options) {
|
|
60
77
|
return async (...args) => {
|
|
61
78
|
const request = args[0];
|
|
62
|
-
|
|
79
|
+
const tracedOptions = require_integration.buildTracedOptions(options, resolveSpanName(request, options));
|
|
80
|
+
return integration.runTraced(request, tracedOptions, async (handle) => require_integration.runWithIntegratedHandle(handle, {
|
|
81
|
+
autoEmit: tracedOptions.autoEmit,
|
|
82
|
+
isError: isRealNextError
|
|
83
|
+
}, async () => {
|
|
63
84
|
require_integration.applyLoggerEnrichment(handle.logger, enrichFromRequest(request), options?.enrichRequest?.(request));
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
try {
|
|
86
|
+
return await handler(...args);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
throw findNextControlFlowSignal(error) ?? error;
|
|
89
|
+
}
|
|
90
|
+
}), { isError: isRealNextError });
|
|
66
91
|
};
|
|
67
92
|
}
|
|
68
93
|
|
package/dist/next.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.cjs","names":["createLoggerStorage","getHeader","createUseLogger","defineFrameworkIntegration","buildTracedOptions","runWithIntegratedHandle"],"sources":["../src/next.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n { get(name: string): string | null } | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\n spanName?: string | ((request?: NextRequestLike) => string);\n enrichRequest?: (\n request?: NextRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst { storage: nextLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Wrap handlers with withAutotel() first.',\n );\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n try {\n return storageUseLogger();\n } catch {\n return baseUseLogger(request, requestLoggerOptions);\n }\n}\n\nfunction resolvePath(request?: NextRequestLike): string {\n if (!request?.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nconst integration = defineFrameworkIntegration<NextRequestLike | undefined>({\n name: 'next',\n storage: nextLoggerStorage,\n extractRequest: (request) => ({\n method: request?.method ?? 'GET',\n path: resolvePath(request),\n headers: request?.headers,\n requestId: getHeader(request?.headers, 'x-request-id'),\n }),\n attachLogger: () => {},\n});\n\nfunction resolveSpanName(\n request: NextRequestLike | undefined,\n options?: NextWithAutotelOptions,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request);\n }\n return options?.spanName ?? 'next.request';\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n
|
|
1
|
+
{"version":3,"file":"next.cjs","names":["createLoggerStorage","getHeader","createUseLogger","defineFrameworkIntegration","buildTracedOptions","runWithIntegratedHandle"],"sources":["../src/next.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { unstable_rethrow as unstableRethrow } from 'next/navigation.js';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n { get(name: string): string | null } | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\n spanName?: string | ((request?: NextRequestLike) => string);\n enrichRequest?: (\n request?: NextRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\n/**\n * Next navigation helpers throw internal values that the framework converts\n * into responses. Delegate classification to Next itself so new signal types\n * and signals wrapped in `cause` stay covered without duplicating its internals.\n */\nfunction findNextControlFlowSignal(error: unknown): unknown | null {\n try {\n unstableRethrow(error);\n return null;\n } catch (signal) {\n return signal;\n }\n}\n\nfunction isRealNextError(error: unknown): boolean {\n return findNextControlFlowSignal(error) === null;\n}\n\nconst { storage: nextLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Wrap handlers with withAutotel() first.',\n );\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n try {\n return storageUseLogger();\n } catch {\n return baseUseLogger(request, requestLoggerOptions);\n }\n}\n\nfunction resolvePath(request?: NextRequestLike): string {\n if (!request?.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nconst integration = defineFrameworkIntegration<NextRequestLike | undefined>({\n name: 'next',\n storage: nextLoggerStorage,\n extractRequest: (request) => ({\n method: request?.method ?? 'GET',\n path: resolvePath(request),\n headers: request?.headers,\n requestId: getHeader(request?.headers, 'x-request-id'),\n }),\n attachLogger: () => {},\n});\n\nfunction resolveSpanName(\n request: NextRequestLike | undefined,\n options?: NextWithAutotelOptions,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request);\n }\n return options?.spanName ?? 'next.request';\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const tracedOptions = buildTracedOptions(\n options,\n resolveSpanName(request, options),\n );\n\n return integration.runTraced(\n request,\n tracedOptions,\n async (handle) =>\n runWithIntegratedHandle(\n handle,\n { autoEmit: tracedOptions.autoEmit, isError: isRealNextError },\n async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n options?.enrichRequest?.(request),\n );\n try {\n return await handler(...args);\n } catch (error) {\n const signal = findNextControlFlowSignal(error);\n throw signal ?? error;\n }\n },\n ),\n { isError: isRealNextError },\n );\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;;;;;;;AA2CA,SAAS,0BAA0B,OAAgC;CACjE,IAAI;EACF,yCAAgB,KAAK;EACrB,OAAO;CACT,SAAS,QAAQ;EACf,OAAO;CACT;AACF;AAEA,SAAS,gBAAgB,OAAyB;CAChD,OAAO,0BAA0B,KAAK,MAAM;AAC9C;AAEA,MAAM,EAAE,SAAS,mBAAmB,WAAW,qBAC7CA,4CACE,0DACF;AAEF,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,IAAI,QAAQ;CACZ,IAAI,QAAQ,KACV,IAAI;EACF,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC/B,QAAQ;EACN,QAAQ,QAAQ;CAClB;CAEF,MAAM,YAAYC,uBAAU,QAAQ,SAAS,cAAc;CAE3D,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,oCAAoC,UAAU,IAAI,CAAC;CACvE;AACF;AAEA,MAAM,gBAAgBC,6BAAiC;CACrD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI;EACF,OAAO,iBAAiB;CAC1B,QAAQ;EACN,OAAO,cAAc,SAAS,oBAAoB;CACpD;AACF;AAEA,SAAS,YAAY,SAAmC;CACtD,IAAI,CAAC,SAAS,KAAK,OAAO;CAC1B,IAAI;EACF,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC9B,QAAQ;EACN,OAAO,QAAQ;CACjB;AACF;AAEA,MAAM,cAAcC,+CAAwD;CAC1E,MAAM;CACN,SAAS;CACT,iBAAiB,aAAa;EAC5B,QAAQ,SAAS,UAAU;EAC3B,MAAM,YAAY,OAAO;EACzB,SAAS,SAAS;EAClB,WAAWF,uBAAU,SAAS,SAAS,cAAc;CACvD;CACA,oBAAoB,CAAC;AACvB,CAAC;AAED,SAAS,gBACP,SACA,SACQ;CACR,IAAI,OAAO,SAAS,aAAa,YAC/B,OAAO,QAAQ,SAAS,OAAO;CAEjC,OAAO,SAAS,YAAY;AAC9B;AAEA,SAAgB,YACd,SACA,SACsC;CACtC,OAAO,OAAO,GAAG,SAAkC;EACjD,MAAM,UAAU,KAAK;EACrB,MAAM,gBAAgBG,uCACpB,SACA,gBAAgB,SAAS,OAAO,CAClC;EAEA,OAAO,YAAY,UACjB,SACA,eACA,OAAO,WACLC,4CACE,QACA;GAAE,UAAU,cAAc;GAAU,SAAS;EAAgB,GAC7D,YAAY;GACV,0CACE,OAAO,QACP,kBAAkB,OAAO,GACzB,SAAS,gBAAgB,OAAO,CAClC;GACA,IAAI;IACF,OAAO,MAAM,QAAQ,GAAG,IAAI;GAC9B,SAAS,OAAO;IAEd,MADe,0BAA0B,KAC9B,KAAK;GAClB;EACF,CACF,GACF,EAAE,SAAS,gBAAgB,CAC7B;CACF;AACF"}
|
package/dist/next.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/next.d.ts
|
package/dist/next.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.d.cts","names":[],"sources":["../src/next.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"next.d.cts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAqBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;;UAG1B,+BAA+B,KAC9C;EAGA,sBAAsB,UAAU;EAChC,iBACE,UAAU,oBACP;;iBAsDS,UACd,UAAU,iBACV,uBAAuB,uBACtB;iBAuCa,YAAY,yBAAyB,SACnD,aAAa,MAAM,UAAU,UAAU,QAAQ,UAC/C,UAAU,6BACL,MAAM,UAAU,QAAQ"}
|
package/dist/next.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/next.d.ts
|
package/dist/next.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.d.ts","names":[],"sources":["../src/next.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"next.d.ts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAqBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;;UAG1B,+BAA+B,KAC9C;EAGA,sBAAsB,UAAU;EAChC,iBACE,UAAU,oBACP;;iBAsDS,UACd,UAAU,iBACV,uBAAuB,uBACtB;iBAuCa,YAAY,yBAAyB,SACnD,aAAa,MAAM,UAAU,UAAU,QAAQ,UAC/C,UAAU,6BACL,MAAM,UAAU,QAAQ"}
|
package/dist/next.js
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
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-DvibHRzI.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { createUseLogger, getHeader } from "./core.js";
|
|
4
4
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
5
|
+
import { unstable_rethrow } from "next/navigation.js";
|
|
5
6
|
|
|
6
7
|
//#region src/next.ts
|
|
8
|
+
/**
|
|
9
|
+
* Next navigation helpers throw internal values that the framework converts
|
|
10
|
+
* into responses. Delegate classification to Next itself so new signal types
|
|
11
|
+
* and signals wrapped in `cause` stay covered without duplicating its internals.
|
|
12
|
+
*/
|
|
13
|
+
function findNextControlFlowSignal(error) {
|
|
14
|
+
try {
|
|
15
|
+
unstable_rethrow(error);
|
|
16
|
+
return null;
|
|
17
|
+
} catch (signal) {
|
|
18
|
+
return signal;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function isRealNextError(error) {
|
|
22
|
+
return findNextControlFlowSignal(error) === null;
|
|
23
|
+
}
|
|
7
24
|
const { storage: nextLoggerStorage, useLogger: storageUseLogger } = createLoggerStorage("request context. Wrap handlers with withAutotel() first.");
|
|
8
25
|
function enrichFromRequest(request) {
|
|
9
26
|
if (!request) return void 0;
|
|
@@ -58,10 +75,18 @@ function resolveSpanName(request, options) {
|
|
|
58
75
|
function withAutotel(handler, options) {
|
|
59
76
|
return async (...args) => {
|
|
60
77
|
const request = args[0];
|
|
61
|
-
|
|
78
|
+
const tracedOptions = buildTracedOptions(options, resolveSpanName(request, options));
|
|
79
|
+
return integration.runTraced(request, tracedOptions, async (handle) => runWithIntegratedHandle(handle, {
|
|
80
|
+
autoEmit: tracedOptions.autoEmit,
|
|
81
|
+
isError: isRealNextError
|
|
82
|
+
}, async () => {
|
|
62
83
|
applyLoggerEnrichment(handle.logger, enrichFromRequest(request), options?.enrichRequest?.(request));
|
|
63
|
-
|
|
64
|
-
|
|
84
|
+
try {
|
|
85
|
+
return await handler(...args);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
throw findNextControlFlowSignal(error) ?? error;
|
|
88
|
+
}
|
|
89
|
+
}), { isError: isRealNextError });
|
|
65
90
|
};
|
|
66
91
|
}
|
|
67
92
|
|
package/dist/next.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.js","names":[],"sources":["../src/next.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n { get(name: string): string | null } | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\n spanName?: string | ((request?: NextRequestLike) => string);\n enrichRequest?: (\n request?: NextRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst { storage: nextLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Wrap handlers with withAutotel() first.',\n );\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n try {\n return storageUseLogger();\n } catch {\n return baseUseLogger(request, requestLoggerOptions);\n }\n}\n\nfunction resolvePath(request?: NextRequestLike): string {\n if (!request?.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nconst integration = defineFrameworkIntegration<NextRequestLike | undefined>({\n name: 'next',\n storage: nextLoggerStorage,\n extractRequest: (request) => ({\n method: request?.method ?? 'GET',\n path: resolvePath(request),\n headers: request?.headers,\n requestId: getHeader(request?.headers, 'x-request-id'),\n }),\n attachLogger: () => {},\n});\n\nfunction resolveSpanName(\n request: NextRequestLike | undefined,\n options?: NextWithAutotelOptions,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request);\n }\n return options?.spanName ?? 'next.request';\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n
|
|
1
|
+
{"version":3,"file":"next.js","names":[],"sources":["../src/next.ts"],"sourcesContent":["import {\n createDrainPipeline,\n parseError,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { unstable_rethrow as unstableRethrow } from 'next/navigation.js';\nimport {\n createUseLogger,\n getHeader,\n type FrameworkHandlerOptions,\n} from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n runWithIntegratedHandle,\n buildTracedOptions,\n} from './toolkit/integration';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n { get(name: string): string | null } | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions extends Omit<\n FrameworkHandlerOptions,\n 'spanName'\n> {\n spanName?: string | ((request?: NextRequestLike) => string);\n enrichRequest?: (\n request?: NextRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\n/**\n * Next navigation helpers throw internal values that the framework converts\n * into responses. Delegate classification to Next itself so new signal types\n * and signals wrapped in `cause` stay covered without duplicating its internals.\n */\nfunction findNextControlFlowSignal(error: unknown): unknown | null {\n try {\n unstableRethrow(error);\n return null;\n } catch (signal) {\n return signal;\n }\n}\n\nfunction isRealNextError(error: unknown): boolean {\n return findNextControlFlowSignal(error) === null;\n}\n\nconst { storage: nextLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Wrap handlers with withAutotel() first.',\n );\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n try {\n return storageUseLogger();\n } catch {\n return baseUseLogger(request, requestLoggerOptions);\n }\n}\n\nfunction resolvePath(request?: NextRequestLike): string {\n if (!request?.url) return '/';\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n}\n\nconst integration = defineFrameworkIntegration<NextRequestLike | undefined>({\n name: 'next',\n storage: nextLoggerStorage,\n extractRequest: (request) => ({\n method: request?.method ?? 'GET',\n path: resolvePath(request),\n headers: request?.headers,\n requestId: getHeader(request?.headers, 'x-request-id'),\n }),\n attachLogger: () => {},\n});\n\nfunction resolveSpanName(\n request: NextRequestLike | undefined,\n options?: NextWithAutotelOptions,\n): string {\n if (typeof options?.spanName === 'function') {\n return options.spanName(request);\n }\n return options?.spanName ?? 'next.request';\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const tracedOptions = buildTracedOptions(\n options,\n resolveSpanName(request, options),\n );\n\n return integration.runTraced(\n request,\n tracedOptions,\n async (handle) =>\n runWithIntegratedHandle(\n handle,\n { autoEmit: tracedOptions.autoEmit, isError: isRealNextError },\n async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n options?.enrichRequest?.(request),\n );\n try {\n return await handler(...args);\n } catch (error) {\n const signal = findNextControlFlowSignal(error);\n throw signal ?? error;\n }\n },\n ),\n { isError: isRealNextError },\n );\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;;;;;;AA2CA,SAAS,0BAA0B,OAAgC;CACjE,IAAI;EACF,iBAAgB,KAAK;EACrB,OAAO;CACT,SAAS,QAAQ;EACf,OAAO;CACT;AACF;AAEA,SAAS,gBAAgB,OAAyB;CAChD,OAAO,0BAA0B,KAAK,MAAM;AAC9C;AAEA,MAAM,EAAE,SAAS,mBAAmB,WAAW,qBAC7C,oBACE,0DACF;AAEF,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,IAAI,QAAQ;CACZ,IAAI,QAAQ,KACV,IAAI;EACF,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC/B,QAAQ;EACN,QAAQ,QAAQ;CAClB;CAEF,MAAM,YAAY,UAAU,QAAQ,SAAS,cAAc;CAE3D,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,oCAAoC,UAAU,IAAI,CAAC;CACvE;AACF;AAEA,MAAM,gBAAgB,gBAAiC;CACrD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,IAAI;EACF,OAAO,iBAAiB;CAC1B,QAAQ;EACN,OAAO,cAAc,SAAS,oBAAoB;CACpD;AACF;AAEA,SAAS,YAAY,SAAmC;CACtD,IAAI,CAAC,SAAS,KAAK,OAAO;CAC1B,IAAI;EACF,OAAO,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC9B,QAAQ;EACN,OAAO,QAAQ;CACjB;AACF;AAEA,MAAM,cAAc,2BAAwD;CAC1E,MAAM;CACN,SAAS;CACT,iBAAiB,aAAa;EAC5B,QAAQ,SAAS,UAAU;EAC3B,MAAM,YAAY,OAAO;EACzB,SAAS,SAAS;EAClB,WAAW,UAAU,SAAS,SAAS,cAAc;CACvD;CACA,oBAAoB,CAAC;AACvB,CAAC;AAED,SAAS,gBACP,SACA,SACQ;CACR,IAAI,OAAO,SAAS,aAAa,YAC/B,OAAO,QAAQ,SAAS,OAAO;CAEjC,OAAO,SAAS,YAAY;AAC9B;AAEA,SAAgB,YACd,SACA,SACsC;CACtC,OAAO,OAAO,GAAG,SAAkC;EACjD,MAAM,UAAU,KAAK;EACrB,MAAM,gBAAgB,mBACpB,SACA,gBAAgB,SAAS,OAAO,CAClC;EAEA,OAAO,YAAY,UACjB,SACA,eACA,OAAO,WACL,wBACE,QACA;GAAE,UAAU,cAAc;GAAU,SAAS;EAAgB,GAC7D,YAAY;GACV,sBACE,OAAO,QACP,kBAAkB,OAAO,GACzB,SAAS,gBAAgB,OAAO,CAClC;GACA,IAAI;IACF,OAAO,MAAM,QAAQ,GAAG,IAAI;GAC9B,SAAS,OAAO;IAEd,MADe,0BAA0B,KAC9B,KAAK;GAClB;EACF,CACF,GACF,EAAE,SAAS,gBAAgB,CAC7B;CACF;AACF"}
|
package/dist/nitro.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-Cc8bXel_.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/nitro.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/nitro.d.ts
|
package/dist/nitro.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/nitro.d.ts
|
package/dist/nitro.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-DvibHRzI.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { createUseLogger } from "./core.js";
|
|
4
4
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
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-Cc8bXel_.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,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-D_rlU8Nx.cjs";
|
|
2
2
|
import "./core.cjs";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/sveltekit.d.ts
|
package/dist/sveltekit.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as FrameworkHandlerOptions } from "./integration-
|
|
1
|
+
import { n as FrameworkHandlerOptions } from "./integration-BAs5uTiD.js";
|
|
2
2
|
import "./core.js";
|
|
3
3
|
import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
//#region src/sveltekit.d.ts
|
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-DvibHRzI.js";
|
|
2
2
|
import { createLoggerStorage } from "./toolkit/storage.js";
|
|
3
3
|
import { createDrainPipeline, createStructuredError, parseError } from "autotel";
|
|
4
4
|
|
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-Cc8bXel_.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,4 +1,4 @@
|
|
|
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-D_rlU8Nx.cjs";
|
|
2
2
|
import { createLoggerStorage, createStorageForkLifecycle } from "./storage.cjs";
|
|
3
3
|
import { ForkLifecycle as ForkLifecycle$1, RequestLogger } from "autotel";
|
|
4
4
|
//#region src/toolkit/deferred-drain.d.ts
|
package/dist/toolkit/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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-BAs5uTiD.js";
|
|
2
2
|
import { createLoggerStorage, createStorageForkLifecycle } from "./storage.js";
|
|
3
3
|
import { ForkLifecycle as ForkLifecycle$1, RequestLogger } from "autotel";
|
|
4
4
|
//#region src/toolkit/deferred-drain.d.ts
|
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-DvibHRzI.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 };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-adapters",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Framework adapters and composable DX helpers for autotel",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"README.md"
|
|
85
85
|
],
|
|
86
86
|
"dependencies": {
|
|
87
|
-
"autotel": "6.
|
|
87
|
+
"autotel": "6.1.0",
|
|
88
88
|
"autotel-edge": "4.0.1"
|
|
89
89
|
},
|
|
90
90
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-DI-1RuTh.d.cts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":";;;;KAmBY,UAAU,KAAK,IAAI,QAAQ;UAKtB;EACf;EACA;EACA,SAAS,eAAe;EACxB,aAAa,SAAS;EACtB,QAAQ,KAAK,wBAAwB;EACrC,uBAAuB;;;KAIb,qBAAqB;UAEhB;EACf;EACA;EACA;EACA;EACA,SAAS;EACT;;UAGe,gCAAgC;EAC/C,YAAY;IACV,QAAQ;IACR;IACA;IACA;IACA;QACI;EACN;EACA;EACA;;UAGe;EACf,QAAQ;EACR,SAAS;IACP;IACA,QAAQ;IACR,YAAY;QACR,QAAQ;EACd,iBACE,UAAU,UACV;IAAS;IAAiB,YAAY;QACnC,QAAQ;EACb;;iBAUc,0BACd,MAAM,kCACN,aAAa,SAAS,4BACrB;;;;;iBAmFa,uBACd,QAAQ,eACR,SAAS,0BACR;;;UCjJc;EACf;EACA;EACA,UACI,UACA;IACE,IAAI;;EACV;;UAGe;EACf;;KAGU,oBAAoB;EAC9B,uBAAuB;EACvB;;UAGe,gCAAgC;EAC/C;;UAGe,yBAAyB;EACxC;EACA,iBAAiB,KAAK,SAAS;EAC/B,eAAe,KAAK,MAAM,QAAQ;EAClC,UAAU,kBAAkB;EAC5B,gBAAgB;EAChB,oBACE,KAAK,WACA,SAAS;EAChB,sBAAsB,KAAK,MAAM,SAAS;;UAG3B,+BAA+B;EAC9C,mBAAmB;EACnB,UAAU,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;UAGnC,4BAA4B;EAC3C,QACE,UAAU,cACV,KAAK,MACL,UAAU,4BACP;EACL,YAAY,GACV,KAAK,MACL,SAAS,qCACT,UAAU,QAAQ,2BAA2B,QAAQ,OAClD,QAAQ;;iBAGC,sBACd,QAAQ,kBACL,eAAe,MAAM;iBASJ,0BAA0B,GAC9C,QAAQ,wBACR,SAAS,yCACT,QAAQ,IACP,QAAQ;iBAaW,wBAAwB,GAC5C,QAAQ,wBACR,SAAS,yCACT,UAAU,IAAI,QAAQ,KACrB,QAAQ;iBAkBK,sBACd,UAAU,KACR,+BACM,gDAEP;iBAOa,mBACd,SAAS,+BACT,mBACC;iBA0Ga,2BAA2B,MACzC,MAAM,yBAAyB,QAC9B,4BAA4B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-IUpfttGT.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 = (\n response.headers.get('content-type') ?? ''\n ).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 (\n response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')\n ) {\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(\n onError(new TypeError('stream is already locked')),\n ).catch((err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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 {\n createNoopRequestLogger,\n getRequestLogger,\n withTracing,\n} 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 // The wrapped factory is async, so the call always yields a Promise.\n return withTracing({ name: spanName })((traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n })() as ReturnType<typeof handler>;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-guh7BHTF.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 = (\n response.headers.get('content-type') ?? ''\n ).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 (\n response.headers.get('transfer-encoding')?.toLowerCase().includes('chunked')\n ) {\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(\n onError(new TypeError('stream is already locked')),\n ).catch((err: unknown) => {\n console.error('[autotel-adapters] stream error handling failed:', err);\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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(\n '[autotel-adapters] stream completion handling failed:',\n err,\n );\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 {\n createNoopRequestLogger,\n getRequestLogger,\n withTracing,\n} 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 // The wrapped factory is async, so the call always yields a Promise.\n return withTracing({ name: spanName })((traceCtx) => async () => {\n const handle = buildHandle(spec, ctx, traceCtx, options ?? {});\n return handler(handle);\n })() as ReturnType<typeof handler>;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration-rYoX8QLk.d.ts","names":[],"sources":["../src/toolkit/middleware.ts","../src/toolkit/integration.ts"],"mappings":";;;;KAmBY,UAAU,KAAK,IAAI,QAAQ;UAKtB;EACf;EACA;EACA,SAAS,eAAe;EACxB,aAAa,SAAS;EACtB,QAAQ,KAAK,wBAAwB;EACrC,uBAAuB;;;KAIb,qBAAqB;UAEhB;EACf;EACA;EACA;EACA;EACA,SAAS;EACT;;UAGe,gCAAgC;EAC/C,YAAY;IACV,QAAQ;IACR;IACA;IACA;IACA;QACI;EACN;EACA;EACA;;UAGe;EACf,QAAQ;EACR,SAAS;IACP;IACA,QAAQ;IACR,YAAY;QACR,QAAQ;EACd,iBACE,UAAU,UACV;IAAS;IAAiB,YAAY;QACnC,QAAQ;EACb;;iBAUc,0BACd,MAAM,kCACN,aAAa,SAAS,4BACrB;;;;;iBAmFa,uBACd,QAAQ,eACR,SAAS,0BACR;;;UCjJc;EACf;EACA;EACA,UACI,UACA;IACE,IAAI;;EACV;;UAGe;EACf;;KAGU,oBAAoB;EAC9B,uBAAuB;EACvB;;UAGe,gCAAgC;EAC/C;;UAGe,yBAAyB;EACxC;EACA,iBAAiB,KAAK,SAAS;EAC/B,eAAe,KAAK,MAAM,QAAQ;EAClC,UAAU,kBAAkB;EAC5B,gBAAgB;EAChB,oBACE,KAAK,WACA,SAAS;EAChB,sBAAsB,KAAK,MAAM,SAAS;;UAG3B,+BAA+B;EAC9C,mBAAmB;EACnB,UAAU,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;UAGnC,4BAA4B;EAC3C,QACE,UAAU,cACV,KAAK,MACL,UAAU,4BACP;EACL,YAAY,GACV,KAAK,MACL,SAAS,qCACT,UAAU,QAAQ,2BAA2B,QAAQ,OAClD,QAAQ;;iBAGC,sBACd,QAAQ,kBACL,eAAe,MAAM;iBASJ,0BAA0B,GAC9C,QAAQ,wBACR,SAAS,yCACT,QAAQ,IACP,QAAQ;iBAaW,wBAAwB,GAC5C,QAAQ,wBACR,SAAS,yCACT,UAAU,IAAI,QAAQ,KACrB,QAAQ;iBAkBK,sBACd,UAAU,KACR,+BACM,gDAEP;iBAOa,mBACd,SAAS,+BACT,mBACC;iBA0Ga,2BAA2B,MACzC,MAAM,yBAAyB,QAC9B,4BAA4B"}
|