autotel-adapters 0.3.19 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +13 -0
  2. package/dist/cloudflare.cjs +44 -29
  3. package/dist/cloudflare.cjs.map +1 -1
  4. package/dist/cloudflare.d.cts +11 -17
  5. package/dist/cloudflare.d.cts.map +1 -1
  6. package/dist/cloudflare.d.ts +11 -17
  7. package/dist/cloudflare.d.ts.map +1 -1
  8. package/dist/cloudflare.js +47 -30
  9. package/dist/cloudflare.js.map +1 -1
  10. package/dist/core.cjs +7 -11
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +7 -11
  13. package/dist/core.d.cts.map +1 -1
  14. package/dist/core.d.ts +6 -10
  15. package/dist/core.d.ts.map +1 -1
  16. package/dist/core.js +7 -12
  17. package/dist/core.js.map +1 -1
  18. package/dist/elysia.cjs +50 -0
  19. package/dist/elysia.cjs.map +1 -0
  20. package/dist/elysia.d.cts +18 -0
  21. package/dist/elysia.d.cts.map +1 -0
  22. package/dist/elysia.d.ts +18 -0
  23. package/dist/elysia.d.ts.map +1 -0
  24. package/dist/elysia.js +44 -0
  25. package/dist/elysia.js.map +1 -0
  26. package/dist/express.cjs +5 -16
  27. package/dist/express.cjs.map +1 -1
  28. package/dist/express.d.cts +6 -15
  29. package/dist/express.d.cts.map +1 -1
  30. package/dist/express.d.ts +6 -15
  31. package/dist/express.d.ts.map +1 -1
  32. package/dist/express.js +7 -16
  33. package/dist/express.js.map +1 -1
  34. package/dist/fastify.cjs +5 -16
  35. package/dist/fastify.cjs.map +1 -1
  36. package/dist/fastify.d.cts +6 -15
  37. package/dist/fastify.d.cts.map +1 -1
  38. package/dist/fastify.d.ts +6 -15
  39. package/dist/fastify.d.ts.map +1 -1
  40. package/dist/fastify.js +7 -16
  41. package/dist/fastify.js.map +1 -1
  42. package/dist/hono.cjs +52 -11
  43. package/dist/hono.cjs.map +1 -1
  44. package/dist/hono.d.cts +12 -5
  45. package/dist/hono.d.cts.map +1 -1
  46. package/dist/hono.d.ts +12 -5
  47. package/dist/hono.d.ts.map +1 -1
  48. package/dist/hono.js +49 -12
  49. package/dist/hono.js.map +1 -1
  50. package/dist/index.cjs +14 -9
  51. package/dist/index.d.cts +12 -9
  52. package/dist/index.d.ts +12 -9
  53. package/dist/index.js +12 -9
  54. package/dist/integration-DI-1RuTh.d.cts +100 -0
  55. package/dist/integration-DI-1RuTh.d.cts.map +1 -0
  56. package/dist/integration-IUpfttGT.js +335 -0
  57. package/dist/integration-IUpfttGT.js.map +1 -0
  58. package/dist/integration-guh7BHTF.cjs +412 -0
  59. package/dist/integration-guh7BHTF.cjs.map +1 -0
  60. package/dist/integration-rYoX8QLk.d.ts +100 -0
  61. package/dist/integration-rYoX8QLk.d.ts.map +1 -0
  62. package/dist/nestjs.cjs +119 -0
  63. package/dist/nestjs.cjs.map +1 -0
  64. package/dist/nestjs.d.cts +42 -0
  65. package/dist/nestjs.d.cts.map +1 -0
  66. package/dist/nestjs.d.ts +42 -0
  67. package/dist/nestjs.d.ts.map +1 -0
  68. package/dist/nestjs.js +114 -0
  69. package/dist/nestjs.js.map +1 -0
  70. package/dist/next.cjs +35 -33
  71. package/dist/next.cjs.map +1 -1
  72. package/dist/next.d.cts +6 -17
  73. package/dist/next.d.cts.map +1 -1
  74. package/dist/next.d.ts +6 -17
  75. package/dist/next.d.ts.map +1 -1
  76. package/dist/next.js +38 -34
  77. package/dist/next.js.map +1 -1
  78. package/dist/nitro.cjs +33 -41
  79. package/dist/nitro.cjs.map +1 -1
  80. package/dist/nitro.d.cts +6 -17
  81. package/dist/nitro.d.cts.map +1 -1
  82. package/dist/nitro.d.ts +6 -17
  83. package/dist/nitro.d.ts.map +1 -1
  84. package/dist/nitro.js +33 -42
  85. package/dist/nitro.js.map +1 -1
  86. package/dist/sveltekit.cjs +48 -0
  87. package/dist/sveltekit.cjs.map +1 -0
  88. package/dist/sveltekit.d.cts +24 -0
  89. package/dist/sveltekit.d.cts.map +1 -0
  90. package/dist/sveltekit.d.ts +24 -0
  91. package/dist/sveltekit.d.ts.map +1 -0
  92. package/dist/sveltekit.js +43 -0
  93. package/dist/sveltekit.js.map +1 -0
  94. package/dist/tanstack.cjs +0 -8
  95. package/dist/tanstack.cjs.map +1 -1
  96. package/dist/tanstack.d.cts +1 -7
  97. package/dist/tanstack.d.cts.map +1 -1
  98. package/dist/tanstack.d.ts +1 -7
  99. package/dist/tanstack.d.ts.map +1 -1
  100. package/dist/tanstack.js +2 -9
  101. package/dist/tanstack.js.map +1 -1
  102. package/dist/toolkit/index.cjs +23 -0
  103. package/dist/toolkit/index.d.cts +42 -0
  104. package/dist/toolkit/index.d.cts.map +1 -0
  105. package/dist/toolkit/index.d.ts +42 -0
  106. package/dist/toolkit/index.d.ts.map +1 -0
  107. package/dist/toolkit/index.js +4 -0
  108. package/dist/toolkit/storage.cjs +35 -0
  109. package/dist/toolkit/storage.cjs.map +1 -0
  110. package/dist/toolkit/storage.d.cts +20 -0
  111. package/dist/toolkit/storage.d.cts.map +1 -0
  112. package/dist/toolkit/storage.d.ts +20 -0
  113. package/dist/toolkit/storage.d.ts.map +1 -0
  114. package/dist/toolkit/storage.js +33 -0
  115. package/dist/toolkit/storage.js.map +1 -0
  116. package/package.json +39 -8
  117. package/skills/autotel-adapters/SKILL.md +42 -34
