@tracewayapp/nestjs 0.2.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.
@@ -0,0 +1,75 @@
1
+ import { ModuleMetadata, Type, InjectionToken, OptionalFactoryDependency, OnModuleDestroy, DynamicModule, NestMiddleware, ArgumentsHost } from '@nestjs/common';
2
+ import * as _tracewayapp_backend from '@tracewayapp/backend';
3
+ import { SpanHandle, TraceContextOptions } from '@tracewayapp/backend';
4
+ import { Request, Response, NextFunction } from 'express';
5
+ import { BaseExceptionFilter } from '@nestjs/core';
6
+
7
+ type ErrorRecordingField = "url" | "query" | "body" | "headers";
8
+ interface TracewayModuleOptions {
9
+ connectionString: string;
10
+ debug?: boolean;
11
+ version?: string;
12
+ serverName?: string;
13
+ sampleRate?: number;
14
+ errorSampleRate?: number;
15
+ ignoredRoutes?: string[];
16
+ onErrorRecording?: ErrorRecordingField[];
17
+ }
18
+ interface TracewayOptionsFactory {
19
+ createTracewayOptions(): Promise<TracewayModuleOptions> | TracewayModuleOptions;
20
+ }
21
+ interface TracewayModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
22
+ useExisting?: Type<TracewayOptionsFactory>;
23
+ useClass?: Type<TracewayOptionsFactory>;
24
+ useFactory?: (...args: unknown[]) => Promise<TracewayModuleOptions> | TracewayModuleOptions;
25
+ inject?: (InjectionToken | OptionalFactoryDependency)[];
26
+ }
27
+
28
+ declare class TracewayService {
29
+ private readonly options;
30
+ constructor(options: TracewayModuleOptions);
31
+ initialize(): void;
32
+ shutdownAsync(): Promise<void>;
33
+ captureException(error: Error): void;
34
+ captureExceptionWithAttributes(error: Error, attributes?: Record<string, string>, traceId?: string): void;
35
+ captureMessage(msg: string, attributes?: Record<string, string>): void;
36
+ startSpan(name: string): SpanHandle;
37
+ endSpan(span: SpanHandle, addToContext?: boolean): void;
38
+ measureTask(title: string, fn: () => void | Promise<void>): void;
39
+ setTraceAttribute(key: string, value: string): void;
40
+ setTraceAttributes(attributes: Record<string, string>): void;
41
+ getTraceId(): string | undefined;
42
+ getTraceContext(): _tracewayapp_backend.TraceContext | undefined;
43
+ withTraceContext<T>(options: TraceContextOptions, fn: () => T): T;
44
+ getOptions(): TracewayModuleOptions;
45
+ }
46
+
47
+ declare class TracewayModule implements OnModuleDestroy {
48
+ private readonly tracewayService;
49
+ constructor(tracewayService: TracewayService);
50
+ static forRoot(options: TracewayModuleOptions): DynamicModule;
51
+ static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule;
52
+ private static createAsyncProviders;
53
+ private static createAsyncOptionsProvider;
54
+ onModuleDestroy(): Promise<void>;
55
+ }
56
+
57
+ declare class TracewayMiddleware implements NestMiddleware {
58
+ private readonly options;
59
+ constructor(options: TracewayModuleOptions);
60
+ use(req: Request, res: Response, next: NextFunction): void;
61
+ private getClientIP;
62
+ }
63
+
64
+ declare class TracewayExceptionFilter extends BaseExceptionFilter {
65
+ private readonly options;
66
+ constructor(options: TracewayModuleOptions);
67
+ catch(exception: unknown, host: ArgumentsHost): void;
68
+ private captureError;
69
+ }
70
+
71
+ declare function Span(name?: string): MethodDecorator;
72
+
73
+ declare const TRACEWAY_MODULE_OPTIONS = "TRACEWAY_MODULE_OPTIONS";
74
+
75
+ export { type ErrorRecordingField, Span, TRACEWAY_MODULE_OPTIONS, TracewayExceptionFilter, TracewayMiddleware, TracewayModule, type TracewayModuleAsyncOptions, type TracewayModuleOptions, type TracewayOptionsFactory, TracewayService };
@@ -0,0 +1,75 @@
1
+ import { ModuleMetadata, Type, InjectionToken, OptionalFactoryDependency, OnModuleDestroy, DynamicModule, NestMiddleware, ArgumentsHost } from '@nestjs/common';
2
+ import * as _tracewayapp_backend from '@tracewayapp/backend';
3
+ import { SpanHandle, TraceContextOptions } from '@tracewayapp/backend';
4
+ import { Request, Response, NextFunction } from 'express';
5
+ import { BaseExceptionFilter } from '@nestjs/core';
6
+
7
+ type ErrorRecordingField = "url" | "query" | "body" | "headers";
8
+ interface TracewayModuleOptions {
9
+ connectionString: string;
10
+ debug?: boolean;
11
+ version?: string;
12
+ serverName?: string;
13
+ sampleRate?: number;
14
+ errorSampleRate?: number;
15
+ ignoredRoutes?: string[];
16
+ onErrorRecording?: ErrorRecordingField[];
17
+ }
18
+ interface TracewayOptionsFactory {
19
+ createTracewayOptions(): Promise<TracewayModuleOptions> | TracewayModuleOptions;
20
+ }
21
+ interface TracewayModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
22
+ useExisting?: Type<TracewayOptionsFactory>;
23
+ useClass?: Type<TracewayOptionsFactory>;
24
+ useFactory?: (...args: unknown[]) => Promise<TracewayModuleOptions> | TracewayModuleOptions;
25
+ inject?: (InjectionToken | OptionalFactoryDependency)[];
26
+ }
27
+
28
+ declare class TracewayService {
29
+ private readonly options;
30
+ constructor(options: TracewayModuleOptions);
31
+ initialize(): void;
32
+ shutdownAsync(): Promise<void>;
33
+ captureException(error: Error): void;
34
+ captureExceptionWithAttributes(error: Error, attributes?: Record<string, string>, traceId?: string): void;
35
+ captureMessage(msg: string, attributes?: Record<string, string>): void;
36
+ startSpan(name: string): SpanHandle;
37
+ endSpan(span: SpanHandle, addToContext?: boolean): void;
38
+ measureTask(title: string, fn: () => void | Promise<void>): void;
39
+ setTraceAttribute(key: string, value: string): void;
40
+ setTraceAttributes(attributes: Record<string, string>): void;
41
+ getTraceId(): string | undefined;
42
+ getTraceContext(): _tracewayapp_backend.TraceContext | undefined;
43
+ withTraceContext<T>(options: TraceContextOptions, fn: () => T): T;
44
+ getOptions(): TracewayModuleOptions;
45
+ }
46
+
47
+ declare class TracewayModule implements OnModuleDestroy {
48
+ private readonly tracewayService;
49
+ constructor(tracewayService: TracewayService);
50
+ static forRoot(options: TracewayModuleOptions): DynamicModule;
51
+ static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule;
52
+ private static createAsyncProviders;
53
+ private static createAsyncOptionsProvider;
54
+ onModuleDestroy(): Promise<void>;
55
+ }
56
+
57
+ declare class TracewayMiddleware implements NestMiddleware {
58
+ private readonly options;
59
+ constructor(options: TracewayModuleOptions);
60
+ use(req: Request, res: Response, next: NextFunction): void;
61
+ private getClientIP;
62
+ }
63
+
64
+ declare class TracewayExceptionFilter extends BaseExceptionFilter {
65
+ private readonly options;
66
+ constructor(options: TracewayModuleOptions);
67
+ catch(exception: unknown, host: ArgumentsHost): void;
68
+ private captureError;
69
+ }
70
+
71
+ declare function Span(name?: string): MethodDecorator;
72
+
73
+ declare const TRACEWAY_MODULE_OPTIONS = "TRACEWAY_MODULE_OPTIONS";
74
+
75
+ export { type ErrorRecordingField, Span, TRACEWAY_MODULE_OPTIONS, TracewayExceptionFilter, TracewayMiddleware, TracewayModule, type TracewayModuleAsyncOptions, type TracewayModuleOptions, type TracewayOptionsFactory, TracewayService };
package/dist/index.js ADDED
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __decorateClass = (decorators, target, key, kind) => {
20
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
21
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
22
+ if (decorator = decorators[i])
23
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
+ if (kind && result) __defProp(target, key, result);
25
+ return result;
26
+ };
27
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
28
+
29
+ // src/index.ts
30
+ var index_exports = {};
31
+ __export(index_exports, {
32
+ Span: () => Span,
33
+ TRACEWAY_MODULE_OPTIONS: () => TRACEWAY_MODULE_OPTIONS,
34
+ TracewayExceptionFilter: () => TracewayExceptionFilter,
35
+ TracewayMiddleware: () => TracewayMiddleware,
36
+ TracewayModule: () => TracewayModule,
37
+ TracewayService: () => TracewayService
38
+ });
39
+ module.exports = __toCommonJS(index_exports);
40
+
41
+ // src/traceway.module.ts
42
+ var import_common2 = require("@nestjs/common");
43
+
44
+ // src/traceway.constants.ts
45
+ var TRACEWAY_MODULE_OPTIONS = "TRACEWAY_MODULE_OPTIONS";
46
+
47
+ // src/traceway.service.ts
48
+ var import_common = require("@nestjs/common");
49
+ var import_backend = require("@tracewayapp/backend");
50
+ var TracewayService = class {
51
+ constructor(options) {
52
+ this.options = options;
53
+ }
54
+ initialize() {
55
+ (0, import_backend.init)(this.options.connectionString, {
56
+ debug: this.options.debug,
57
+ version: this.options.version,
58
+ serverName: this.options.serverName,
59
+ sampleRate: this.options.sampleRate,
60
+ errorSampleRate: this.options.errorSampleRate
61
+ });
62
+ }
63
+ async shutdownAsync() {
64
+ await (0, import_backend.shutdown)();
65
+ }
66
+ captureException(error) {
67
+ (0, import_backend.captureException)(error);
68
+ }
69
+ captureExceptionWithAttributes(error, attributes, traceId) {
70
+ (0, import_backend.captureExceptionWithAttributes)(error, attributes, traceId);
71
+ }
72
+ captureMessage(msg, attributes) {
73
+ (0, import_backend.captureMessage)(msg, attributes);
74
+ }
75
+ startSpan(name) {
76
+ return (0, import_backend.startSpan)(name);
77
+ }
78
+ endSpan(span, addToContext = true) {
79
+ (0, import_backend.endSpan)(span, addToContext);
80
+ }
81
+ measureTask(title, fn) {
82
+ (0, import_backend.measureTask)(title, fn);
83
+ }
84
+ setTraceAttribute(key, value) {
85
+ (0, import_backend.setTraceAttribute)(key, value);
86
+ }
87
+ setTraceAttributes(attributes) {
88
+ (0, import_backend.setTraceAttributes)(attributes);
89
+ }
90
+ getTraceId() {
91
+ return (0, import_backend.getTraceId)();
92
+ }
93
+ getTraceContext() {
94
+ return (0, import_backend.getTraceContext)();
95
+ }
96
+ withTraceContext(options, fn) {
97
+ return (0, import_backend.withTraceContext)(options, fn);
98
+ }
99
+ getOptions() {
100
+ return this.options;
101
+ }
102
+ };
103
+ TracewayService = __decorateClass([
104
+ (0, import_common.Injectable)(),
105
+ __decorateParam(0, (0, import_common.Inject)(TRACEWAY_MODULE_OPTIONS))
106
+ ], TracewayService);
107
+
108
+ // src/traceway.module.ts
109
+ var TracewayModule = class {
110
+ constructor(tracewayService) {
111
+ this.tracewayService = tracewayService;
112
+ }
113
+ static forRoot(options) {
114
+ const optionsProvider = {
115
+ provide: TRACEWAY_MODULE_OPTIONS,
116
+ useValue: options
117
+ };
118
+ return {
119
+ module: TracewayModule,
120
+ providers: [
121
+ optionsProvider,
122
+ TracewayService,
123
+ {
124
+ provide: "TRACEWAY_INIT",
125
+ useFactory: (service) => {
126
+ service.initialize();
127
+ return true;
128
+ },
129
+ inject: [TracewayService]
130
+ }
131
+ ],
132
+ exports: [TracewayService, TRACEWAY_MODULE_OPTIONS]
133
+ };
134
+ }
135
+ static forRootAsync(options) {
136
+ const asyncProviders = this.createAsyncProviders(options);
137
+ return {
138
+ module: TracewayModule,
139
+ imports: options.imports || [],
140
+ providers: [
141
+ ...asyncProviders,
142
+ TracewayService,
143
+ {
144
+ provide: "TRACEWAY_INIT",
145
+ useFactory: (service) => {
146
+ service.initialize();
147
+ return true;
148
+ },
149
+ inject: [TracewayService]
150
+ }
151
+ ],
152
+ exports: [TracewayService, TRACEWAY_MODULE_OPTIONS]
153
+ };
154
+ }
155
+ static createAsyncProviders(options) {
156
+ if (options.useExisting || options.useFactory) {
157
+ return [this.createAsyncOptionsProvider(options)];
158
+ }
159
+ if (options.useClass) {
160
+ return [
161
+ this.createAsyncOptionsProvider(options),
162
+ {
163
+ provide: options.useClass,
164
+ useClass: options.useClass
165
+ }
166
+ ];
167
+ }
168
+ return [];
169
+ }
170
+ static createAsyncOptionsProvider(options) {
171
+ if (options.useFactory) {
172
+ return {
173
+ provide: TRACEWAY_MODULE_OPTIONS,
174
+ useFactory: options.useFactory,
175
+ inject: options.inject || []
176
+ };
177
+ }
178
+ const inject = options.useExisting || options.useClass;
179
+ if (!inject) {
180
+ throw new Error(
181
+ "TracewayModule: useExisting, useClass, or useFactory must be provided"
182
+ );
183
+ }
184
+ return {
185
+ provide: TRACEWAY_MODULE_OPTIONS,
186
+ useFactory: async (optionsFactory) => optionsFactory.createTracewayOptions(),
187
+ inject: [inject]
188
+ };
189
+ }
190
+ async onModuleDestroy() {
191
+ await this.tracewayService.shutdownAsync();
192
+ }
193
+ };
194
+ TracewayModule = __decorateClass([
195
+ (0, import_common2.Global)(),
196
+ (0, import_common2.Module)({})
197
+ ], TracewayModule);
198
+
199
+ // src/traceway.middleware.ts
200
+ var import_common3 = require("@nestjs/common");
201
+ var import_backend2 = require("@tracewayapp/backend");
202
+ var TracewayMiddleware = class {
203
+ constructor(options) {
204
+ this.options = options;
205
+ }
206
+ use(req, res, next) {
207
+ const routePath = req.route?.path || req.path;
208
+ if (this.options.ignoredRoutes?.includes(routePath)) {
209
+ return next();
210
+ }
211
+ const endpoint = `${req.method} ${routePath}`;
212
+ const clientIP = this.getClientIP(req);
213
+ (0, import_backend2.withTraceContext)({ endpoint, clientIP }, () => {
214
+ res.on("finish", () => {
215
+ const bodySize = parseInt(res.get("content-length") || "0", 10);
216
+ (0, import_backend2.setTraceResponseInfo)(res.statusCode, bodySize);
217
+ (0, import_backend2.captureCurrentTrace)();
218
+ });
219
+ next();
220
+ });
221
+ }
222
+ getClientIP(req) {
223
+ const forwarded = req.headers["x-forwarded-for"];
224
+ if (typeof forwarded === "string") {
225
+ return forwarded.split(",")[0].trim();
226
+ }
227
+ if (Array.isArray(forwarded)) {
228
+ return forwarded[0];
229
+ }
230
+ return req.ip || req.socket.remoteAddress || "";
231
+ }
232
+ };
233
+ TracewayMiddleware = __decorateClass([
234
+ (0, import_common3.Injectable)(),
235
+ __decorateParam(0, (0, import_common3.Inject)(TRACEWAY_MODULE_OPTIONS))
236
+ ], TracewayMiddleware);
237
+
238
+ // src/traceway.filter.ts
239
+ var import_common4 = require("@nestjs/common");
240
+ var import_core = require("@nestjs/core");
241
+ var import_backend3 = require("@tracewayapp/backend");
242
+ var BODY_LIMIT = 64 * 1024;
243
+ var TracewayExceptionFilter = class extends import_core.BaseExceptionFilter {
244
+ constructor(options) {
245
+ super();
246
+ this.options = options;
247
+ }
248
+ catch(exception, host) {
249
+ const ctx = host.switchToHttp();
250
+ const request = ctx.getRequest();
251
+ const response = ctx.getResponse();
252
+ const status = exception instanceof import_common4.HttpException ? exception.getStatus() : import_common4.HttpStatus.INTERNAL_SERVER_ERROR;
253
+ if (status >= 500 || !(exception instanceof import_common4.HttpException)) {
254
+ this.captureError(exception, request);
255
+ }
256
+ if (exception instanceof Error) {
257
+ super.catch(exception, host);
258
+ } else {
259
+ response.status(status).json({
260
+ statusCode: status,
261
+ message: "Internal server error"
262
+ });
263
+ }
264
+ }
265
+ captureError(exception, request) {
266
+ const error = exception instanceof Error ? exception : new Error(String(exception));
267
+ const attributes = {};
268
+ const traceCtx = (0, import_backend3.getTraceContext)();
269
+ if (traceCtx?.attributes) {
270
+ Object.assign(attributes, traceCtx.attributes);
271
+ }
272
+ attributes["user agent"] = request.get("user-agent") || "";
273
+ const recordingFields = this.options.onErrorRecording || [];
274
+ if (recordingFields.includes("url")) {
275
+ attributes["url"] = request.path;
276
+ }
277
+ if (recordingFields.includes("query")) {
278
+ const query = request.query;
279
+ if (Object.keys(query).length > 0) {
280
+ attributes["query"] = JSON.stringify(query);
281
+ }
282
+ }
283
+ if (recordingFields.includes("body")) {
284
+ const contentType = request.get("content-type") || "";
285
+ if (contentType.includes("application/json") && request.body) {
286
+ const bodyStr = JSON.stringify(request.body);
287
+ attributes["body"] = bodyStr.slice(0, BODY_LIMIT);
288
+ }
289
+ }
290
+ if (recordingFields.includes("headers")) {
291
+ const headers = { ...request.headers };
292
+ delete headers["authorization"];
293
+ delete headers["cookie"];
294
+ attributes["headers"] = JSON.stringify(headers);
295
+ }
296
+ const traceId = (0, import_backend3.getTraceId)();
297
+ (0, import_backend3.captureExceptionWithAttributes)(error, attributes, traceId);
298
+ }
299
+ };
300
+ TracewayExceptionFilter = __decorateClass([
301
+ (0, import_common4.Catch)(),
302
+ __decorateParam(0, (0, import_common4.Inject)(TRACEWAY_MODULE_OPTIONS))
303
+ ], TracewayExceptionFilter);
304
+
305
+ // src/traceway.decorators.ts
306
+ var import_backend4 = require("@tracewayapp/backend");
307
+ function Span(name) {
308
+ return function(target, propertyKey, descriptor) {
309
+ const originalMethod = descriptor.value;
310
+ const spanName = name || String(propertyKey);
311
+ descriptor.value = function(...args) {
312
+ const span = (0, import_backend4.startSpan)(spanName);
313
+ try {
314
+ const result = originalMethod.apply(this, args);
315
+ if (result && typeof result.then === "function") {
316
+ return result.then((value) => {
317
+ (0, import_backend4.endSpan)(span);
318
+ return value;
319
+ }).catch((error) => {
320
+ (0, import_backend4.endSpan)(span);
321
+ throw error;
322
+ });
323
+ }
324
+ (0, import_backend4.endSpan)(span);
325
+ return result;
326
+ } catch (error) {
327
+ (0, import_backend4.endSpan)(span);
328
+ throw error;
329
+ }
330
+ };
331
+ return descriptor;
332
+ };
333
+ }
334
+ // Annotate the CommonJS export names for ESM import in node:
335
+ 0 && (module.exports = {
336
+ Span,
337
+ TRACEWAY_MODULE_OPTIONS,
338
+ TracewayExceptionFilter,
339
+ TracewayMiddleware,
340
+ TracewayModule,
341
+ TracewayService
342
+ });
343
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["export { TracewayModule } from \"./traceway.module.js\";\nexport { TracewayService } from \"./traceway.service.js\";\nexport { TracewayMiddleware } from \"./traceway.middleware.js\";\nexport { TracewayExceptionFilter } from \"./traceway.filter.js\";\nexport { Span } from \"./traceway.decorators.js\";\nexport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nexport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n ErrorRecordingField,\n} from \"./traceway.interfaces.js\";\n","import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath)) {\n return next();\n }\n\n const endpoint = `${req.method} ${routePath}`;\n const clientIP = this.getClientIP(req);\n\n withTraceContext({ endpoint, clientIP }, () => {\n res.on(\"finish\", () => {\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n} from \"@nestjs/common\";\nimport { BaseExceptionFilter } from \"@nestjs/core\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter extends BaseExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {\n super();\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const status =\n exception instanceof HttpException\n ? exception.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !(exception instanceof HttpException)) {\n this.captureError(exception, request);\n }\n\n if (exception instanceof Error) {\n super.catch(exception, host);\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAMO;;;ACNA,IAAM,0BAA0B;;;ACAvC,oBAAmC;AACnC,qBAgBO;AAKA,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAEmB,SACjB;AADiB;AAAA,EAChB;AAAA,EAEH,aAAmB;AACjB,6BAAK,KAAK,QAAQ,kBAAkB;AAAA,MAClC,OAAO,KAAK,QAAQ;AAAA,MACpB,SAAS,KAAK,QAAQ;AAAA,MACtB,YAAY,KAAK,QAAQ;AAAA,MACzB,YAAY,KAAK,QAAQ;AAAA,MACzB,iBAAiB,KAAK,QAAQ;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAA+B;AACnC,cAAM,yBAAS;AAAA,EACjB;AAAA,EAEA,iBAAiB,OAAoB;AACnC,yCAAiB,KAAK;AAAA,EACxB;AAAA,EAEA,+BACE,OACA,YACA,SACM;AACN,uDAA+B,OAAO,YAAY,OAAO;AAAA,EAC3D;AAAA,EAEA,eAAe,KAAa,YAA2C;AACrE,uCAAe,KAAK,UAAU;AAAA,EAChC;AAAA,EAEA,UAAU,MAA0B;AAClC,eAAO,0BAAU,IAAI;AAAA,EACvB;AAAA,EAEA,QAAQ,MAAkB,eAAwB,MAAY;AAC5D,gCAAQ,MAAM,YAAY;AAAA,EAC5B;AAAA,EAEA,YAAY,OAAe,IAAsC;AAC/D,oCAAY,OAAO,EAAE;AAAA,EACvB;AAAA,EAEA,kBAAkB,KAAa,OAAqB;AAClD,0CAAkB,KAAK,KAAK;AAAA,EAC9B;AAAA,EAEA,mBAAmB,YAA0C;AAC3D,2CAAmB,UAAU;AAAA,EAC/B;AAAA,EAEA,aAAiC;AAC/B,eAAO,2BAAW;AAAA,EACpB;AAAA,EAEA,kBAAkB;AAChB,eAAO,gCAAgB;AAAA,EACzB;AAAA,EAEA,iBAAoB,SAA8B,IAAgB;AAChE,eAAO,iCAAiB,SAAS,EAAE;AAAA,EACrC;AAAA,EAEA,aAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAvEa,kBAAN;AAAA,MADN,0BAAW;AAAA,EAGP,6CAAO,uBAAuB;AAAA,GAFtB;;;AFLN,IAAM,iBAAN,MAAgD;AAAA,EACrD,YAA6B,iBAAkC;AAAlC;AAAA,EAAmC;AAAA,EAEhE,OAAO,QAAQ,SAA+C;AAC5D,UAAM,kBAA4B;AAAA,MAChC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,YAAY,CAAC,YAA6B;AACxC,oBAAQ,WAAW;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,CAAC,iBAAiB,uBAAuB;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAO,aAAa,SAAoD;AACtE,UAAM,iBAAiB,KAAK,qBAAqB,OAAO;AAExD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,QAAQ,WAAW,CAAC;AAAA,MAC7B,WAAW;AAAA,QACT,GAAG;AAAA,QACH;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,YAAY,CAAC,YAA6B;AACxC,oBAAQ,WAAW;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,CAAC,iBAAiB,uBAAuB;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAe,qBACb,SACY;AACZ,QAAI,QAAQ,eAAe,QAAQ,YAAY;AAC7C,aAAO,CAAC,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAClD;AAEA,QAAI,QAAQ,UAAU;AACpB,aAAO;AAAA,QACL,KAAK,2BAA2B,OAAO;AAAA,QACvC;AAAA,UACE,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAe,2BACb,SACU;AACV,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,QACpB,QAAQ,QAAQ,UAAU,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,eAAe,QAAQ;AAC9C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY,OAAO,mBACjB,eAAe,sBAAsB;AAAA,MACvC,QAAQ,CAAC,MAAM;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAiC;AACrC,UAAM,KAAK,gBAAgB,cAAc;AAAA,EAC3C;AACF;AAlGa,iBAAN;AAAA,MAFN,uBAAO;AAAA,MACP,uBAAO,CAAC,CAAC;AAAA,GACG;;;AGjBb,IAAAC,iBAAmD;AAEnD,IAAAC,kBAIO;AAKA,IAAM,qBAAN,MAAmD;AAAA,EACxD,YAEmB,SACjB;AADiB;AAAA,EAChB;AAAA,EAEH,IAAI,KAAc,KAAe,MAA0B;AACzD,UAAM,YAAY,IAAI,OAAO,QAAQ,IAAI;AAEzC,QAAI,KAAK,QAAQ,eAAe,SAAS,SAAS,GAAG;AACnD,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,WAAW,GAAG,IAAI,MAAM,IAAI,SAAS;AAC3C,UAAM,WAAW,KAAK,YAAY,GAAG;AAErC,0CAAiB,EAAE,UAAU,SAAS,GAAG,MAAM;AAC7C,UAAI,GAAG,UAAU,MAAM;AACrB,cAAM,WAAW,SAAS,IAAI,IAAI,gBAAgB,KAAK,KAAK,EAAE;AAC9D,kDAAqB,IAAI,YAAY,QAAQ;AAC7C,iDAAoB;AAAA,MACtB,CAAC;AAED,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,KAAsB;AACxC,UAAM,YAAY,IAAI,QAAQ,iBAAiB;AAC/C,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAAA,IACtC;AACA,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,aAAO,UAAU,CAAC;AAAA,IACpB;AACA,WAAO,IAAI,MAAM,IAAI,OAAO,iBAAiB;AAAA,EAC/C;AACF;AArCa,qBAAN;AAAA,MADN,2BAAW;AAAA,EAGP,8CAAO,uBAAuB;AAAA,GAFtB;;;ACXb,IAAAC,iBAMO;AACP,kBAAoC;AAEpC,IAAAC,kBAIO;AAIP,IAAM,aAAa,KAAK;AAGjB,IAAM,0BAAN,cAAsC,gCAAoB;AAAA,EAC/D,YAEmB,SACjB;AACA,UAAM;AAFW;AAAA,EAGnB;AAAA,EAEA,MAAM,WAAoB,MAA2B;AACnD,UAAM,MAAM,KAAK,aAAa;AAC9B,UAAM,UAAU,IAAI,WAAoB;AACxC,UAAM,WAAW,IAAI,YAAsB;AAE3C,UAAM,SACJ,qBAAqB,+BACjB,UAAU,UAAU,IACpB,0BAAW;AAEjB,QAAI,UAAU,OAAO,EAAE,qBAAqB,+BAAgB;AAC1D,WAAK,aAAa,WAAW,OAAO;AAAA,IACtC;AAEA,QAAI,qBAAqB,OAAO;AAC9B,YAAM,MAAM,WAAW,IAAI;AAAA,IAC7B,OAAO;AACL,eAAS,OAAO,MAAM,EAAE,KAAK;AAAA,QAC3B,YAAY;AAAA,QACZ,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa,WAAoB,SAAwB;AAC/D,UAAM,QACJ,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAEtE,UAAM,aAAqC,CAAC;AAC5C,UAAM,eAAW,iCAAgB;AAEjC,QAAI,UAAU,YAAY;AACxB,aAAO,OAAO,YAAY,SAAS,UAAU;AAAA,IAC/C;AAEA,eAAW,YAAY,IAAI,QAAQ,IAAI,YAAY,KAAK;AAExD,UAAM,kBAAkB,KAAK,QAAQ,oBAAoB,CAAC;AAE1D,QAAI,gBAAgB,SAAS,KAAK,GAAG;AACnC,iBAAW,KAAK,IAAI,QAAQ;AAAA,IAC9B;AAEA,QAAI,gBAAgB,SAAS,OAAO,GAAG;AACrC,YAAM,QAAQ,QAAQ;AACtB,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,mBAAW,OAAO,IAAI,KAAK,UAAU,KAAK;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,MAAM,GAAG;AACpC,YAAM,cAAc,QAAQ,IAAI,cAAc,KAAK;AACnD,UAAI,YAAY,SAAS,kBAAkB,KAAK,QAAQ,MAAM;AAC5D,cAAM,UAAU,KAAK,UAAU,QAAQ,IAAI;AAC3C,mBAAW,MAAM,IAAI,QAAQ,MAAM,GAAG,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,SAAS,GAAG;AACvC,YAAM,UAAU,EAAE,GAAG,QAAQ,QAAQ;AACrC,aAAO,QAAQ,eAAe;AAC9B,aAAO,QAAQ,QAAQ;AACvB,iBAAW,SAAS,IAAI,KAAK,UAAU,OAAO;AAAA,IAChD;AAEA,UAAM,cAAU,4BAAW;AAC3B,wDAA+B,OAAO,YAAY,OAAO;AAAA,EAC3D;AACF;AA5Ea,0BAAN;AAAA,MADN,sBAAM;AAAA,EAGF,8CAAO,uBAAuB;AAAA,GAFtB;;;ACpBb,IAAAC,kBAAmC;AAE5B,SAAS,KAAK,MAAgC;AACnD,SAAO,SACL,QACA,aACA,YACA;AACA,UAAM,iBAAiB,WAAW;AAClC,UAAM,WAAW,QAAQ,OAAO,WAAW;AAE3C,eAAW,QAAQ,YAAa,MAAiB;AAC/C,YAAM,WAAO,2BAAU,QAAQ;AAE/B,UAAI;AACF,cAAM,SAAS,eAAe,MAAM,MAAM,IAAI;AAE9C,YAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,iBAAO,OACJ,KAAK,CAAC,UAAmB;AACxB,yCAAQ,IAAI;AACZ,mBAAO;AAAA,UACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,yCAAQ,IAAI;AACZ,kBAAM;AAAA,UACR,CAAC;AAAA,QACL;AAEA,qCAAQ,IAAI;AACZ,eAAO;AAAA,MACT,SAAS,OAAO;AACd,qCAAQ,IAAI;AACZ,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["import_common","import_common","import_backend","import_common","import_backend","import_backend"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,344 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
12
+
13
+ // src/traceway.module.ts
14
+ import {
15
+ Global,
16
+ Module
17
+ } from "@nestjs/common";
18
+
19
+ // src/traceway.constants.ts
20
+ var TRACEWAY_MODULE_OPTIONS = "TRACEWAY_MODULE_OPTIONS";
21
+
22
+ // src/traceway.service.ts
23
+ import { Inject, Injectable } from "@nestjs/common";
24
+ import {
25
+ init,
26
+ shutdown,
27
+ captureException,
28
+ captureExceptionWithAttributes,
29
+ captureMessage,
30
+ startSpan,
31
+ endSpan,
32
+ measureTask,
33
+ setTraceAttribute,
34
+ setTraceAttributes,
35
+ getTraceId,
36
+ getTraceContext,
37
+ withTraceContext
38
+ } from "@tracewayapp/backend";
39
+ var TracewayService = class {
40
+ constructor(options) {
41
+ this.options = options;
42
+ }
43
+ initialize() {
44
+ init(this.options.connectionString, {
45
+ debug: this.options.debug,
46
+ version: this.options.version,
47
+ serverName: this.options.serverName,
48
+ sampleRate: this.options.sampleRate,
49
+ errorSampleRate: this.options.errorSampleRate
50
+ });
51
+ }
52
+ async shutdownAsync() {
53
+ await shutdown();
54
+ }
55
+ captureException(error) {
56
+ captureException(error);
57
+ }
58
+ captureExceptionWithAttributes(error, attributes, traceId) {
59
+ captureExceptionWithAttributes(error, attributes, traceId);
60
+ }
61
+ captureMessage(msg, attributes) {
62
+ captureMessage(msg, attributes);
63
+ }
64
+ startSpan(name) {
65
+ return startSpan(name);
66
+ }
67
+ endSpan(span, addToContext = true) {
68
+ endSpan(span, addToContext);
69
+ }
70
+ measureTask(title, fn) {
71
+ measureTask(title, fn);
72
+ }
73
+ setTraceAttribute(key, value) {
74
+ setTraceAttribute(key, value);
75
+ }
76
+ setTraceAttributes(attributes) {
77
+ setTraceAttributes(attributes);
78
+ }
79
+ getTraceId() {
80
+ return getTraceId();
81
+ }
82
+ getTraceContext() {
83
+ return getTraceContext();
84
+ }
85
+ withTraceContext(options, fn) {
86
+ return withTraceContext(options, fn);
87
+ }
88
+ getOptions() {
89
+ return this.options;
90
+ }
91
+ };
92
+ TracewayService = __decorateClass([
93
+ Injectable(),
94
+ __decorateParam(0, Inject(TRACEWAY_MODULE_OPTIONS))
95
+ ], TracewayService);
96
+
97
+ // src/traceway.module.ts
98
+ var TracewayModule = class {
99
+ constructor(tracewayService) {
100
+ this.tracewayService = tracewayService;
101
+ }
102
+ static forRoot(options) {
103
+ const optionsProvider = {
104
+ provide: TRACEWAY_MODULE_OPTIONS,
105
+ useValue: options
106
+ };
107
+ return {
108
+ module: TracewayModule,
109
+ providers: [
110
+ optionsProvider,
111
+ TracewayService,
112
+ {
113
+ provide: "TRACEWAY_INIT",
114
+ useFactory: (service) => {
115
+ service.initialize();
116
+ return true;
117
+ },
118
+ inject: [TracewayService]
119
+ }
120
+ ],
121
+ exports: [TracewayService, TRACEWAY_MODULE_OPTIONS]
122
+ };
123
+ }
124
+ static forRootAsync(options) {
125
+ const asyncProviders = this.createAsyncProviders(options);
126
+ return {
127
+ module: TracewayModule,
128
+ imports: options.imports || [],
129
+ providers: [
130
+ ...asyncProviders,
131
+ TracewayService,
132
+ {
133
+ provide: "TRACEWAY_INIT",
134
+ useFactory: (service) => {
135
+ service.initialize();
136
+ return true;
137
+ },
138
+ inject: [TracewayService]
139
+ }
140
+ ],
141
+ exports: [TracewayService, TRACEWAY_MODULE_OPTIONS]
142
+ };
143
+ }
144
+ static createAsyncProviders(options) {
145
+ if (options.useExisting || options.useFactory) {
146
+ return [this.createAsyncOptionsProvider(options)];
147
+ }
148
+ if (options.useClass) {
149
+ return [
150
+ this.createAsyncOptionsProvider(options),
151
+ {
152
+ provide: options.useClass,
153
+ useClass: options.useClass
154
+ }
155
+ ];
156
+ }
157
+ return [];
158
+ }
159
+ static createAsyncOptionsProvider(options) {
160
+ if (options.useFactory) {
161
+ return {
162
+ provide: TRACEWAY_MODULE_OPTIONS,
163
+ useFactory: options.useFactory,
164
+ inject: options.inject || []
165
+ };
166
+ }
167
+ const inject = options.useExisting || options.useClass;
168
+ if (!inject) {
169
+ throw new Error(
170
+ "TracewayModule: useExisting, useClass, or useFactory must be provided"
171
+ );
172
+ }
173
+ return {
174
+ provide: TRACEWAY_MODULE_OPTIONS,
175
+ useFactory: async (optionsFactory) => optionsFactory.createTracewayOptions(),
176
+ inject: [inject]
177
+ };
178
+ }
179
+ async onModuleDestroy() {
180
+ await this.tracewayService.shutdownAsync();
181
+ }
182
+ };
183
+ TracewayModule = __decorateClass([
184
+ Global(),
185
+ Module({})
186
+ ], TracewayModule);
187
+
188
+ // src/traceway.middleware.ts
189
+ import { Inject as Inject2, Injectable as Injectable2 } from "@nestjs/common";
190
+ import {
191
+ withTraceContext as withTraceContext2,
192
+ setTraceResponseInfo,
193
+ captureCurrentTrace
194
+ } from "@tracewayapp/backend";
195
+ var TracewayMiddleware = class {
196
+ constructor(options) {
197
+ this.options = options;
198
+ }
199
+ use(req, res, next) {
200
+ const routePath = req.route?.path || req.path;
201
+ if (this.options.ignoredRoutes?.includes(routePath)) {
202
+ return next();
203
+ }
204
+ const endpoint = `${req.method} ${routePath}`;
205
+ const clientIP = this.getClientIP(req);
206
+ withTraceContext2({ endpoint, clientIP }, () => {
207
+ res.on("finish", () => {
208
+ const bodySize = parseInt(res.get("content-length") || "0", 10);
209
+ setTraceResponseInfo(res.statusCode, bodySize);
210
+ captureCurrentTrace();
211
+ });
212
+ next();
213
+ });
214
+ }
215
+ getClientIP(req) {
216
+ const forwarded = req.headers["x-forwarded-for"];
217
+ if (typeof forwarded === "string") {
218
+ return forwarded.split(",")[0].trim();
219
+ }
220
+ if (Array.isArray(forwarded)) {
221
+ return forwarded[0];
222
+ }
223
+ return req.ip || req.socket.remoteAddress || "";
224
+ }
225
+ };
226
+ TracewayMiddleware = __decorateClass([
227
+ Injectable2(),
228
+ __decorateParam(0, Inject2(TRACEWAY_MODULE_OPTIONS))
229
+ ], TracewayMiddleware);
230
+
231
+ // src/traceway.filter.ts
232
+ import {
233
+ Catch,
234
+ HttpException,
235
+ HttpStatus,
236
+ Inject as Inject3
237
+ } from "@nestjs/common";
238
+ import { BaseExceptionFilter } from "@nestjs/core";
239
+ import {
240
+ captureExceptionWithAttributes as captureExceptionWithAttributes2,
241
+ getTraceId as getTraceId2,
242
+ getTraceContext as getTraceContext2
243
+ } from "@tracewayapp/backend";
244
+ var BODY_LIMIT = 64 * 1024;
245
+ var TracewayExceptionFilter = class extends BaseExceptionFilter {
246
+ constructor(options) {
247
+ super();
248
+ this.options = options;
249
+ }
250
+ catch(exception, host) {
251
+ const ctx = host.switchToHttp();
252
+ const request = ctx.getRequest();
253
+ const response = ctx.getResponse();
254
+ const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
255
+ if (status >= 500 || !(exception instanceof HttpException)) {
256
+ this.captureError(exception, request);
257
+ }
258
+ if (exception instanceof Error) {
259
+ super.catch(exception, host);
260
+ } else {
261
+ response.status(status).json({
262
+ statusCode: status,
263
+ message: "Internal server error"
264
+ });
265
+ }
266
+ }
267
+ captureError(exception, request) {
268
+ const error = exception instanceof Error ? exception : new Error(String(exception));
269
+ const attributes = {};
270
+ const traceCtx = getTraceContext2();
271
+ if (traceCtx?.attributes) {
272
+ Object.assign(attributes, traceCtx.attributes);
273
+ }
274
+ attributes["user agent"] = request.get("user-agent") || "";
275
+ const recordingFields = this.options.onErrorRecording || [];
276
+ if (recordingFields.includes("url")) {
277
+ attributes["url"] = request.path;
278
+ }
279
+ if (recordingFields.includes("query")) {
280
+ const query = request.query;
281
+ if (Object.keys(query).length > 0) {
282
+ attributes["query"] = JSON.stringify(query);
283
+ }
284
+ }
285
+ if (recordingFields.includes("body")) {
286
+ const contentType = request.get("content-type") || "";
287
+ if (contentType.includes("application/json") && request.body) {
288
+ const bodyStr = JSON.stringify(request.body);
289
+ attributes["body"] = bodyStr.slice(0, BODY_LIMIT);
290
+ }
291
+ }
292
+ if (recordingFields.includes("headers")) {
293
+ const headers = { ...request.headers };
294
+ delete headers["authorization"];
295
+ delete headers["cookie"];
296
+ attributes["headers"] = JSON.stringify(headers);
297
+ }
298
+ const traceId = getTraceId2();
299
+ captureExceptionWithAttributes2(error, attributes, traceId);
300
+ }
301
+ };
302
+ TracewayExceptionFilter = __decorateClass([
303
+ Catch(),
304
+ __decorateParam(0, Inject3(TRACEWAY_MODULE_OPTIONS))
305
+ ], TracewayExceptionFilter);
306
+
307
+ // src/traceway.decorators.ts
308
+ import { startSpan as startSpan2, endSpan as endSpan2 } from "@tracewayapp/backend";
309
+ function Span(name) {
310
+ return function(target, propertyKey, descriptor) {
311
+ const originalMethod = descriptor.value;
312
+ const spanName = name || String(propertyKey);
313
+ descriptor.value = function(...args) {
314
+ const span = startSpan2(spanName);
315
+ try {
316
+ const result = originalMethod.apply(this, args);
317
+ if (result && typeof result.then === "function") {
318
+ return result.then((value) => {
319
+ endSpan2(span);
320
+ return value;
321
+ }).catch((error) => {
322
+ endSpan2(span);
323
+ throw error;
324
+ });
325
+ }
326
+ endSpan2(span);
327
+ return result;
328
+ } catch (error) {
329
+ endSpan2(span);
330
+ throw error;
331
+ }
332
+ };
333
+ return descriptor;
334
+ };
335
+ }
336
+ export {
337
+ Span,
338
+ TRACEWAY_MODULE_OPTIONS,
339
+ TracewayExceptionFilter,
340
+ TracewayMiddleware,
341
+ TracewayModule,
342
+ TracewayService
343
+ };
344
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/traceway.module.ts","../src/traceway.constants.ts","../src/traceway.service.ts","../src/traceway.middleware.ts","../src/traceway.filter.ts","../src/traceway.decorators.ts"],"sourcesContent":["import {\n DynamicModule,\n Global,\n Module,\n OnModuleDestroy,\n Provider,\n} from \"@nestjs/common\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type {\n TracewayModuleOptions,\n TracewayModuleAsyncOptions,\n TracewayOptionsFactory,\n} from \"./traceway.interfaces.js\";\nimport { TracewayService } from \"./traceway.service.js\";\n\n@Global()\n@Module({})\nexport class TracewayModule implements OnModuleDestroy {\n constructor(private readonly tracewayService: TracewayService) {}\n\n static forRoot(options: TracewayModuleOptions): DynamicModule {\n const optionsProvider: Provider = {\n provide: TRACEWAY_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: TracewayModule,\n providers: [\n optionsProvider,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n static forRootAsync(options: TracewayModuleAsyncOptions): DynamicModule {\n const asyncProviders = this.createAsyncProviders(options);\n\n return {\n module: TracewayModule,\n imports: options.imports || [],\n providers: [\n ...asyncProviders,\n TracewayService,\n {\n provide: \"TRACEWAY_INIT\",\n useFactory: (service: TracewayService) => {\n service.initialize();\n return true;\n },\n inject: [TracewayService],\n },\n ],\n exports: [TracewayService, TRACEWAY_MODULE_OPTIONS],\n };\n }\n\n private static createAsyncProviders(\n options: TracewayModuleAsyncOptions,\n ): Provider[] {\n if (options.useExisting || options.useFactory) {\n return [this.createAsyncOptionsProvider(options)];\n }\n\n if (options.useClass) {\n return [\n this.createAsyncOptionsProvider(options),\n {\n provide: options.useClass,\n useClass: options.useClass,\n },\n ];\n }\n\n return [];\n }\n\n private static createAsyncOptionsProvider(\n options: TracewayModuleAsyncOptions,\n ): Provider {\n if (options.useFactory) {\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n }\n\n const inject = options.useExisting || options.useClass;\n if (!inject) {\n throw new Error(\n \"TracewayModule: useExisting, useClass, or useFactory must be provided\",\n );\n }\n\n return {\n provide: TRACEWAY_MODULE_OPTIONS,\n useFactory: async (optionsFactory: TracewayOptionsFactory) =>\n optionsFactory.createTracewayOptions(),\n inject: [inject],\n };\n }\n\n async onModuleDestroy(): Promise<void> {\n await this.tracewayService.shutdownAsync();\n }\n}\n","export const TRACEWAY_MODULE_OPTIONS = \"TRACEWAY_MODULE_OPTIONS\";\n","import { Inject, Injectable } from \"@nestjs/common\";\nimport {\n init,\n shutdown,\n captureException,\n captureExceptionWithAttributes,\n captureMessage,\n startSpan,\n endSpan,\n measureTask,\n setTraceAttribute,\n setTraceAttributes,\n getTraceId,\n getTraceContext,\n withTraceContext,\n type SpanHandle,\n type TraceContextOptions,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayService {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n initialize(): void {\n init(this.options.connectionString, {\n debug: this.options.debug,\n version: this.options.version,\n serverName: this.options.serverName,\n sampleRate: this.options.sampleRate,\n errorSampleRate: this.options.errorSampleRate,\n });\n }\n\n async shutdownAsync(): Promise<void> {\n await shutdown();\n }\n\n captureException(error: Error): void {\n captureException(error);\n }\n\n captureExceptionWithAttributes(\n error: Error,\n attributes?: Record<string, string>,\n traceId?: string,\n ): void {\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n\n captureMessage(msg: string, attributes?: Record<string, string>): void {\n captureMessage(msg, attributes);\n }\n\n startSpan(name: string): SpanHandle {\n return startSpan(name);\n }\n\n endSpan(span: SpanHandle, addToContext: boolean = true): void {\n endSpan(span, addToContext);\n }\n\n measureTask(title: string, fn: () => void | Promise<void>): void {\n measureTask(title, fn);\n }\n\n setTraceAttribute(key: string, value: string): void {\n setTraceAttribute(key, value);\n }\n\n setTraceAttributes(attributes: Record<string, string>): void {\n setTraceAttributes(attributes);\n }\n\n getTraceId(): string | undefined {\n return getTraceId();\n }\n\n getTraceContext() {\n return getTraceContext();\n }\n\n withTraceContext<T>(options: TraceContextOptions, fn: () => T): T {\n return withTraceContext(options, fn);\n }\n\n getOptions(): TracewayModuleOptions {\n return this.options;\n }\n}\n","import { Inject, Injectable, NestMiddleware } from \"@nestjs/common\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport {\n withTraceContext,\n setTraceResponseInfo,\n captureCurrentTrace,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\n@Injectable()\nexport class TracewayMiddleware implements NestMiddleware {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const routePath = req.route?.path || req.path;\n\n if (this.options.ignoredRoutes?.includes(routePath)) {\n return next();\n }\n\n const endpoint = `${req.method} ${routePath}`;\n const clientIP = this.getClientIP(req);\n\n withTraceContext({ endpoint, clientIP }, () => {\n res.on(\"finish\", () => {\n const bodySize = parseInt(res.get(\"content-length\") || \"0\", 10);\n setTraceResponseInfo(res.statusCode, bodySize);\n captureCurrentTrace();\n });\n\n next();\n });\n }\n\n private getClientIP(req: Request): string {\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded === \"string\") {\n return forwarded.split(\",\")[0].trim();\n }\n if (Array.isArray(forwarded)) {\n return forwarded[0];\n }\n return req.ip || req.socket.remoteAddress || \"\";\n }\n}\n","import {\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Inject,\n} from \"@nestjs/common\";\nimport { BaseExceptionFilter } from \"@nestjs/core\";\nimport type { Request, Response } from \"express\";\nimport {\n captureExceptionWithAttributes,\n getTraceId,\n getTraceContext,\n} from \"@tracewayapp/backend\";\nimport { TRACEWAY_MODULE_OPTIONS } from \"./traceway.constants.js\";\nimport type { TracewayModuleOptions } from \"./traceway.interfaces.js\";\n\nconst BODY_LIMIT = 64 * 1024;\n\n@Catch()\nexport class TracewayExceptionFilter extends BaseExceptionFilter {\n constructor(\n @Inject(TRACEWAY_MODULE_OPTIONS)\n private readonly options: TracewayModuleOptions,\n ) {\n super();\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const request = ctx.getRequest<Request>();\n const response = ctx.getResponse<Response>();\n\n const status =\n exception instanceof HttpException\n ? exception.getStatus()\n : HttpStatus.INTERNAL_SERVER_ERROR;\n\n if (status >= 500 || !(exception instanceof HttpException)) {\n this.captureError(exception, request);\n }\n\n if (exception instanceof Error) {\n super.catch(exception, host);\n } else {\n response.status(status).json({\n statusCode: status,\n message: \"Internal server error\",\n });\n }\n }\n\n private captureError(exception: unknown, request: Request): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n\n const attributes: Record<string, string> = {};\n const traceCtx = getTraceContext();\n\n if (traceCtx?.attributes) {\n Object.assign(attributes, traceCtx.attributes);\n }\n\n attributes[\"user agent\"] = request.get(\"user-agent\") || \"\";\n\n const recordingFields = this.options.onErrorRecording || [];\n\n if (recordingFields.includes(\"url\")) {\n attributes[\"url\"] = request.path;\n }\n\n if (recordingFields.includes(\"query\")) {\n const query = request.query;\n if (Object.keys(query).length > 0) {\n attributes[\"query\"] = JSON.stringify(query);\n }\n }\n\n if (recordingFields.includes(\"body\")) {\n const contentType = request.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\") && request.body) {\n const bodyStr = JSON.stringify(request.body);\n attributes[\"body\"] = bodyStr.slice(0, BODY_LIMIT);\n }\n }\n\n if (recordingFields.includes(\"headers\")) {\n const headers = { ...request.headers };\n delete headers[\"authorization\"];\n delete headers[\"cookie\"];\n attributes[\"headers\"] = JSON.stringify(headers);\n }\n\n const traceId = getTraceId();\n captureExceptionWithAttributes(error, attributes, traceId);\n }\n}\n","import { startSpan, endSpan } from \"@tracewayapp/backend\";\n\nexport function Span(name?: string): MethodDecorator {\n return function (\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n const spanName = name || String(propertyKey);\n\n descriptor.value = function (...args: unknown[]) {\n const span = startSpan(spanName);\n\n try {\n const result = originalMethod.apply(this, args);\n\n if (result && typeof result.then === \"function\") {\n return result\n .then((value: unknown) => {\n endSpan(span);\n return value;\n })\n .catch((error: unknown) => {\n endSpan(span);\n throw error;\n });\n }\n\n endSpan(span);\n return result;\n } catch (error) {\n endSpan(span);\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA,EAEE;AAAA,EACA;AAAA,OAGK;;;ACNA,IAAM,0BAA0B;;;ACAvC,SAAS,QAAQ,kBAAkB;AACnC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAKA,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAEmB,SACjB;AADiB;AAAA,EAChB;AAAA,EAEH,aAAmB;AACjB,SAAK,KAAK,QAAQ,kBAAkB;AAAA,MAClC,OAAO,KAAK,QAAQ;AAAA,MACpB,SAAS,KAAK,QAAQ;AAAA,MACtB,YAAY,KAAK,QAAQ;AAAA,MACzB,YAAY,KAAK,QAAQ;AAAA,MACzB,iBAAiB,KAAK,QAAQ;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAA+B;AACnC,UAAM,SAAS;AAAA,EACjB;AAAA,EAEA,iBAAiB,OAAoB;AACnC,qBAAiB,KAAK;AAAA,EACxB;AAAA,EAEA,+BACE,OACA,YACA,SACM;AACN,mCAA+B,OAAO,YAAY,OAAO;AAAA,EAC3D;AAAA,EAEA,eAAe,KAAa,YAA2C;AACrE,mBAAe,KAAK,UAAU;AAAA,EAChC;AAAA,EAEA,UAAU,MAA0B;AAClC,WAAO,UAAU,IAAI;AAAA,EACvB;AAAA,EAEA,QAAQ,MAAkB,eAAwB,MAAY;AAC5D,YAAQ,MAAM,YAAY;AAAA,EAC5B;AAAA,EAEA,YAAY,OAAe,IAAsC;AAC/D,gBAAY,OAAO,EAAE;AAAA,EACvB;AAAA,EAEA,kBAAkB,KAAa,OAAqB;AAClD,sBAAkB,KAAK,KAAK;AAAA,EAC9B;AAAA,EAEA,mBAAmB,YAA0C;AAC3D,uBAAmB,UAAU;AAAA,EAC/B;AAAA,EAEA,aAAiC;AAC/B,WAAO,WAAW;AAAA,EACpB;AAAA,EAEA,kBAAkB;AAChB,WAAO,gBAAgB;AAAA,EACzB;AAAA,EAEA,iBAAoB,SAA8B,IAAgB;AAChE,WAAO,iBAAiB,SAAS,EAAE;AAAA,EACrC;AAAA,EAEA,aAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAvEa,kBAAN;AAAA,EADN,WAAW;AAAA,EAGP,0BAAO,uBAAuB;AAAA,GAFtB;;;AFLN,IAAM,iBAAN,MAAgD;AAAA,EACrD,YAA6B,iBAAkC;AAAlC;AAAA,EAAmC;AAAA,EAEhE,OAAO,QAAQ,SAA+C;AAC5D,UAAM,kBAA4B;AAAA,MAChC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,YAAY,CAAC,YAA6B;AACxC,oBAAQ,WAAW;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,CAAC,iBAAiB,uBAAuB;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAO,aAAa,SAAoD;AACtE,UAAM,iBAAiB,KAAK,qBAAqB,OAAO;AAExD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,QAAQ,WAAW,CAAC;AAAA,MAC7B,WAAW;AAAA,QACT,GAAG;AAAA,QACH;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,YAAY,CAAC,YAA6B;AACxC,oBAAQ,WAAW;AACnB,mBAAO;AAAA,UACT;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,SAAS,CAAC,iBAAiB,uBAAuB;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OAAe,qBACb,SACY;AACZ,QAAI,QAAQ,eAAe,QAAQ,YAAY;AAC7C,aAAO,CAAC,KAAK,2BAA2B,OAAO,CAAC;AAAA,IAClD;AAEA,QAAI,QAAQ,UAAU;AACpB,aAAO;AAAA,QACL,KAAK,2BAA2B,OAAO;AAAA,QACvC;AAAA,UACE,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAe,2BACb,SACU;AACV,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,QACpB,QAAQ,QAAQ,UAAU,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,eAAe,QAAQ;AAC9C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY,OAAO,mBACjB,eAAe,sBAAsB;AAAA,MACvC,QAAQ,CAAC,MAAM;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAiC;AACrC,UAAM,KAAK,gBAAgB,cAAc;AAAA,EAC3C;AACF;AAlGa,iBAAN;AAAA,EAFN,OAAO;AAAA,EACP,OAAO,CAAC,CAAC;AAAA,GACG;;;AGjBb,SAAS,UAAAA,SAAQ,cAAAC,mBAAkC;AAEnD;AAAA,EACE,oBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKA,IAAM,qBAAN,MAAmD;AAAA,EACxD,YAEmB,SACjB;AADiB;AAAA,EAChB;AAAA,EAEH,IAAI,KAAc,KAAe,MAA0B;AACzD,UAAM,YAAY,IAAI,OAAO,QAAQ,IAAI;AAEzC,QAAI,KAAK,QAAQ,eAAe,SAAS,SAAS,GAAG;AACnD,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,WAAW,GAAG,IAAI,MAAM,IAAI,SAAS;AAC3C,UAAM,WAAW,KAAK,YAAY,GAAG;AAErC,IAAAC,kBAAiB,EAAE,UAAU,SAAS,GAAG,MAAM;AAC7C,UAAI,GAAG,UAAU,MAAM;AACrB,cAAM,WAAW,SAAS,IAAI,IAAI,gBAAgB,KAAK,KAAK,EAAE;AAC9D,6BAAqB,IAAI,YAAY,QAAQ;AAC7C,4BAAoB;AAAA,MACtB,CAAC;AAED,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,KAAsB;AACxC,UAAM,YAAY,IAAI,QAAQ,iBAAiB;AAC/C,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAAA,IACtC;AACA,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,aAAO,UAAU,CAAC;AAAA,IACpB;AACA,WAAO,IAAI,MAAM,IAAI,OAAO,iBAAiB;AAAA,EAC/C;AACF;AArCa,qBAAN;AAAA,EADNC,YAAW;AAAA,EAGP,mBAAAC,QAAO,uBAAuB;AAAA,GAFtB;;;ACXb;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,OACK;AACP,SAAS,2BAA2B;AAEpC;AAAA,EACE,kCAAAC;AAAA,EACA,cAAAC;AAAA,EACA,mBAAAC;AAAA,OACK;AAIP,IAAM,aAAa,KAAK;AAGjB,IAAM,0BAAN,cAAsC,oBAAoB;AAAA,EAC/D,YAEmB,SACjB;AACA,UAAM;AAFW;AAAA,EAGnB;AAAA,EAEA,MAAM,WAAoB,MAA2B;AACnD,UAAM,MAAM,KAAK,aAAa;AAC9B,UAAM,UAAU,IAAI,WAAoB;AACxC,UAAM,WAAW,IAAI,YAAsB;AAE3C,UAAM,SACJ,qBAAqB,gBACjB,UAAU,UAAU,IACpB,WAAW;AAEjB,QAAI,UAAU,OAAO,EAAE,qBAAqB,gBAAgB;AAC1D,WAAK,aAAa,WAAW,OAAO;AAAA,IACtC;AAEA,QAAI,qBAAqB,OAAO;AAC9B,YAAM,MAAM,WAAW,IAAI;AAAA,IAC7B,OAAO;AACL,eAAS,OAAO,MAAM,EAAE,KAAK;AAAA,QAC3B,YAAY;AAAA,QACZ,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa,WAAoB,SAAwB;AAC/D,UAAM,QACJ,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAEtE,UAAM,aAAqC,CAAC;AAC5C,UAAM,WAAWC,iBAAgB;AAEjC,QAAI,UAAU,YAAY;AACxB,aAAO,OAAO,YAAY,SAAS,UAAU;AAAA,IAC/C;AAEA,eAAW,YAAY,IAAI,QAAQ,IAAI,YAAY,KAAK;AAExD,UAAM,kBAAkB,KAAK,QAAQ,oBAAoB,CAAC;AAE1D,QAAI,gBAAgB,SAAS,KAAK,GAAG;AACnC,iBAAW,KAAK,IAAI,QAAQ;AAAA,IAC9B;AAEA,QAAI,gBAAgB,SAAS,OAAO,GAAG;AACrC,YAAM,QAAQ,QAAQ;AACtB,UAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,mBAAW,OAAO,IAAI,KAAK,UAAU,KAAK;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,MAAM,GAAG;AACpC,YAAM,cAAc,QAAQ,IAAI,cAAc,KAAK;AACnD,UAAI,YAAY,SAAS,kBAAkB,KAAK,QAAQ,MAAM;AAC5D,cAAM,UAAU,KAAK,UAAU,QAAQ,IAAI;AAC3C,mBAAW,MAAM,IAAI,QAAQ,MAAM,GAAG,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,gBAAgB,SAAS,SAAS,GAAG;AACvC,YAAM,UAAU,EAAE,GAAG,QAAQ,QAAQ;AACrC,aAAO,QAAQ,eAAe;AAC9B,aAAO,QAAQ,QAAQ;AACvB,iBAAW,SAAS,IAAI,KAAK,UAAU,OAAO;AAAA,IAChD;AAEA,UAAM,UAAUC,YAAW;AAC3B,IAAAC,gCAA+B,OAAO,YAAY,OAAO;AAAA,EAC3D;AACF;AA5Ea,0BAAN;AAAA,EADN,MAAM;AAAA,EAGF,mBAAAC,QAAO,uBAAuB;AAAA,GAFtB;;;ACpBb,SAAS,aAAAC,YAAW,WAAAC,gBAAe;AAE5B,SAAS,KAAK,MAAgC;AACnD,SAAO,SACL,QACA,aACA,YACA;AACA,UAAM,iBAAiB,WAAW;AAClC,UAAM,WAAW,QAAQ,OAAO,WAAW;AAE3C,eAAW,QAAQ,YAAa,MAAiB;AAC/C,YAAM,OAAOD,WAAU,QAAQ;AAE/B,UAAI;AACF,cAAM,SAAS,eAAe,MAAM,MAAM,IAAI;AAE9C,YAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,iBAAO,OACJ,KAAK,CAAC,UAAmB;AACxB,YAAAC,SAAQ,IAAI;AACZ,mBAAO;AAAA,UACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,YAAAA,SAAQ,IAAI;AACZ,kBAAM;AAAA,UACR,CAAC;AAAA,QACL;AAEA,QAAAA,SAAQ,IAAI;AACZ,eAAO;AAAA,MACT,SAAS,OAAO;AACd,QAAAA,SAAQ,IAAI;AACZ,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["Inject","Injectable","withTraceContext","withTraceContext","Injectable","Inject","Inject","captureExceptionWithAttributes","getTraceId","getTraceContext","getTraceContext","getTraceId","captureExceptionWithAttributes","Inject","startSpan","endSpan"]}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@tracewayapp/nestjs",
3
+ "version": "0.2.0",
4
+ "description": "Traceway NestJS integration with module, middleware, and decorators",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "dev": "tsup --watch"
24
+ },
25
+ "dependencies": {
26
+ "@tracewayapp/backend": "0.2.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@nestjs/common": "^10.0.0",
30
+ "@nestjs/core": "^10.0.0",
31
+ "express": "^4.18.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/express": "^4.17.17"
35
+ }
36
+ }