@@ -0,0 +1,119 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_integration = require('./integration-guh7BHTF.cjs');
3
+ const require_toolkit_storage = require('./toolkit/storage.cjs');
4
+ let autotel = require("autotel");
5
+ let rxjs = require("rxjs");
6
+
7
+ //#region src/nestjs.ts
8
+ const { storage: nestLoggerStorage, useLogger: storageUseLogger } = require_toolkit_storage.createLoggerStorage("request context. Register AutotelInterceptor globally or on controllers.");
9
+ function enrichFromRequest(request) {
10
+ if (!request) return void 0;
11
+ const url = request.originalUrl ?? request.url;
12
+ const route = request.path ?? url;
13
+ return {
14
+ ...request.method ? { "http.request.method": request.method } : {},
15
+ ...url ? { "url.full": url } : {},
16
+ ...route ? { "http.route": route } : {}
17
+ };
18
+ }
19
+ const integration = require_integration.defineFrameworkIntegration({
20
+ name: "nestjs",
21
+ storage: nestLoggerStorage,
22
+ extractRequest: (executionCtx) => {
23
+ const request = executionCtx.switchToHttp().getRequest();
24
+ const path = request.path ?? request.originalUrl ?? request.url ?? "/";
25
+ return {
26
+ method: request.method ?? "GET",
27
+ path,
28
+ headers: request.headers
29
+ };
30
+ },
31
+ attachLogger: () => {},
32
+ spanName: (executionCtx) => {
33
+ const handler = executionCtx.getHandler().name;
34
+ return `nestjs.${executionCtx.getClass().name}.${handler}`;
35
+ }
36
+ });
37
+ function useLogger() {
38
+ return storageUseLogger();
39
+ }
40
+ var AutotelInterceptor = class {
41
+ options;
42
+ constructor(options = {}) {
43
+ this.options = options;
44
+ }
45
+ intercept(executionCtx, next) {
46
+ return new rxjs.Observable((subscriber) => {
47
+ let sourceSubscription;
48
+ let cancelled = false;
49
+ let cancelRun;
50
+ integration.runTraced(executionCtx, this.options, async (handle) => {
51
+ if (!handle.skipped) {
52
+ const request = executionCtx.switchToHttp().getRequest();
53
+ require_integration.applyLoggerEnrichment(handle.logger, enrichFromRequest(request), this.options.enrichRequest?.(request));
54
+ }
55
+ await handle.runWith(() => new Promise((resolve, reject) => {
56
+ let settled = false;
57
+ const settle = async (error) => {
58
+ if (settled) return;
59
+ settled = true;
60
+ try {
61
+ if (!handle.skipped && this.options.autoEmit !== false) if (error !== void 0) await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
62
+ else {
63
+ const response = executionCtx.switchToHttp().getResponse();
64
+ await handle.finish({ status: response.statusCode });
65
+ }
66
+ } catch (finishError) {
67
+ reject(finishError);
68
+ return;
69
+ }
70
+ if (error !== void 0) reject(error);
71
+ else resolve();
72
+ };
73
+ cancelRun = () => {
74
+ settle();
75
+ };
76
+ let source;
77
+ try {
78
+ source = next.handle();
79
+ } catch (error) {
80
+ settle(error);
81
+ return;
82
+ }
83
+ sourceSubscription = ((0, rxjs.isObservable)(source) ? source : (0, rxjs.from)(Promise.resolve(source))).subscribe({
84
+ next: (value) => {
85
+ if (!cancelled) subscriber.next(value);
86
+ },
87
+ error: (error) => {
88
+ settle(error);
89
+ },
90
+ complete: () => {
91
+ settle();
92
+ }
93
+ });
94
+ if (cancelled) {
95
+ sourceSubscription.unsubscribe();
96
+ cancelRun();
97
+ }
98
+ }));
99
+ }).then(() => {
100
+ if (!cancelled) subscriber.complete();
101
+ }, (error) => {
102
+ if (!cancelled) subscriber.error(error);
103
+ });
104
+ return () => {
105
+ cancelled = true;
106
+ sourceSubscription?.unsubscribe();
107
+ cancelRun?.();
108
+ };
109
+ });
110
+ }
111
+ };
112
+
113
+ //#endregion
114
+ exports.AutotelInterceptor = AutotelInterceptor;
115
+ exports.createDrainPipeline = autotel.createDrainPipeline;
116
+ exports.createStructuredError = autotel.createStructuredError;
117
+ exports.parseError = autotel.parseError;
118
+ exports.useLogger = useLogger;
119
+ //# sourceMappingURL=nestjs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.cjs","names":["createLoggerStorage","defineFrameworkIntegration","Observable"],"sources":["../src/nestjs.ts"],"sourcesContent":["import { from, isObservable, Observable, type Subscription } from 'rxjs';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n type ExtractedRequest,\n} from './toolkit/integration';\n\nexport interface NestExecutionContextLike {\n getClass: () => { name: string };\n getHandler: () => { name: string };\n getType: () => string;\n switchToHttp: () => {\n getRequest: () => NestRequestLike;\n getResponse: () => NestResponseLike;\n };\n}\n\nexport interface NestRequestLike {\n method?: string;\n url?: string;\n originalUrl?: string;\n path?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface NestResponseLike {\n statusCode?: number;\n}\n\nexport interface NestWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (\n request: NestRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst { storage: nestLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Register AutotelInterceptor globally or on controllers.',\n );\n\nfunction enrichFromRequest(\n request?: NestRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.path ?? url;\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n };\n}\n\nconst integration = defineFrameworkIntegration<NestExecutionContextLike>({\n name: 'nestjs',\n storage: nestLoggerStorage,\n extractRequest: (executionCtx) => {\n const request = executionCtx.switchToHttp().getRequest();\n const path = request.path ?? request.originalUrl ?? request.url ?? '/';\n return {\n method: request.method ?? 'GET',\n path,\n headers: request.headers,\n } satisfies ExtractedRequest;\n },\n attachLogger: () => {},\n spanName: (executionCtx) => {\n const handler = executionCtx.getHandler().name;\n const controller = executionCtx.getClass().name;\n return `nestjs.${controller}.${handler}`;\n },\n});\n\nexport function useLogger(): RequestLogger {\n return storageUseLogger();\n}\n\nexport class AutotelInterceptor {\n constructor(public readonly options: NestWithAutotelOptions = {}) {}\n\n intercept(\n executionCtx: NestExecutionContextLike,\n next: { handle: () => unknown },\n ): Observable<unknown> {\n // Nest handlers are lazy Observables. Subscribe inside the trace + ALS\n // scope, but proxy values as they arrive so multi-value and streaming\n // handlers retain their normal semantics.\n return new Observable((subscriber) => {\n let sourceSubscription: Subscription | undefined;\n let cancelled = false;\n let cancelRun: (() => void) | undefined;\n\n const run = integration.runTraced(\n executionCtx,\n this.options,\n async (handle) => {\n if (!handle.skipped) {\n const request = executionCtx.switchToHttp().getRequest();\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n this.options.enrichRequest?.(request),\n );\n }\n\n await handle.runWith(\n () =>\n new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const settle = async (error?: unknown) => {\n if (settled) return;\n settled = true;\n\n try {\n if (!handle.skipped && this.options.autoEmit !== false) {\n if (error !== undefined) {\n await handle.finish({\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n });\n } else {\n const response = executionCtx\n .switchToHttp()\n .getResponse();\n await handle.finish({ status: response.statusCode });\n }\n }\n } catch (finishError) {\n reject(finishError);\n return;\n }\n\n if (error !== undefined) reject(error);\n else resolve();\n };\n\n cancelRun = () => {\n void settle();\n };\n\n let source: unknown;\n try {\n source = next.handle();\n } catch (error) {\n void settle(error);\n return;\n }\n\n const observable = isObservable(source)\n ? source\n : from(Promise.resolve(source));\n sourceSubscription = observable.subscribe({\n next: (value) => {\n if (!cancelled) subscriber.next(value);\n },\n error: (error) => {\n void settle(error);\n },\n complete: () => {\n void settle();\n },\n });\n\n if (cancelled) {\n sourceSubscription.unsubscribe();\n cancelRun();\n }\n }),\n );\n },\n );\n\n void run.then(\n () => {\n if (!cancelled) subscriber.complete();\n },\n (error: unknown) => {\n if (!cancelled) subscriber.error(error);\n },\n );\n\n return () => {\n cancelled = true;\n sourceSubscription?.unsubscribe();\n cancelRun?.();\n };\n });\n }\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { n as FrameworkHandlerOptions } from "./integration-DI-1RuTh.cjs";
2
+ import "./core.cjs";
3
+ import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
4
+ import { Observable } from "rxjs";
5
+ //#region src/nestjs.d.ts
6
+ interface NestExecutionContextLike {
7
+ getClass: () => {
8
+ name: string;
9
+ };
10
+ getHandler: () => {
11
+ name: string;
12
+ };
13
+ getType: () => string;
14
+ switchToHttp: () => {
15
+ getRequest: () => NestRequestLike;
16
+ getResponse: () => NestResponseLike;
17
+ };
18
+ }
19
+ interface NestRequestLike {
20
+ method?: string;
21
+ url?: string;
22
+ originalUrl?: string;
23
+ path?: string;
24
+ headers?: Record<string, string | string[] | undefined>;
25
+ }
26
+ interface NestResponseLike {
27
+ statusCode?: number;
28
+ }
29
+ interface NestWithAutotelOptions extends FrameworkHandlerOptions {
30
+ enrichRequest?: (request: NestRequestLike) => Record<string, unknown> | undefined;
31
+ }
32
+ declare function useLogger(): RequestLogger;
33
+ declare class AutotelInterceptor {
34
+ readonly options: NestWithAutotelOptions;
35
+ constructor(options?: NestWithAutotelOptions);
36
+ intercept(executionCtx: NestExecutionContextLike, next: {
37
+ handle: () => unknown;
38
+ }): Observable<unknown>;
39
+ }
40
+ //#endregion
41
+ export { AutotelInterceptor, NestExecutionContextLike, NestRequestLike, NestResponseLike, NestWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger };
42
+ //# sourceMappingURL=nestjs.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.d.cts","names":[],"sources":["../src/nestjs.ts"],"mappings":";;;;;UAeiB;EACf;IAAkB;;EAClB;IAAoB;;EACpB;EACA;IACE,kBAAkB;IAClB,mBAAmB;;;UAIN;EACf;EACA;EACA;EACA;EACA,UAAU;;UAGK;EACf;;UAGe,+BAA+B;EAC9C,iBACE,SAAS,oBACN;;iBA2CS,aAAa;cAIhB;WACiB,SAAS;EAAT,YAAA,UAAS;EAErC,UACE,cAAc,0BACd;IAAQ;MACP"}
@@ -0,0 +1,42 @@
1
+ import { n as FrameworkHandlerOptions } from "./integration-rYoX8QLk.js";
2
+ import "./core.js";
3
+ import { RequestLogger, createDrainPipeline, createStructuredError, parseError } from "autotel";
4
+ import { Observable } from "rxjs";
5
+ //#region src/nestjs.d.ts
6
+ interface NestExecutionContextLike {
7
+ getClass: () => {
8
+ name: string;
9
+ };
10
+ getHandler: () => {
11
+ name: string;
12
+ };
13
+ getType: () => string;
14
+ switchToHttp: () => {
15
+ getRequest: () => NestRequestLike;
16
+ getResponse: () => NestResponseLike;
17
+ };
18
+ }
19
+ interface NestRequestLike {
20
+ method?: string;
21
+ url?: string;
22
+ originalUrl?: string;
23
+ path?: string;
24
+ headers?: Record<string, string | string[] | undefined>;
25
+ }
26
+ interface NestResponseLike {
27
+ statusCode?: number;
28
+ }
29
+ interface NestWithAutotelOptions extends FrameworkHandlerOptions {
30
+ enrichRequest?: (request: NestRequestLike) => Record<string, unknown> | undefined;
31
+ }
32
+ declare function useLogger(): RequestLogger;
33
+ declare class AutotelInterceptor {
34
+ readonly options: NestWithAutotelOptions;
35
+ constructor(options?: NestWithAutotelOptions);
36
+ intercept(executionCtx: NestExecutionContextLike, next: {
37
+ handle: () => unknown;
38
+ }): Observable<unknown>;
39
+ }
40
+ //#endregion
41
+ export { AutotelInterceptor, NestExecutionContextLike, NestRequestLike, NestResponseLike, NestWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger };
42
+ //# sourceMappingURL=nestjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.d.ts","names":[],"sources":["../src/nestjs.ts"],"mappings":";;;;;UAeiB;EACf;IAAkB;;EAClB;IAAoB;;EACpB;EACA;IACE,kBAAkB;IAClB,mBAAmB;;;UAIN;EACf;EACA;EACA;EACA;EACA,UAAU;;UAGK;EACf;;UAGe,+BAA+B;EAC9C,iBACE,SAAS,oBACN;;iBA2CS,aAAa;cAIhB;WACiB,SAAS;EAAT,YAAA,UAAS;EAErC,UACE,cAAc,0BACd;IAAQ;MACP"}
package/dist/nestjs.js ADDED
@@ -0,0 +1,114 @@
1
+ import { i as defineFrameworkIntegration, t as applyLoggerEnrichment } from "./integration-IUpfttGT.js";
2
+ import { createLoggerStorage } from "./toolkit/storage.js";
3
+ import { createDrainPipeline, createStructuredError, parseError } from "autotel";
4
+ import { Observable, from, isObservable } from "rxjs";
5
+
6
+ //#region src/nestjs.ts
7
+ const { storage: nestLoggerStorage, useLogger: storageUseLogger } = createLoggerStorage("request context. Register AutotelInterceptor globally or on controllers.");
8
+ function enrichFromRequest(request) {
9
+ if (!request) return void 0;
10
+ const url = request.originalUrl ?? request.url;
11
+ const route = request.path ?? url;
12
+ return {
13
+ ...request.method ? { "http.request.method": request.method } : {},
14
+ ...url ? { "url.full": url } : {},
15
+ ...route ? { "http.route": route } : {}
16
+ };
17
+ }
18
+ const integration = defineFrameworkIntegration({
19
+ name: "nestjs",
20
+ storage: nestLoggerStorage,
21
+ extractRequest: (executionCtx) => {
22
+ const request = executionCtx.switchToHttp().getRequest();
23
+ const path = request.path ?? request.originalUrl ?? request.url ?? "/";
24
+ return {
25
+ method: request.method ?? "GET",
26
+ path,
27
+ headers: request.headers
28
+ };
29
+ },
30
+ attachLogger: () => {},
31
+ spanName: (executionCtx) => {
32
+ const handler = executionCtx.getHandler().name;
33
+ return `nestjs.${executionCtx.getClass().name}.${handler}`;
34
+ }
35
+ });
36
+ function useLogger() {
37
+ return storageUseLogger();
38
+ }
39
+ var AutotelInterceptor = class {
40
+ options;
41
+ constructor(options = {}) {
42
+ this.options = options;
43
+ }
44
+ intercept(executionCtx, next) {
45
+ return new Observable((subscriber) => {
46
+ let sourceSubscription;
47
+ let cancelled = false;
48
+ let cancelRun;
49
+ integration.runTraced(executionCtx, this.options, async (handle) => {
50
+ if (!handle.skipped) {
51
+ const request = executionCtx.switchToHttp().getRequest();
52
+ applyLoggerEnrichment(handle.logger, enrichFromRequest(request), this.options.enrichRequest?.(request));
53
+ }
54
+ await handle.runWith(() => new Promise((resolve, reject) => {
55
+ let settled = false;
56
+ const settle = async (error) => {
57
+ if (settled) return;
58
+ settled = true;
59
+ try {
60
+ if (!handle.skipped && this.options.autoEmit !== false) if (error !== void 0) await handle.finish({ error: error instanceof Error ? error : new Error(String(error)) });
61
+ else {
62
+ const response = executionCtx.switchToHttp().getResponse();
63
+ await handle.finish({ status: response.statusCode });
64
+ }
65
+ } catch (finishError) {
66
+ reject(finishError);
67
+ return;
68
+ }
69
+ if (error !== void 0) reject(error);
70
+ else resolve();
71
+ };
72
+ cancelRun = () => {
73
+ settle();
74
+ };
75
+ let source;
76
+ try {
77
+ source = next.handle();
78
+ } catch (error) {
79
+ settle(error);
80
+ return;
81
+ }
82
+ sourceSubscription = (isObservable(source) ? source : from(Promise.resolve(source))).subscribe({
83
+ next: (value) => {
84
+ if (!cancelled) subscriber.next(value);
85
+ },
86
+ error: (error) => {
87
+ settle(error);
88
+ },
89
+ complete: () => {
90
+ settle();
91
+ }
92
+ });
93
+ if (cancelled) {
94
+ sourceSubscription.unsubscribe();
95
+ cancelRun();
96
+ }
97
+ }));
98
+ }).then(() => {
99
+ if (!cancelled) subscriber.complete();
100
+ }, (error) => {
101
+ if (!cancelled) subscriber.error(error);
102
+ });
103
+ return () => {
104
+ cancelled = true;
105
+ sourceSubscription?.unsubscribe();
106
+ cancelRun?.();
107
+ };
108
+ });
109
+ }
110
+ };
111
+
112
+ //#endregion
113
+ export { AutotelInterceptor, createDrainPipeline, createStructuredError, parseError, useLogger };
114
+ //# sourceMappingURL=nestjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.js","names":[],"sources":["../src/nestjs.ts"],"sourcesContent":["import { from, isObservable, Observable, type Subscription } from 'rxjs';\nimport {\n createDrainPipeline,\n createStructuredError,\n parseError,\n type RequestLogger,\n} from 'autotel';\nimport type { FrameworkHandlerOptions } from './core';\nimport { createLoggerStorage } from './toolkit/storage';\nimport {\n applyLoggerEnrichment,\n defineFrameworkIntegration,\n type ExtractedRequest,\n} from './toolkit/integration';\n\nexport interface NestExecutionContextLike {\n getClass: () => { name: string };\n getHandler: () => { name: string };\n getType: () => string;\n switchToHttp: () => {\n getRequest: () => NestRequestLike;\n getResponse: () => NestResponseLike;\n };\n}\n\nexport interface NestRequestLike {\n method?: string;\n url?: string;\n originalUrl?: string;\n path?: string;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nexport interface NestResponseLike {\n statusCode?: number;\n}\n\nexport interface NestWithAutotelOptions extends FrameworkHandlerOptions {\n enrichRequest?: (\n request: NestRequestLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst { storage: nestLoggerStorage, useLogger: storageUseLogger } =\n createLoggerStorage(\n 'request context. Register AutotelInterceptor globally or on controllers.',\n );\n\nfunction enrichFromRequest(\n request?: NestRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n const url = request.originalUrl ?? request.url;\n const route = request.path ?? url;\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(url ? { 'url.full': url } : {}),\n ...(route ? { 'http.route': route } : {}),\n };\n}\n\nconst integration = defineFrameworkIntegration<NestExecutionContextLike>({\n name: 'nestjs',\n storage: nestLoggerStorage,\n extractRequest: (executionCtx) => {\n const request = executionCtx.switchToHttp().getRequest();\n const path = request.path ?? request.originalUrl ?? request.url ?? '/';\n return {\n method: request.method ?? 'GET',\n path,\n headers: request.headers,\n } satisfies ExtractedRequest;\n },\n attachLogger: () => {},\n spanName: (executionCtx) => {\n const handler = executionCtx.getHandler().name;\n const controller = executionCtx.getClass().name;\n return `nestjs.${controller}.${handler}`;\n },\n});\n\nexport function useLogger(): RequestLogger {\n return storageUseLogger();\n}\n\nexport class AutotelInterceptor {\n constructor(public readonly options: NestWithAutotelOptions = {}) {}\n\n intercept(\n executionCtx: NestExecutionContextLike,\n next: { handle: () => unknown },\n ): Observable<unknown> {\n // Nest handlers are lazy Observables. Subscribe inside the trace + ALS\n // scope, but proxy values as they arrive so multi-value and streaming\n // handlers retain their normal semantics.\n return new Observable((subscriber) => {\n let sourceSubscription: Subscription | undefined;\n let cancelled = false;\n let cancelRun: (() => void) | undefined;\n\n const run = integration.runTraced(\n executionCtx,\n this.options,\n async (handle) => {\n if (!handle.skipped) {\n const request = executionCtx.switchToHttp().getRequest();\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n this.options.enrichRequest?.(request),\n );\n }\n\n await handle.runWith(\n () =>\n new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const settle = async (error?: unknown) => {\n if (settled) return;\n settled = true;\n\n try {\n if (!handle.skipped && this.options.autoEmit !== false) {\n if (error !== undefined) {\n await handle.finish({\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n });\n } else {\n const response = executionCtx\n .switchToHttp()\n .getResponse();\n await handle.finish({ status: response.statusCode });\n }\n }\n } catch (finishError) {\n reject(finishError);\n return;\n }\n\n if (error !== undefined) reject(error);\n else resolve();\n };\n\n cancelRun = () => {\n void settle();\n };\n\n let source: unknown;\n try {\n source = next.handle();\n } catch (error) {\n void settle(error);\n return;\n }\n\n const observable = isObservable(source)\n ? source\n : from(Promise.resolve(source));\n sourceSubscription = observable.subscribe({\n next: (value) => {\n if (!cancelled) subscriber.next(value);\n },\n error: (error) => {\n void settle(error);\n },\n complete: () => {\n void settle();\n },\n });\n\n if (cancelled) {\n sourceSubscription.unsubscribe();\n cancelRun();\n }\n }),\n );\n },\n );\n\n void run.then(\n () => {\n if (!cancelled) subscriber.complete();\n },\n (error: unknown) => {\n if (!cancelled) subscriber.error(error);\n },\n );\n\n return () => {\n cancelled = true;\n sourceSubscription?.unsubscribe();\n cancelRun?.();\n };\n });\n }\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AA2CA,MAAM,EAAE,SAAS,mBAAmB,WAAW,qBAC7C,oBACE,0EACF;AAEF,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,MAAM,QAAQ,eAAe,QAAQ;CAC3C,MAAM,QAAQ,QAAQ,QAAQ;CAE9B,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,MAAM,EAAE,YAAY,IAAI,IAAI,CAAC;EACjC,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;CACzC;AACF;AAEA,MAAM,cAAc,2BAAqD;CACvE,MAAM;CACN,SAAS;CACT,iBAAiB,iBAAiB;EAChC,MAAM,UAAU,aAAa,aAAa,CAAC,CAAC,WAAW;EACvD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,eAAe,QAAQ,OAAO;EACnE,OAAO;GACL,QAAQ,QAAQ,UAAU;GAC1B;GACA,SAAS,QAAQ;EACnB;CACF;CACA,oBAAoB,CAAC;CACrB,WAAW,iBAAiB;EAC1B,MAAM,UAAU,aAAa,WAAW,CAAC,CAAC;EAE1C,OAAO,UADY,aAAa,SAAS,CAAC,CAAC,KACf,GAAG;CACjC;AACF,CAAC;AAED,SAAgB,YAA2B;CACzC,OAAO,iBAAiB;AAC1B;AAEA,IAAa,qBAAb,MAAgC;CACF;CAA5B,YAAY,AAAgB,UAAkC,CAAC,GAAG;EAAtC;CAAuC;CAEnE,UACE,cACA,MACqB;EAIrB,OAAO,IAAI,YAAY,eAAe;GACpC,IAAI;GACJ,IAAI,YAAY;GAChB,IAAI;GAqFJ,AAnFY,YAAY,UACtB,cACA,KAAK,SACL,OAAO,WAAW;IAChB,IAAI,CAAC,OAAO,SAAS;KACnB,MAAM,UAAU,aAAa,aAAa,CAAC,CAAC,WAAW;KACvD,sBACE,OAAO,QACP,kBAAkB,OAAO,GACzB,KAAK,QAAQ,gBAAgB,OAAO,CACtC;IACF;IAEA,MAAM,OAAO,cAET,IAAI,SAAe,SAAS,WAAW;KACrC,IAAI,UAAU;KAEd,MAAM,SAAS,OAAO,UAAoB;MACxC,IAAI,SAAS;MACb,UAAU;MAEV,IAAI;OACF,IAAI,CAAC,OAAO,WAAW,KAAK,QAAQ,aAAa,OAC/C,IAAI,UAAU,QACZ,MAAM,OAAO,OAAO,EAClB,OACE,iBAAiB,QACb,QACA,IAAI,MAAM,OAAO,KAAK,CAAC,EAC/B,CAAC;YACI;QACL,MAAM,WAAW,aACd,aAAa,CAAC,CACd,YAAY;QACf,MAAM,OAAO,OAAO,EAAE,QAAQ,SAAS,WAAW,CAAC;OACrD;MAEJ,SAAS,aAAa;OACpB,OAAO,WAAW;OAClB;MACF;MAEA,IAAI,UAAU,QAAW,OAAO,KAAK;WAChC,QAAQ;KACf;KAEA,kBAAkB;MAChB,AAAK,OAAO;KACd;KAEA,IAAI;KACJ,IAAI;MACF,SAAS,KAAK,OAAO;KACvB,SAAS,OAAO;MACd,AAAK,OAAO,KAAK;MACjB;KACF;KAKA,sBAHmB,aAAa,MAAM,IAClC,SACA,KAAK,QAAQ,QAAQ,MAAM,CAAC,EACD,CAAC,UAAU;MACxC,OAAO,UAAU;OACf,IAAI,CAAC,WAAW,WAAW,KAAK,KAAK;MACvC;MACA,QAAQ,UAAU;OAChB,AAAK,OAAO,KAAK;MACnB;MACA,gBAAgB;OACd,AAAK,OAAO;MACd;KACF,CAAC;KAED,IAAI,WAAW;MACb,mBAAmB,YAAY;MAC/B,UAAU;KACZ;IACF,CAAC,CACL;GACF,CAGK,CAAC,CAAC,WACD;IACJ,IAAI,CAAC,WAAW,WAAW,SAAS;GACtC,IACC,UAAmB;IAClB,IAAI,CAAC,WAAW,WAAW,MAAM,KAAK;GACxC,CACF;GAEA,aAAa;IACX,YAAY;IACZ,oBAAoB,YAAY;IAChC,YAAY;GACd;EACF,CAAC;CACH;AACF"}
package/dist/next.cjs CHANGED
@@ -1,10 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_integration = require('./integration-guh7BHTF.cjs');
3
+ const require_toolkit_storage = require('./toolkit/storage.cjs');
2
4
  const require_core = require('./core.cjs');
3
5
  let autotel = require("autotel");
4
- let node_async_hooks = require("node:async_hooks");
5
6
 
6
7
  //#region src/next.ts
7
- const nextLoggerStorage = new node_async_hooks.AsyncLocalStorage();
8
+ const { storage: nextLoggerStorage, useLogger: storageUseLogger } = require_toolkit_storage.createLoggerStorage("request context. Wrap handlers with withAutotel() first.");
8
9
  function enrichFromRequest(request) {
9
10
  if (!request) return void 0;
10
11
  let route = "/";
@@ -26,47 +27,48 @@ const baseUseLogger = require_core.createUseLogger({
26
27
  enrich: enrichFromRequest
27
28
  });
28
29
  function useLogger(request, requestLoggerOptions) {
29
- const logger = nextLoggerStorage.getStore();
30
- if (logger) return logger;
31
- return baseUseLogger(request, requestLoggerOptions);
30
+ try {
31
+ return storageUseLogger();
32
+ } catch {
33
+ return baseUseLogger(request, requestLoggerOptions);
34
+ }
35
+ }
36
+ function resolvePath(request) {
37
+ if (!request?.url) return "/";
38
+ try {
39
+ return new URL(request.url).pathname;
40
+ } catch {
41
+ return request.url;
42
+ }
43
+ }
44
+ const integration = require_integration.defineFrameworkIntegration({
45
+ name: "next",
46
+ storage: nextLoggerStorage,
47
+ extractRequest: (request) => ({
48
+ method: request?.method ?? "GET",
49
+ path: resolvePath(request),
50
+ headers: request?.headers,
51
+ requestId: require_core.getHeader(request?.headers, "x-request-id")
52
+ }),
53
+ attachLogger: () => {}
54
+ });
55
+ function resolveSpanName(request, options) {
56
+ if (typeof options?.spanName === "function") return options.spanName(request);
57
+ return options?.spanName ?? "next.request";
32
58
  }
33
59
  function withAutotel(handler, options) {
34
60
  return async (...args) => {
35
61
  const request = args[0];
36
- return await (0, autotel.trace)({ name: typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? "next.request" }, (ctx) => async (...innerArgs) => {
37
- const innerRequest = innerArgs[0];
38
- const log = (0, autotel.getRequestLogger)(ctx, options?.requestLoggerOptions);
39
- const auto = enrichFromRequest(innerRequest);
40
- if (auto && Object.keys(auto).length > 0) log.set(auto);
41
- const custom = options?.enrich?.(innerRequest);
42
- if (custom && Object.keys(custom).length > 0) log.set(custom);
43
- try {
44
- return await nextLoggerStorage.run(log, async () => handler(...innerArgs));
45
- } finally {
46
- if (options?.autoEmit !== false) log.emitNow();
47
- }
48
- })(...args);
62
+ return integration.runTraced(request, require_integration.buildTracedOptions(options, resolveSpanName(request, options)), async (handle) => require_integration.runWithIntegratedHandle(handle, options, async () => {
63
+ require_integration.applyLoggerEnrichment(handle.logger, enrichFromRequest(request), options?.enrichRequest?.(request));
64
+ return handler(...args);
65
+ }));
49
66
  };
50
67
  }
51
- function createNextAdapter(options) {
52
- return {
53
- withAutotel: (handler) => withAutotel(handler, options),
54
- useLogger: (request, requestLoggerOptions) => useLogger(request, requestLoggerOptions),
55
- parseError: (error) => (0, autotel.parseError)(error),
56
- createStructuredError: (input) => (0, autotel.createStructuredError)(input),
57
- createDrainPipeline: (drainOptions) => (0, autotel.createDrainPipeline)(drainOptions)
58
- };
59
- }
60
- const nextToolkit = require_core.createAdapterToolkit({
61
- adapterName: "next",
62
- enrich: enrichFromRequest
63
- });
64
68
 
65
69
  //#endregion
66
70
  exports.createDrainPipeline = autotel.createDrainPipeline;
67
- exports.createNextAdapter = createNextAdapter;
68
71
  exports.createStructuredError = autotel.createStructuredError;
69
- exports.nextToolkit = nextToolkit;
70
72
  exports.parseError = autotel.parseError;
71
73
  exports.useLogger = useLogger;
72
74
  exports.withAutotel = withAutotel;
package/dist/next.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"next.cjs","names":["AsyncLocalStorage","getHeader","createUseLogger","createAdapterToolkit"],"sources":["../src/next.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n getRequestLogger,\n parseError,\n trace,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n type ParsedError,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions {\n spanName?: string | ((request?: NextRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;\n /** Emit one wide event automatically when the handler settles. Default `true`. */\n autoEmit?: boolean;\n}\n\nconst nextLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const logger = nextLoggerStorage.getStore();\n if (logger) return logger;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? 'next.request');\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (...innerArgs: TArgs) => {\n const innerRequest = innerArgs[0] as NextRequestLike | undefined;\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerRequest);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n try {\n return await nextLoggerStorage.run(log, async () =>\n handler(...innerArgs),\n );\n } finally {\n if (options?.autoEmit !== false) {\n log.emitNow();\n }\n }\n },\n );\n return await wrapped(...args);\n };\n}\n\nexport function createNextAdapter(options?: NextWithAutotelOptions) {\n return {\n withAutotel: <TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger: (\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger => useLogger(request, requestLoggerOptions),\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => createStructuredError(input),\n createDrainPipeline: <T = unknown>(\n drainOptions?: DrainPipelineOptions<T>,\n ): ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>) =>\n createDrainPipeline(drainOptions),\n };\n}\n\nexport const nextToolkit = createAdapterToolkit<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;AAiCA,MAAM,oBAAoB,IAAIA,mCAAiC;AAE/D,SAAS,kBACP,SACqC;CACrC,IAAI,CAAC,SAAS,OAAO;CAErB,IAAI,QAAQ;CACZ,IAAI,QAAQ,KACV,IAAI;EACF,QAAQ,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;CAC/B,QAAQ;EACN,QAAQ,QAAQ;CAClB;CAEF,MAAM,YAAYC,uBAAU,QAAQ,SAAS,cAAc;CAE3D,OAAO;EACL,GAAI,QAAQ,SAAS,EAAE,uBAAuB,QAAQ,OAAO,IAAI,CAAC;EAClE,GAAI,QAAQ,MAAM,EAAE,YAAY,QAAQ,IAAI,IAAI,CAAC;EACjD,GAAI,QAAQ,EAAE,cAAc,MAAM,IAAI,CAAC;EACvC,GAAI,YAAY,EAAE,oCAAoC,UAAU,IAAI,CAAC;CACvE;AACF;AAEA,MAAM,gBAAgBC,6BAAiC;CACrD,aAAa;CACb,QAAQ;AACV,CAAC;AAED,SAAgB,UACd,SACA,sBACe;CACf,MAAM,SAAS,kBAAkB,SAAS;CAC1C,IAAI,QAAQ,OAAO;CACnB,OAAO,cAAc,SAAS,oBAAoB;AACpD;AAEA,SAAgB,YACd,SACA,SACsC;CACtC,OAAO,OAAO,GAAG,SAAkC;EACjD,MAAM,UAAU,KAAK;EA8BrB,OAAO,yBAvBL,EAAE,MALF,OAAO,SAAS,aAAa,aACzB,QAAQ,SAAS,OAAO,IACvB,SAAS,YAAY,eAGT,IAChB,QAAQ,OAAO,GAAG,cAAqB;GACtC,MAAM,eAAe,UAAU;GAC/B,MAAM,oCAAuB,KAAK,SAAS,oBAAoB;GAC/D,MAAM,OAAO,kBAAkB,YAAY;GAC3C,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACrC,IAAI,IAAI,IAAI;GAEd,MAAM,SAAS,SAAS,SAAS,YAAY;GAC7C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GACzC,IAAI,IAAI,MAAM;GAEhB,IAAI;IACF,OAAO,MAAM,kBAAkB,IAAI,KAAK,YACtC,QAAQ,GAAG,SAAS,CACtB;GACF,UAAU;IACR,IAAI,SAAS,aAAa,OACxB,IAAI,QAAQ;GAEhB;EACF,CAEiB,CAAC,CAAC,GAAG,IAAI;CAC9B;AACF;AAEA,SAAgB,kBAAkB,SAAkC;CAClE,OAAO;EACL,cACE,YACG,YAAY,SAAS,OAAO;EACjC,YACE,SACA,yBACkB,UAAU,SAAS,oBAAoB;EAC3D,aAAa,kCAA2C,KAAK;EAC7D,wBACE,6CAC0C,KAAK;EACjD,sBACE,kDAEoB,YAAY;CACpC;AACF;AAEA,MAAa,cAAcC,kCAAsC;CAC/D,aAAa;CACb,QAAQ;AACV,CAAC"}
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\n return integration.runTraced(\n request,\n buildTracedOptions(options, resolveSpanName(request, options)),\n async (handle) =>\n runWithIntegratedHandle(handle, options, async () => {\n applyLoggerEnrichment(\n handle.logger,\n enrichFromRequest(request),\n options?.enrichRequest?.(request),\n );\n return handler(...args);\n }),\n );\n };\n}\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"],"mappings":";;;;;;;AAqCA,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;EAErB,OAAO,YAAY,UACjB,SACAG,uCAAmB,SAAS,gBAAgB,SAAS,OAAO,CAAC,GAC7D,OAAO,WACLC,4CAAwB,QAAQ,SAAS,YAAY;GACnD,0CACE,OAAO,QACP,kBAAkB,OAAO,GACzB,SAAS,gBAAgB,OAAO,CAClC;GACA,OAAO,QAAQ,GAAG,IAAI;EACxB,CAAC,CACL;CACF;AACF"}
package/dist/next.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import { AdapterToolkit } from "./core.cjs";
2
- import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
3
-
1
+ import { n as FrameworkHandlerOptions } from "./integration-DI-1RuTh.cjs";
2
+ import "./core.cjs";
3
+ import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
4
4
  //#region src/next.d.ts
5
5
  interface NextRequestLike {
6
6
  method?: string;
@@ -9,23 +9,12 @@ interface NextRequestLike {
9
9
  get(name: string): string | null;
10
10
  } | Record<string, string | undefined>;
11
11
  }
12
- interface NextWithAutotelOptions {
12
+ interface NextWithAutotelOptions extends Omit<FrameworkHandlerOptions, 'spanName'> {
13
13
  spanName?: string | ((request?: NextRequestLike) => string);
14
- requestLoggerOptions?: RequestLoggerOptions;
15
- enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
16
- /** Emit one wide event automatically when the handler settles. Default `true`. */
17
- autoEmit?: boolean;
14
+ enrichRequest?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
18
15
  }
19
16
  declare function useLogger(request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
20
17
  declare function withAutotel<TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>, options?: NextWithAutotelOptions): (...args: TArgs) => Promise<TReturn>;
21
- declare function createNextAdapter(options?: NextWithAutotelOptions): {
22
- withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
23
- useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
24
- parseError: (error: unknown) => ParsedError;
25
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
26
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
27
- };
28
- declare const nextToolkit: AdapterToolkit<NextRequestLike>;
29
18
  //#endregion
30
- export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel };
19
+ export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotel };
31
20
  //# sourceMappingURL=next.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"next.d.cts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAiBiB,eAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAM;AAAA;AAAA,UAGK,sBAAA;EACf,QAAA,cAAsB,OAAA,GAAU,eAAA;EAChC,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,GAAU,eAAA,KAAoB,MAAA;EAP9B;EASV,QAAA;AAAA;AAAA,iBAiCc,SAAA,CACd,OAAA,GAAU,eAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAMa,WAAA,mCACd,OAAA,MAAa,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC/C,OAAA,GAAU,sBAAA,OACL,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,OAAA;AAAA,iBAoCf,iBAAA,CAAkB,OAAA,GAAU,sBAAA;kDAEM,OAAA,MAC/B,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,UAAQ,IAAA,EAAA,KAAA,KAAA,OAAA,CAAA,OAAA;wBAG7C,eAAA,EAAe,oBAAA,GACF,oBAAA,KACtB,aAAA;kCAC2B,WAAA;iCAErB,oBAAA,KACN,eAAA;qCACoB,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,WAAA,EAAW,cAAA,CAAA,eAAA"}
1
+ {"version":3,"file":"next.d.cts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAoBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;;UAG1B,+BAA+B,KAC9C;EAGA,sBAAsB,UAAU;EAChC,iBACE,UAAU,oBACP;;iBAoCS,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,6 +1,6 @@
1
- import { AdapterToolkit } from "./core.js";
2
- import { DrainPipelineOptions, ParsedError, PipelineDrainFn, RequestLogger, RequestLoggerOptions, StructuredError, StructuredErrorInput, createDrainPipeline, createStructuredError, parseError } from "autotel";
3
-
1
+ import { n as FrameworkHandlerOptions } from "./integration-rYoX8QLk.js";
2
+ import "./core.js";
3
+ import { RequestLogger, RequestLoggerOptions, createDrainPipeline, createStructuredError, parseError } from "autotel";
4
4
  //#region src/next.d.ts
5
5
  interface NextRequestLike {
6
6
  method?: string;
@@ -9,23 +9,12 @@ interface NextRequestLike {
9
9
  get(name: string): string | null;
10
10
  } | Record<string, string | undefined>;
11
11
  }
12
- interface NextWithAutotelOptions {
12
+ interface NextWithAutotelOptions extends Omit<FrameworkHandlerOptions, 'spanName'> {
13
13
  spanName?: string | ((request?: NextRequestLike) => string);
14
- requestLoggerOptions?: RequestLoggerOptions;
15
- enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
16
- /** Emit one wide event automatically when the handler settles. Default `true`. */
17
- autoEmit?: boolean;
14
+ enrichRequest?: (request?: NextRequestLike) => Record<string, unknown> | undefined;
18
15
  }
19
16
  declare function useLogger(request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions): RequestLogger;
20
17
  declare function withAutotel<TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>, options?: NextWithAutotelOptions): (...args: TArgs) => Promise<TReturn>;
21
- declare function createNextAdapter(options?: NextWithAutotelOptions): {
22
- withAutotel: <TArgs extends unknown[], TReturn>(handler: (...args: TArgs) => TReturn | Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
23
- useLogger: (request?: NextRequestLike, requestLoggerOptions?: RequestLoggerOptions) => RequestLogger;
24
- parseError: (error: unknown) => ParsedError;
25
- createStructuredError: (input: StructuredErrorInput) => StructuredError;
26
- createDrainPipeline: <T = unknown>(drainOptions?: DrainPipelineOptions<T>) => ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>);
27
- };
28
- declare const nextToolkit: AdapterToolkit<NextRequestLike>;
29
18
  //#endregion
30
- export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createNextAdapter, createStructuredError, nextToolkit, parseError, useLogger, withAutotel };
19
+ export { NextRequestLike, NextWithAutotelOptions, createDrainPipeline, createStructuredError, parseError, useLogger, withAutotel };
31
20
  //# sourceMappingURL=next.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"next.d.ts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAiBiB,eAAA;EACf,MAAA;EACA,GAAA;EACA,OAAA;IACM,GAAA,CAAI,IAAA;EAAA,IACN,MAAM;AAAA;AAAA,UAGK,sBAAA;EACf,QAAA,cAAsB,OAAA,GAAU,eAAA;EAChC,oBAAA,GAAuB,oBAAA;EACvB,MAAA,IAAU,OAAA,GAAU,eAAA,KAAoB,MAAA;EAP9B;EASV,QAAA;AAAA;AAAA,iBAiCc,SAAA,CACd,OAAA,GAAU,eAAA,EACV,oBAAA,GAAuB,oBAAA,GACtB,aAAA;AAAA,iBAMa,WAAA,mCACd,OAAA,MAAa,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,GAC/C,OAAA,GAAU,sBAAA,OACL,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,OAAA;AAAA,iBAoCf,iBAAA,CAAkB,OAAA,GAAU,sBAAA;kDAEM,OAAA,MAC/B,IAAA,EAAM,KAAA,KAAU,OAAA,GAAU,OAAA,CAAQ,OAAA,UAAQ,IAAA,EAAA,KAAA,KAAA,OAAA,CAAA,OAAA;wBAG7C,eAAA,EAAe,oBAAA,GACF,oBAAA,KACtB,aAAA;kCAC2B,WAAA;iCAErB,oBAAA,KACN,eAAA;qCACoB,YAAA,GACN,oBAAA,CAAqB,CAAA,QACjC,UAAA,GAAa,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA;AAAA;AAAA,cAKjE,WAAA,EAAW,cAAA,CAAA,eAAA"}
1
+ {"version":3,"file":"next.d.ts","names":[],"sources":["../src/next.ts"],"mappings":";;;;UAoBiB;EACf;EACA;EACA;IACI,IAAI;MAAiC;;UAG1B,+BAA+B,KAC9C;EAGA,sBAAsB,UAAU;EAChC,iBACE,UAAU,oBACP;;iBAoCS,UACd,UAAU,iBACV,uBAAuB,uBACtB;iBAuCa,YAAY,yBAAyB,SACnD,aAAa,MAAM,UAAU,UAAU,QAAQ,UAC/C,UAAU,6BACL,MAAM,UAAU,QAAQ"}