logixia 1.8.1 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{index-DXcAI2Bp.d.ts → index-ClPZrfIU.d.ts} +4 -5
  3. package/dist/index-ClPZrfIU.d.ts.map +1 -0
  4. package/dist/{index-EMjeeifm.d.mts → index-CthBT3t8.d.mts} +4 -5
  5. package/dist/index-CthBT3t8.d.mts.map +1 -0
  6. package/dist/index.d.mts +16 -20
  7. package/dist/index.d.mts.map +1 -1
  8. package/dist/index.d.ts +16 -20
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +21 -20
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +20 -19
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/{logitron-logger.module-kQTARPqg.mjs → logitron-logger.module-DucvDnxZ.mjs} +7 -21
  15. package/dist/logitron-logger.module-DucvDnxZ.mjs.map +1 -0
  16. package/dist/{logitron-logger.module-BgWyqoRV.d.ts → logitron-logger.module-Dx2mUz-g.d.ts} +4 -4
  17. package/dist/{logitron-logger.module-BgWyqoRV.d.ts.map → logitron-logger.module-Dx2mUz-g.d.ts.map} +1 -1
  18. package/dist/{logitron-logger.module-EX78H9nm.js → logitron-logger.module-Fof9Er2E.js} +6 -26
  19. package/dist/logitron-logger.module-Fof9Er2E.js.map +1 -0
  20. package/dist/{logitron-logger.module-CyrFeLgZ.d.mts → logitron-logger.module-KU_L04y1.d.mts} +4 -4
  21. package/dist/{logitron-logger.module-CyrFeLgZ.d.mts.map → logitron-logger.module-KU_L04y1.d.mts.map} +1 -1
  22. package/dist/middleware.d.mts +3 -3
  23. package/dist/middleware.d.ts +3 -3
  24. package/dist/middleware.js +12 -12
  25. package/dist/middleware.js.map +1 -1
  26. package/dist/middleware.mjs +12 -12
  27. package/dist/middleware.mjs.map +1 -1
  28. package/dist/nest.d.mts +6 -7
  29. package/dist/nest.d.mts.map +1 -1
  30. package/dist/nest.d.ts +6 -7
  31. package/dist/nest.d.ts.map +1 -1
  32. package/dist/nest.js +11 -14
  33. package/dist/nest.js.map +1 -1
  34. package/dist/nest.mjs +11 -14
  35. package/dist/nest.mjs.map +1 -1
  36. package/dist/testing.d.mts +1 -1
  37. package/dist/testing.d.ts +1 -1
  38. package/dist/transports.d.mts +1 -1
  39. package/dist/transports.d.ts +1 -1
  40. package/package.json +1 -1
  41. package/dist/index-DXcAI2Bp.d.ts.map +0 -1
  42. package/dist/index-EMjeeifm.d.mts.map +0 -1
  43. package/dist/logitron-logger.module-EX78H9nm.js.map +0 -1
  44. package/dist/logitron-logger.module-kQTARPqg.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { T as TraceIdConfig, _ as LogLevelString, d as ILogger, f as ILoggerDefault, m as LogEntry, v as LoggerConfig, y as LoggerWithLevels } from "./index-EMjeeifm.mjs";
1
+ import { T as TraceIdConfig, _ as LogLevelString, d as ILogger, f as ILoggerDefault, m as LogEntry, v as LoggerConfig, y as LoggerWithLevels } from "./index-CthBT3t8.mjs";
2
2
  import * as _nestjs_common0 from "@nestjs/common";
3
3
  import { CallHandler, ExecutionContext, InjectionToken, LoggerService, MiddlewareConsumer, ModuleMetadata, NestInterceptor, NestModule, OptionalFactoryDependency, Type } from "@nestjs/common";
4
4
  import { Observable } from "rxjs";
@@ -421,7 +421,7 @@ declare class LogixiaLoggerModule implements NestModule {
421
421
  inject: string[];
422
422
  useValue?: never;
423
423
  })[];
424
- exports: (string | typeof WebSocketTraceInterceptor | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor)[];
424
+ exports: (string | typeof WebSocketTraceInterceptor | typeof KafkaTraceInterceptor | typeof LogixiaLoggerService)[];
425
425
  global: boolean;
426
426
  };
427
427
  /**
@@ -458,7 +458,7 @@ declare class LogixiaLoggerModule implements NestModule {
458
458
  useFactory: (traceConfig: any) => WebSocketTraceInterceptor;
459
459
  inject: string[];
460
460
  })[];
461
- exports: (string | typeof WebSocketTraceInterceptor | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor)[];
461
+ exports: (string | typeof WebSocketTraceInterceptor | typeof KafkaTraceInterceptor | typeof LogixiaLoggerService)[];
462
462
  global: boolean;
463
463
  };
464
464
  /**
@@ -478,4 +478,4 @@ declare class LogixiaLoggerModule implements NestModule {
478
478
  }
479
479
  //#endregion
480
480
  export { LogixiaOptionsFactory as a, LogixiaLoggerService as c, createLogger as d, LogixiaPlugin as f, usePlugin as h, LogixiaLoggerModule as i, LogixiaServiceWithLevels as l, globalPluginRegistry as m, LOGIXIA_LOGGER_PREFIX as n, WebSocketTraceInterceptor as o, PluginRegistry as p, LogixiaAsyncOptions as r, KafkaTraceInterceptor as s, LOGIXIA_LOGGER_CONFIG as t, LogixiaLogger as u };
481
- //# sourceMappingURL=logitron-logger.module-CyrFeLgZ.d.mts.map
481
+ //# sourceMappingURL=logitron-logger.module-KU_L04y1.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logitron-logger.module-CyrFeLgZ.d.mts","names":[],"sources":["../src/plugin.ts","../src/core/logitron-logger.ts","../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"logitron-logger.module-KU_L04y1.d.mts","names":[],"sources":["../src/plugin.ts","../src/core/logitron-logger.ts","../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { l as IBaseLogger } from "./index-EMjeeifm.mjs";
1
+ import { l as IBaseLogger } from "./index-CthBT3t8.mjs";
2
2
 
3
3
  //#region src/middleware/http-logger.d.ts
4
4
 
@@ -27,10 +27,10 @@ interface HttpLoggerOptions {
27
27
  */
28
28
  extraFields?: (req: IncomingRequest) => Record<string, unknown>;
29
29
  /**
30
- * Request ID header. Default: 'x-request-id'.
30
+ * Trace ID header. Default: 'x-trace-id'.
31
31
  * If the header is absent, a short random ID is generated.
32
32
  */
33
- requestIdHeader?: string;
33
+ traceIdHeader?: string;
34
34
  /**
35
35
  * Headers to redact from logged output.
36
36
  * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].
@@ -1,4 +1,4 @@
1
- import { l as IBaseLogger } from "./index-DXcAI2Bp.js";
1
+ import { l as IBaseLogger } from "./index-ClPZrfIU.js";
2
2
 
3
3
  //#region src/middleware/http-logger.d.ts
4
4
 
@@ -27,10 +27,10 @@ interface HttpLoggerOptions {
27
27
  */
28
28
  extraFields?: (req: IncomingRequest) => Record<string, unknown>;
29
29
  /**
30
- * Request ID header. Default: 'x-request-id'.
30
+ * Trace ID header. Default: 'x-trace-id'.
31
31
  * If the header is absent, a short random ID is generated.
32
32
  */
33
- requestIdHeader?: string;
33
+ traceIdHeader?: string;
34
34
  /**
35
35
  * Headers to redact from logged output.
36
36
  * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].
@@ -15,11 +15,11 @@ function sanitizeHeaders(headers, redactSet) {
15
15
  function shortId() {
16
16
  return Math.random().toString(36).slice(2, 10);
17
17
  }
18
- function buildBaseFields(req, requestId, options) {
18
+ function buildBaseFields(req, traceId, options) {
19
19
  var _req$method, _req$socket;
20
20
  const redactSet = options.redactHeaders ? new Set(options.redactHeaders.map((h) => h.toLowerCase())) : DEFAULT_REDACT_HEADERS;
21
21
  const fields = {
22
- requestId,
22
+ traceId,
23
23
  method: ((_req$method = req.method) === null || _req$method === void 0 ? void 0 : _req$method.toUpperCase()) ?? "UNKNOWN",
24
24
  url: req.url ?? "/",
25
25
  ip: req.ip ?? ((_req$socket = req.socket) === null || _req$socket === void 0 ? void 0 : _req$socket.remoteAddress) ?? "unknown",
@@ -32,16 +32,16 @@ function buildBaseFields(req, requestId, options) {
32
32
  * Create an Express / Connect compatible middleware that replaces Morgan.
33
33
  */
34
34
  function createExpressMiddleware(logger, options = {}) {
35
- const { skip, logBody, bodyMaxBytes, requestIdHeader = "x-request-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
35
+ const { skip, logBody, bodyMaxBytes, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
36
36
  return function logixiaHttpMiddleware(req, res, next) {
37
37
  var _req$headers, _res$once, _res$once2;
38
38
  if (skip === null || skip === void 0 ? void 0 : skip(req)) {
39
39
  next();
40
40
  return;
41
41
  }
42
- const requestId = ((_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers[requestIdHeader]) ?? shortId();
42
+ const traceId = ((_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers[traceIdHeader]) ?? shortId();
43
43
  const startMs = Date.now();
44
- const baseFields = buildBaseFields(req, requestId, options);
44
+ const baseFields = buildBaseFields(req, traceId, options);
45
45
  if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", {
46
46
  ...baseFields,
47
47
  ...logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}
@@ -78,7 +78,7 @@ function createExpressMiddleware(logger, options = {}) {
78
78
  * ```
79
79
  */
80
80
  function createFastifyPlugin(logger, options = {}) {
81
- const { skip, requestIdHeader = "x-request-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
81
+ const { skip, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
82
82
  return function logixiaFastifyPlugin(fastify, _opts, done) {
83
83
  fastify.addHook("onRequest", (request, _reply, hookDone) => {
84
84
  var _req$headers2;
@@ -87,10 +87,10 @@ function createFastifyPlugin(logger, options = {}) {
87
87
  hookDone();
88
88
  return;
89
89
  }
90
- const requestId = ((_req$headers2 = req.headers) === null || _req$headers2 === void 0 ? void 0 : _req$headers2[requestIdHeader]) ?? shortId();
90
+ const traceId = ((_req$headers2 = req.headers) === null || _req$headers2 === void 0 ? void 0 : _req$headers2[traceIdHeader]) ?? shortId();
91
91
  req._logixiaStart = Date.now();
92
- req._logixiaId = requestId;
93
- if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", buildBaseFields(req, requestId, options));
92
+ req._logixiaId = traceId;
93
+ if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", buildBaseFields(req, traceId, options));
94
94
  hookDone();
95
95
  });
96
96
  fastify.addHook("onResponse", (request, reply, hookDone) => {
@@ -98,15 +98,15 @@ function createFastifyPlugin(logger, options = {}) {
98
98
  const rep = reply;
99
99
  const duration = Date.now() - (req._logixiaStart ?? Date.now());
100
100
  const status = rep.statusCode ?? 0;
101
- const requestId = req._logixiaId ?? shortId();
101
+ const traceId = req._logixiaId ?? shortId();
102
102
  const level = status >= 500 ? errorLevel : responseLevel;
103
103
  logger.logLevel(level, "request completed", {
104
- ...buildBaseFields(req, requestId, options),
104
+ ...buildBaseFields(req, traceId, options),
105
105
  statusCode: status,
106
106
  duration
107
107
  });
108
108
  if (duration > slowRequestThresholdMs) logger.warn("slow request detected", {
109
- requestId,
109
+ traceId,
110
110
  url: req.url,
111
111
  method: req.method,
112
112
  duration,
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","names":["out: Record<string, unknown>","fields: Record<string, unknown>"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with requestId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\n/* eslint-disable sonarjs/void-use -- intentional fire-and-forget in sync middleware callbacks */\nimport type { IBaseLogger } from '../types';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Request ID header. Default: 'x-request-id'.\n * If the header is absent, a short random ID is generated.\n */\n requestIdHeader?: string;\n /**\n * Headers to redact from logged output.\n * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].\n */\n redactHeaders?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport interface IncomingRequest {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: unknown;\n socket?: { remoteAddress?: string };\n ip?: string;\n}\n\nexport interface OutgoingResponse {\n statusCode?: number;\n on?: (event: string, cb: () => void) => void;\n once?: (event: string, cb: () => void) => void;\n getHeader?: (name: string) => string | number | string[] | undefined;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst DEFAULT_REDACT_HEADERS = new Set(['authorization', 'cookie', 'set-cookie', 'x-api-key']);\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = redactSet.has(k.toLowerCase()) ? '[REDACTED]' : v;\n }\n return out;\n}\n\nfunction shortId(): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security request ID\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n requestId: string,\n options: HttpLoggerOptions\n): Record<string, unknown> {\n const redactSet = options.redactHeaders\n ? new Set(options.redactHeaders.map((h) => h.toLowerCase()))\n : DEFAULT_REDACT_HEADERS;\n\n const fields: Record<string, unknown> = {\n requestId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: req.url ?? '/',\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n requestIdHeader = 'x-request-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const requestId = (req.headers?.[requestIdHeader] as string | undefined) ?? shortId();\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, requestId, options);\n\n // Log request start\n if (requestLevel !== 'silent') {\n void logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n });\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n const onFinish = (): void => {\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also listen to 'close' (client disconnected before response finished)\n res.once?.('close', () => {\n if ((res.statusCode ?? 0) === 0) onFinish();\n });\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n requestIdHeader = 'x-request-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaFastifyPlugin(\n fastify: FastifyInstance,\n _opts: unknown,\n done: () => void\n ): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const requestId = (req.headers?.[requestIdHeader] as string | undefined) ?? shortId();\n req._logixiaStart = Date.now();\n req._logixiaId = requestId;\n\n if (requestLevel !== 'silent') {\n void logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, requestId, options)\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - (req._logixiaStart ?? Date.now());\n const status = rep.statusCode ?? 0;\n const requestId = req._logixiaId ?? shortId();\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...buildBaseFields(req, requestId, options),\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n requestId,\n url: req.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n\n hookDone();\n });\n\n done();\n };\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = JSON.stringify(body);\n if (str.length > maxBytes) {\n return str.slice(0, maxBytes) + '…[truncated]';\n }\n }\n return body;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","names":["out: Record<string, unknown>","fields: Record<string, unknown>"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with traceId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\n/* eslint-disable sonarjs/void-use -- intentional fire-and-forget in sync middleware callbacks */\nimport type { IBaseLogger } from '../types';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Trace ID header. Default: 'x-trace-id'.\n * If the header is absent, a short random ID is generated.\n */\n traceIdHeader?: string;\n /**\n * Headers to redact from logged output.\n * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].\n */\n redactHeaders?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport interface IncomingRequest {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: unknown;\n socket?: { remoteAddress?: string };\n ip?: string;\n}\n\nexport interface OutgoingResponse {\n statusCode?: number;\n on?: (event: string, cb: () => void) => void;\n once?: (event: string, cb: () => void) => void;\n getHeader?: (name: string) => string | number | string[] | undefined;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst DEFAULT_REDACT_HEADERS = new Set(['authorization', 'cookie', 'set-cookie', 'x-api-key']);\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = redactSet.has(k.toLowerCase()) ? '[REDACTED]' : v;\n }\n return out;\n}\n\nfunction shortId(): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security request ID\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n traceId: string,\n options: HttpLoggerOptions\n): Record<string, unknown> {\n const redactSet = options.redactHeaders\n ? new Set(options.redactHeaders.map((h) => h.toLowerCase()))\n : DEFAULT_REDACT_HEADERS;\n\n const fields: Record<string, unknown> = {\n traceId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: req.url ?? '/',\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n traceIdHeader = 'x-trace-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const traceId = (req.headers?.[traceIdHeader] as string | undefined) ?? shortId();\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, traceId, options);\n\n // Log request start\n if (requestLevel !== 'silent') {\n void logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n });\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n const onFinish = (): void => {\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also listen to 'close' (client disconnected before response finished)\n res.once?.('close', () => {\n if ((res.statusCode ?? 0) === 0) onFinish();\n });\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n traceIdHeader = 'x-trace-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaFastifyPlugin(\n fastify: FastifyInstance,\n _opts: unknown,\n done: () => void\n ): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const traceId = (req.headers?.[traceIdHeader] as string | undefined) ?? shortId();\n req._logixiaStart = Date.now();\n req._logixiaId = traceId;\n\n if (requestLevel !== 'silent') {\n void logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, traceId, options)\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - (req._logixiaStart ?? Date.now());\n const status = rep.statusCode ?? 0;\n const traceId = req._logixiaId ?? shortId();\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...buildBaseFields(req, traceId, options),\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n traceId,\n url: req.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n\n hookDone();\n });\n\n done();\n };\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = JSON.stringify(body);\n if (str.length > maxBytes) {\n return str.slice(0, maxBytes) + '…[truncated]';\n }\n }\n return body;\n}\n"],"mappings":"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"}
@@ -14,11 +14,11 @@ function sanitizeHeaders(headers, redactSet) {
14
14
  function shortId() {
15
15
  return Math.random().toString(36).slice(2, 10);
16
16
  }
17
- function buildBaseFields(req, requestId, options) {
17
+ function buildBaseFields(req, traceId, options) {
18
18
  var _req$method, _req$socket;
19
19
  const redactSet = options.redactHeaders ? new Set(options.redactHeaders.map((h) => h.toLowerCase())) : DEFAULT_REDACT_HEADERS;
20
20
  const fields = {
21
- requestId,
21
+ traceId,
22
22
  method: ((_req$method = req.method) === null || _req$method === void 0 ? void 0 : _req$method.toUpperCase()) ?? "UNKNOWN",
23
23
  url: req.url ?? "/",
24
24
  ip: req.ip ?? ((_req$socket = req.socket) === null || _req$socket === void 0 ? void 0 : _req$socket.remoteAddress) ?? "unknown",
@@ -31,16 +31,16 @@ function buildBaseFields(req, requestId, options) {
31
31
  * Create an Express / Connect compatible middleware that replaces Morgan.
32
32
  */
33
33
  function createExpressMiddleware(logger, options = {}) {
34
- const { skip, logBody, bodyMaxBytes, requestIdHeader = "x-request-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
34
+ const { skip, logBody, bodyMaxBytes, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
35
35
  return function logixiaHttpMiddleware(req, res, next) {
36
36
  var _req$headers, _res$once, _res$once2;
37
37
  if (skip === null || skip === void 0 ? void 0 : skip(req)) {
38
38
  next();
39
39
  return;
40
40
  }
41
- const requestId = ((_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers[requestIdHeader]) ?? shortId();
41
+ const traceId = ((_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers[traceIdHeader]) ?? shortId();
42
42
  const startMs = Date.now();
43
- const baseFields = buildBaseFields(req, requestId, options);
43
+ const baseFields = buildBaseFields(req, traceId, options);
44
44
  if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", {
45
45
  ...baseFields,
46
46
  ...logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}
@@ -77,7 +77,7 @@ function createExpressMiddleware(logger, options = {}) {
77
77
  * ```
78
78
  */
79
79
  function createFastifyPlugin(logger, options = {}) {
80
- const { skip, requestIdHeader = "x-request-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
80
+ const { skip, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
81
81
  return function logixiaFastifyPlugin(fastify, _opts, done) {
82
82
  fastify.addHook("onRequest", (request, _reply, hookDone) => {
83
83
  var _req$headers2;
@@ -86,10 +86,10 @@ function createFastifyPlugin(logger, options = {}) {
86
86
  hookDone();
87
87
  return;
88
88
  }
89
- const requestId = ((_req$headers2 = req.headers) === null || _req$headers2 === void 0 ? void 0 : _req$headers2[requestIdHeader]) ?? shortId();
89
+ const traceId = ((_req$headers2 = req.headers) === null || _req$headers2 === void 0 ? void 0 : _req$headers2[traceIdHeader]) ?? shortId();
90
90
  req._logixiaStart = Date.now();
91
- req._logixiaId = requestId;
92
- if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", buildBaseFields(req, requestId, options));
91
+ req._logixiaId = traceId;
92
+ if (requestLevel !== "silent") logger.logLevel(requestLevel, "request started", buildBaseFields(req, traceId, options));
93
93
  hookDone();
94
94
  });
95
95
  fastify.addHook("onResponse", (request, reply, hookDone) => {
@@ -97,15 +97,15 @@ function createFastifyPlugin(logger, options = {}) {
97
97
  const rep = reply;
98
98
  const duration = Date.now() - (req._logixiaStart ?? Date.now());
99
99
  const status = rep.statusCode ?? 0;
100
- const requestId = req._logixiaId ?? shortId();
100
+ const traceId = req._logixiaId ?? shortId();
101
101
  const level = status >= 500 ? errorLevel : responseLevel;
102
102
  logger.logLevel(level, "request completed", {
103
- ...buildBaseFields(req, requestId, options),
103
+ ...buildBaseFields(req, traceId, options),
104
104
  statusCode: status,
105
105
  duration
106
106
  });
107
107
  if (duration > slowRequestThresholdMs) logger.warn("slow request detected", {
108
- requestId,
108
+ traceId,
109
109
  url: req.url,
110
110
  method: req.method,
111
111
  duration,
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.mjs","names":["out: Record<string, unknown>","fields: Record<string, unknown>"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with requestId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\n/* eslint-disable sonarjs/void-use -- intentional fire-and-forget in sync middleware callbacks */\nimport type { IBaseLogger } from '../types';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Request ID header. Default: 'x-request-id'.\n * If the header is absent, a short random ID is generated.\n */\n requestIdHeader?: string;\n /**\n * Headers to redact from logged output.\n * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].\n */\n redactHeaders?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport interface IncomingRequest {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: unknown;\n socket?: { remoteAddress?: string };\n ip?: string;\n}\n\nexport interface OutgoingResponse {\n statusCode?: number;\n on?: (event: string, cb: () => void) => void;\n once?: (event: string, cb: () => void) => void;\n getHeader?: (name: string) => string | number | string[] | undefined;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst DEFAULT_REDACT_HEADERS = new Set(['authorization', 'cookie', 'set-cookie', 'x-api-key']);\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = redactSet.has(k.toLowerCase()) ? '[REDACTED]' : v;\n }\n return out;\n}\n\nfunction shortId(): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security request ID\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n requestId: string,\n options: HttpLoggerOptions\n): Record<string, unknown> {\n const redactSet = options.redactHeaders\n ? new Set(options.redactHeaders.map((h) => h.toLowerCase()))\n : DEFAULT_REDACT_HEADERS;\n\n const fields: Record<string, unknown> = {\n requestId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: req.url ?? '/',\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n requestIdHeader = 'x-request-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const requestId = (req.headers?.[requestIdHeader] as string | undefined) ?? shortId();\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, requestId, options);\n\n // Log request start\n if (requestLevel !== 'silent') {\n void logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n });\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n const onFinish = (): void => {\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also listen to 'close' (client disconnected before response finished)\n res.once?.('close', () => {\n if ((res.statusCode ?? 0) === 0) onFinish();\n });\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n requestIdHeader = 'x-request-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaFastifyPlugin(\n fastify: FastifyInstance,\n _opts: unknown,\n done: () => void\n ): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const requestId = (req.headers?.[requestIdHeader] as string | undefined) ?? shortId();\n req._logixiaStart = Date.now();\n req._logixiaId = requestId;\n\n if (requestLevel !== 'silent') {\n void logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, requestId, options)\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - (req._logixiaStart ?? Date.now());\n const status = rep.statusCode ?? 0;\n const requestId = req._logixiaId ?? shortId();\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...buildBaseFields(req, requestId, options),\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n requestId,\n url: req.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n\n hookDone();\n });\n\n done();\n };\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = JSON.stringify(body);\n if (str.length > maxBytes) {\n return str.slice(0, maxBytes) + '…[truncated]';\n }\n }\n return body;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware.mjs","names":["out: Record<string, unknown>","fields: Record<string, unknown>"],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":["/**\n * HTTP request/response logging middleware — Morgan replacement.\n *\n * Fixes every documented Morgan bug:\n * - statusCode always captured correctly, even for requests > 20 s\n * - Logs request START (with traceId) and response FINISH (with duration)\n * - Captures errors before and after response\n * - Auto-redacts Authorization / Cookie / Set-Cookie headers\n * - Slow-request warnings\n * - Skip predicates for health-check routes / static assets\n *\n * @example Express\n * ```ts\n * import { createExpressMiddleware } from 'logixia/middleware';\n * app.use(createExpressMiddleware(logger));\n * ```\n *\n * @example Fastify\n * ```ts\n * import { createFastifyPlugin } from 'logixia/middleware';\n * await fastify.register(createFastifyPlugin(logger));\n * ```\n */\n\n/* eslint-disable sonarjs/void-use -- intentional fire-and-forget in sync middleware callbacks */\nimport type { IBaseLogger } from '../types';\n\n// ── Shared types ─────────────────────────────────────────────────────────────\n\nexport interface HttpLoggerOptions {\n /**\n * Skip logging for a request. Called before any I/O.\n * @example `skip: (req) => req.url === '/health'`\n */\n skip?: (req: IncomingRequest) => boolean;\n /**\n * Log request body (POST/PUT/PATCH). Capped at `bodyMaxBytes` (default: 4096).\n * Redaction still applies to the captured body.\n * Default: false.\n */\n logBody?: boolean;\n /** Max bytes of body to capture. Default: 4096. */\n bodyMaxBytes?: number;\n /**\n * Emit a WARN log when a request duration exceeds this threshold (ms).\n * Default: 1000.\n */\n slowRequestThresholdMs?: number;\n /**\n * Additional fields to include in every log entry.\n * @example `extraFields: (req) => ({ tenantId: req.headers['x-tenant-id'] })`\n */\n extraFields?: (req: IncomingRequest) => Record<string, unknown>;\n /**\n * Trace ID header. Default: 'x-trace-id'.\n * If the header is absent, a short random ID is generated.\n */\n traceIdHeader?: string;\n /**\n * Headers to redact from logged output.\n * Default: ['authorization', 'cookie', 'set-cookie', 'x-api-key'].\n */\n redactHeaders?: string[];\n /**\n * Log level for request-start entries. Default: 'debug'.\n * Set to 'silent' to suppress request-start logs entirely.\n */\n requestLevel?: string;\n /** Log level for successful response entries. Default: 'info'. */\n responseLevel?: string;\n /** Log level for error responses (status ≥ 500). Default: 'error'. */\n errorLevel?: string;\n}\n\n// Minimal structural types so we don't need @types/express / fastify in core\nexport interface IncomingRequest {\n method?: string;\n url?: string;\n headers?: Record<string, string | string[] | undefined>;\n body?: unknown;\n socket?: { remoteAddress?: string };\n ip?: string;\n}\n\nexport interface OutgoingResponse {\n statusCode?: number;\n on?: (event: string, cb: () => void) => void;\n once?: (event: string, cb: () => void) => void;\n getHeader?: (name: string) => string | number | string[] | undefined;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nconst DEFAULT_REDACT_HEADERS = new Set(['authorization', 'cookie', 'set-cookie', 'x-api-key']);\n\nfunction sanitizeHeaders(\n headers: Record<string, string | string[] | undefined> | undefined,\n redactSet: Set<string>\n): Record<string, unknown> {\n if (!headers) return {};\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(headers)) {\n out[k] = redactSet.has(k.toLowerCase()) ? '[REDACTED]' : v;\n }\n return out;\n}\n\nfunction shortId(): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security request ID\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction buildBaseFields(\n req: IncomingRequest,\n traceId: string,\n options: HttpLoggerOptions\n): Record<string, unknown> {\n const redactSet = options.redactHeaders\n ? new Set(options.redactHeaders.map((h) => h.toLowerCase()))\n : DEFAULT_REDACT_HEADERS;\n\n const fields: Record<string, unknown> = {\n traceId,\n method: req.method?.toUpperCase() ?? 'UNKNOWN',\n url: req.url ?? '/',\n ip: req.ip ?? req.socket?.remoteAddress ?? 'unknown',\n headers: sanitizeHeaders(req.headers, redactSet),\n };\n\n if (options.extraFields) {\n Object.assign(fields, options.extraFields(req));\n }\n\n return fields;\n}\n\n// ── Express middleware ────────────────────────────────────────────────────────\n\n/**\n * Create an Express / Connect compatible middleware that replaces Morgan.\n */\nexport function createExpressMiddleware(\n logger: IBaseLogger,\n options: HttpLoggerOptions = {}\n): (req: IncomingRequest, res: OutgoingResponse, next: () => void) => void {\n const {\n skip,\n logBody,\n bodyMaxBytes,\n traceIdHeader = 'x-trace-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaHttpMiddleware(\n req: IncomingRequest,\n res: OutgoingResponse,\n next: () => void\n ): void {\n if (skip?.(req)) {\n next();\n return;\n }\n\n const traceId = (req.headers?.[traceIdHeader] as string | undefined) ?? shortId();\n const startMs = Date.now();\n const baseFields = buildBaseFields(req, traceId, options);\n\n // Log request start\n if (requestLevel !== 'silent') {\n void logger.logLevel(requestLevel, 'request started', {\n ...baseFields,\n ...(logBody && req.body ? { body: truncateBody(req.body, bodyMaxBytes) } : {}),\n });\n }\n\n // Hook into the response 'finish' event — fires after headers + body are sent.\n // This is what Morgan gets wrong for slow requests (it uses 'close' which may\n // fire before the status code is set on some Node versions).\n const onFinish = (): void => {\n const duration = Date.now() - startMs;\n const status = res.statusCode ?? 0;\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...baseFields,\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n ...baseFields,\n statusCode: status,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n };\n\n res.once?.('finish', onFinish);\n // Fallback: also listen to 'close' (client disconnected before response finished)\n res.once?.('close', () => {\n if ((res.statusCode ?? 0) === 0) onFinish();\n });\n\n next();\n };\n}\n\n// ── Fastify plugin ─────────────────────────────────────────────────────────────\n\nexport interface FastifyInstance {\n addHook: (name: string, fn: (req: unknown, reply: unknown, done: () => void) => void) => void;\n}\n\n/**\n * Create a Fastify plugin (a function you pass to `fastify.register()`).\n *\n * @example\n * ```ts\n * await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));\n * ```\n */\nexport function createFastifyPlugin(logger: IBaseLogger, options: HttpLoggerOptions = {}) {\n const {\n skip,\n traceIdHeader = 'x-trace-id',\n requestLevel = 'debug',\n responseLevel = 'info',\n errorLevel = 'error',\n slowRequestThresholdMs = 1000,\n } = options;\n\n return function logixiaFastifyPlugin(\n fastify: FastifyInstance,\n _opts: unknown,\n done: () => void\n ): void {\n fastify.addHook('onRequest', (request: unknown, _reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n if (skip?.(req)) {\n hookDone();\n return;\n }\n\n const traceId = (req.headers?.[traceIdHeader] as string | undefined) ?? shortId();\n req._logixiaStart = Date.now();\n req._logixiaId = traceId;\n\n if (requestLevel !== 'silent') {\n void logger.logLevel(\n requestLevel,\n 'request started',\n buildBaseFields(req, traceId, options)\n );\n }\n hookDone();\n });\n\n fastify.addHook('onResponse', (request: unknown, reply: unknown, hookDone: () => void) => {\n const req = request as IncomingRequest & { _logixiaStart?: number; _logixiaId?: string };\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - (req._logixiaStart ?? Date.now());\n const status = rep.statusCode ?? 0;\n const traceId = req._logixiaId ?? shortId();\n const level = status >= 500 ? errorLevel : responseLevel;\n\n void logger.logLevel(level, 'request completed', {\n ...buildBaseFields(req, traceId, options),\n statusCode: status,\n duration,\n });\n\n if (duration > slowRequestThresholdMs) {\n void logger.warn('slow request detected', {\n traceId,\n url: req.url,\n method: req.method,\n duration,\n threshold: slowRequestThresholdMs,\n });\n }\n\n hookDone();\n });\n\n done();\n };\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction truncateBody(body: unknown, maxBytes = 4096): unknown {\n if (typeof body === 'string') {\n return body.length > maxBytes ? body.slice(0, maxBytes) + '…[truncated]' : body;\n }\n if (body && typeof body === 'object') {\n const str = JSON.stringify(body);\n if (str.length > maxBytes) {\n return str.slice(0, maxBytes) + '…[truncated]';\n }\n }\n return body;\n}\n"],"mappings":";AA6FA,MAAM,yBAAyB,IAAI,IAAI;CAAC;CAAiB;CAAU;CAAc;CAAY,CAAC;AAE9F,SAAS,gBACP,SACA,WACyB;AACzB,KAAI,CAAC,QAAS,QAAO,EAAE;CACvB,MAAMA,MAA+B,EAAE;AACvC,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,QAAQ,CAC1C,KAAI,KAAK,UAAU,IAAI,EAAE,aAAa,CAAC,GAAG,eAAe;AAE3D,QAAO;;AAGT,SAAS,UAAkB;AAEzB,QAAO,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG;;AAGhD,SAAS,gBACP,KACA,SACA,SACyB;;CACzB,MAAM,YAAY,QAAQ,gBACtB,IAAI,IAAI,QAAQ,cAAc,KAAK,MAAM,EAAE,aAAa,CAAC,CAAC,GAC1D;CAEJ,MAAMC,SAAkC;EACtC;EACA,wBAAQ,IAAI,kEAAQ,aAAa,KAAI;EACrC,KAAK,IAAI,OAAO;EAChB,IAAI,IAAI,sBAAM,IAAI,kEAAQ,kBAAiB;EAC3C,SAAS,gBAAgB,IAAI,SAAS,UAAU;EACjD;AAED,KAAI,QAAQ,YACV,QAAO,OAAO,QAAQ,QAAQ,YAAY,IAAI,CAAC;AAGjD,QAAO;;;;;AAQT,SAAgB,wBACd,QACA,UAA6B,EAAE,EAC0C;CACzE,MAAM,EACJ,MACA,SACA,cACA,gBAAgB,cAChB,eAAe,SACf,gBAAgB,QAChB,aAAa,SACb,yBAAyB,QACvB;AAEJ,QAAO,SAAS,sBACd,KACA,KACA,MACM;;AACN,kDAAI,KAAO,IAAI,EAAE;AACf,SAAM;AACN;;EAGF,MAAM,2BAAW,IAAI,qEAAU,mBAAyC,SAAS;EACjF,MAAM,UAAU,KAAK,KAAK;EAC1B,MAAM,aAAa,gBAAgB,KAAK,SAAS,QAAQ;AAGzD,MAAI,iBAAiB,SACnB,CAAK,OAAO,SAAS,cAAc,mBAAmB;GACpD,GAAG;GACH,GAAI,WAAW,IAAI,OAAO,EAAE,MAAM,aAAa,IAAI,MAAM,aAAa,EAAE,GAAG,EAAE;GAC9E,CAAC;EAMJ,MAAM,iBAAuB;GAC3B,MAAM,WAAW,KAAK,KAAK,GAAG;GAC9B,MAAM,SAAS,IAAI,cAAc;GACjC,MAAM,QAAQ,UAAU,MAAM,aAAa;AAE3C,GAAK,OAAO,SAAS,OAAO,qBAAqB;IAC/C,GAAG;IACH,YAAY;IACZ;IACD,CAAC;AAEF,OAAI,WAAW,uBACb,CAAK,OAAO,KAAK,yBAAyB;IACxC,GAAG;IACH,YAAY;IACZ;IACA,WAAW;IACZ,CAAC;;AAIN,mBAAI,8DAAO,UAAU,SAAS;AAE9B,oBAAI,gEAAO,eAAe;AACxB,QAAK,IAAI,cAAc,OAAO,EAAG,WAAU;IAC3C;AAEF,QAAM;;;;;;;;;;;AAkBV,SAAgB,oBAAoB,QAAqB,UAA6B,EAAE,EAAE;CACxF,MAAM,EACJ,MACA,gBAAgB,cAChB,eAAe,SACf,gBAAgB,QAChB,aAAa,SACb,yBAAyB,QACvB;AAEJ,QAAO,SAAS,qBACd,SACA,OACA,MACM;AACN,UAAQ,QAAQ,cAAc,SAAkB,QAAiB,aAAyB;;GACxF,MAAM,MAAM;AACZ,mDAAI,KAAO,IAAI,EAAE;AACf,cAAU;AACV;;GAGF,MAAM,4BAAW,IAAI,uEAAU,mBAAyC,SAAS;AACjF,OAAI,gBAAgB,KAAK,KAAK;AAC9B,OAAI,aAAa;AAEjB,OAAI,iBAAiB,SACnB,CAAK,OAAO,SACV,cACA,mBACA,gBAAgB,KAAK,SAAS,QAAQ,CACvC;AAEH,aAAU;IACV;AAEF,UAAQ,QAAQ,eAAe,SAAkB,OAAgB,aAAyB;GACxF,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,MAAM,WAAW,KAAK,KAAK,IAAI,IAAI,iBAAiB,KAAK,KAAK;GAC9D,MAAM,SAAS,IAAI,cAAc;GACjC,MAAM,UAAU,IAAI,cAAc,SAAS;GAC3C,MAAM,QAAQ,UAAU,MAAM,aAAa;AAE3C,GAAK,OAAO,SAAS,OAAO,qBAAqB;IAC/C,GAAG,gBAAgB,KAAK,SAAS,QAAQ;IACzC,YAAY;IACZ;IACD,CAAC;AAEF,OAAI,WAAW,uBACb,CAAK,OAAO,KAAK,yBAAyB;IACxC;IACA,KAAK,IAAI;IACT,QAAQ,IAAI;IACZ;IACA,WAAW;IACZ,CAAC;AAGJ,aAAU;IACV;AAEF,QAAM;;;AAMV,SAAS,aAAa,MAAe,WAAW,MAAe;AAC7D,KAAI,OAAO,SAAS,SAClB,QAAO,KAAK,SAAS,WAAW,KAAK,MAAM,GAAG,SAAS,GAAG,iBAAiB;AAE7E,KAAI,QAAQ,OAAO,SAAS,UAAU;EACpC,MAAM,MAAM,KAAK,UAAU,KAAK;AAChC,MAAI,IAAI,SAAS,SACf,QAAO,IAAI,MAAM,GAAG,SAAS,GAAG;;AAGpC,QAAO"}
package/dist/nest.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { H as HttpRequest, S as RequestContext, T as TraceIdConfig, U as HttpResponse } from "./index-EMjeeifm.mjs";
2
- import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, i as LogixiaLoggerModule, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG } from "./logitron-logger.module-CyrFeLgZ.mjs";
1
+ import { H as HttpRequest, S as RequestContext, T as TraceIdConfig, U as HttpResponse } from "./index-CthBT3t8.mjs";
2
+ import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, i as LogixiaLoggerModule, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG } from "./logitron-logger.module-KU_L04y1.mjs";
3
3
  import { NestMiddleware } from "@nestjs/common";
4
4
  import { NextFunction, Request, Response } from "express";
5
5
 
@@ -13,15 +13,15 @@ declare class RequestContextManager {
13
13
  /**
14
14
  * Update request context with response data
15
15
  */
16
- static updateContext(requestId: string, response?: HttpResponse, error?: Error): RequestContext | undefined;
16
+ static updateContext(traceId: string, response?: HttpResponse, error?: Error): RequestContext | undefined;
17
17
  /**
18
- * Get request context by ID
18
+ * Get request context by trace ID
19
19
  */
20
- static getContext(requestId: string): RequestContext | undefined;
20
+ static getContext(traceId: string): RequestContext | undefined;
21
21
  /**
22
22
  * Remove request context (cleanup)
23
23
  */
24
- static removeContext(requestId: string): boolean;
24
+ static removeContext(traceId: string): boolean;
25
25
  /**
26
26
  * Get all active contexts
27
27
  */
@@ -49,7 +49,6 @@ declare global {
49
49
  namespace Express {
50
50
  interface Request {
51
51
  traceId?: string;
52
- requestId?: string;
53
52
  }
54
53
  }
55
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/request-context.ts","../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;cAOa,qBAAA;;EAAA;;;EAqCE,OAAA,aAAA,CAAA,OAAA,EA/BiB,WA+BjB,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EA/BiD,cA+BjD;EACH;;;EAuCe,OAAA,aAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAxCZ,YAwCY,EAAA,KAAA,CAAA,EAvCf,KAuCe,CAAA,EAtCtB,cAsCsB,GAAA,SAAA;EAAc;;;wCAdD;EC9DM;;;EAAA,OAAA,aAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAA;AAe9C;;EAsBW,OAAA,cAAA,CAAA,CAAA,EDuCgB,cCvChB,EAAA;EAAc;;;EArB6B,OAAA,QAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;;;;;;;;;ADjBtD,QAAa,MAAA,CAAA;EAMmB,UAAA,OAAA,CAAA;IAAgC,UAAA,OAAA,CAAA;MA+BjD,OAAA,CAAA,EAAA,MAAA;MACH,SAAA,CAAA,EAAA,MAAA;IACP;EAwBmC;;AAcC,cC5D5B,eAAA,YAA2B,cD4DC,CAAA;;;uBCzDW;EAnBN,GAAA,CAAA,GAAA,EAqCnC,OArCmC,EAAA,GAAA,EAqCrB,QArCqB,EAAA,IAAA,EAqCL,YArCK,CAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/request-context.ts","../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;cAOa,qBAAA;;EAAA;;;EAkCE,OAAA,aAAA,CAAA,OAAA,EA5BiB,WA4BjB,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EA5BiD,cA4BjD;EACH;;;EAuCe,OAAA,aAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAxCZ,YAwCY,EAAA,KAAA,CAAA,EAvCf,KAuCe,CAAA,EAtCtB,cAsCsB,GAAA,SAAA;EAAc;;;sCAdH;EC3DQ;;;EAAA,OAAA,aAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAA;AAc9C;;EAsBW,OAAA,cAAA,CAAA,CAAA,EDqCgB,cCrChB,EAAA;EAAc;;;EArB6B,OAAA,QAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;;;;;;;;;ADhBtD,QAAa,MAAA,CAAA;EAMmB,UAAA,OAAA,CAAA;IAAgC,UAAA,OAAA,CAAA;MA4BjD,OAAA,CAAA,EAAA,MAAA;IACH;EACP;;AAsCsB,cC1Dd,eAAA,YAA2B,cD0Db,CAAA;EAAc,iBAAA,MAAA;;uBCvDW;WAkBzC,cAAc,gBAAgB;AApCK"}
package/dist/nest.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { H as HttpRequest, S as RequestContext, T as TraceIdConfig, U as HttpResponse } from "./index-DXcAI2Bp.js";
2
- import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, i as LogixiaLoggerModule, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG } from "./logitron-logger.module-BgWyqoRV.js";
1
+ import { H as HttpRequest, S as RequestContext, T as TraceIdConfig, U as HttpResponse } from "./index-ClPZrfIU.js";
2
+ import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, i as LogixiaLoggerModule, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG } from "./logitron-logger.module-Dx2mUz-g.js";
3
3
  import { NestMiddleware } from "@nestjs/common";
4
4
  import { NextFunction, Request, Response } from "express";
5
5
 
@@ -13,15 +13,15 @@ declare class RequestContextManager {
13
13
  /**
14
14
  * Update request context with response data
15
15
  */
16
- static updateContext(requestId: string, response?: HttpResponse, error?: Error): RequestContext | undefined;
16
+ static updateContext(traceId: string, response?: HttpResponse, error?: Error): RequestContext | undefined;
17
17
  /**
18
- * Get request context by ID
18
+ * Get request context by trace ID
19
19
  */
20
- static getContext(requestId: string): RequestContext | undefined;
20
+ static getContext(traceId: string): RequestContext | undefined;
21
21
  /**
22
22
  * Remove request context (cleanup)
23
23
  */
24
- static removeContext(requestId: string): boolean;
24
+ static removeContext(traceId: string): boolean;
25
25
  /**
26
26
  * Get all active contexts
27
27
  */
@@ -49,7 +49,6 @@ declare global {
49
49
  namespace Express {
50
50
  interface Request {
51
51
  traceId?: string;
52
- requestId?: string;
53
52
  }
54
53
  }
55
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/request-context.ts","../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;cAOa,qBAAA;;EAAA;;;EAqCE,OAAA,aAAA,CAAA,OAAA,EA/BiB,WA+BjB,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EA/BiD,cA+BjD;EACH;;;EAuCe,OAAA,aAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAxCZ,YAwCY,EAAA,KAAA,CAAA,EAvCf,KAuCe,CAAA,EAtCtB,cAsCsB,GAAA,SAAA;EAAc;;;wCAdD;EC9DM;;;EAAA,OAAA,aAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAA;AAe9C;;EAsBW,OAAA,cAAA,CAAA,CAAA,EDuCgB,cCvChB,EAAA;EAAc;;;EArB6B,OAAA,QAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;;;;;;;;;ADjBtD,QAAa,MAAA,CAAA;EAMmB,UAAA,OAAA,CAAA;IAAgC,UAAA,OAAA,CAAA;MA+BjD,OAAA,CAAA,EAAA,MAAA;MACH,SAAA,CAAA,EAAA,MAAA;IACP;EAwBmC;;AAcC,cC5D5B,eAAA,YAA2B,cD4DC,CAAA;;;uBCzDW;EAnBN,GAAA,CAAA,GAAA,EAqCnC,OArCmC,EAAA,GAAA,EAqCrB,QArCqB,EAAA,IAAA,EAqCL,YArCK,CAAA,EAAA,IAAA"}
1
+ {"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/request-context.ts","../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;cAOa,qBAAA;;EAAA;;;EAkCE,OAAA,aAAA,CAAA,OAAA,EA5BiB,WA4BjB,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EA5BiD,cA4BjD;EACH;;;EAuCe,OAAA,aAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAxCZ,YAwCY,EAAA,KAAA,CAAA,EAvCf,KAuCe,CAAA,EAtCtB,cAsCsB,GAAA,SAAA;EAAc;;;sCAdH;EC3DQ;;;EAAA,OAAA,aAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAA;AAc9C;;EAsBW,OAAA,cAAA,CAAA,CAAA,EDqCgB,cCrChB,EAAA;EAAc;;;EArB6B,OAAA,QAAA,CAAA,CAAA,EAAA,IAAA;;;;;;;;;;;;;;;;ADhBtD,QAAa,MAAA,CAAA;EAMmB,UAAA,OAAA,CAAA;IAAgC,UAAA,OAAA,CAAA;MA4BjD,OAAA,CAAA,EAAA,MAAA;IACH;EACP;;AAsCsB,cC1Dd,eAAA,YAA2B,cD0Db,CAAA;EAAc,iBAAA,MAAA;;uBCvDW;WAkBzC,cAAc,gBAAgB;AApCK"}
package/dist/nest.js CHANGED
@@ -1,4 +1,4 @@
1
- const require_logitron_logger_module = require('./logitron-logger.module-EX78H9nm.js');
1
+ const require_logitron_logger_module = require('./logitron-logger.module-Fof9Er2E.js');
2
2
  require('./transport.manager-DU1W0wV3.js');
3
3
 
4
4
  //#region src/core/request-context.ts
@@ -9,19 +9,16 @@ var RequestContextManager = class {
9
9
  */
10
10
  static createContext(request, traceId) {
11
11
  const ctx = require_logitron_logger_module.TraceContext.instance;
12
- const requestId = ctx.generate();
13
12
  const contextTraceId = traceId || ctx.getCurrentTraceId() || ctx.generate();
14
13
  const context = {
15
- requestId,
16
14
  traceId: contextTraceId,
17
15
  startTime: Date.now(),
18
16
  request,
19
17
  ...request.userAgent && { userAgent: request.userAgent },
20
18
  ...request.ip && { ip: request.ip }
21
19
  };
22
- this.contexts.set(requestId, context);
20
+ this.contexts.set(contextTraceId, context);
23
21
  require_logitron_logger_module.TraceContext.instance.setTraceId(contextTraceId, {
24
- requestId,
25
22
  method: request.method,
26
23
  url: request.url
27
24
  });
@@ -30,8 +27,8 @@ var RequestContextManager = class {
30
27
  /**
31
28
  * Update request context with response data
32
29
  */
33
- static updateContext(requestId, response, error) {
34
- const context = this.contexts.get(requestId);
30
+ static updateContext(traceId, response, error) {
31
+ const context = this.contexts.get(traceId);
35
32
  if (!context) return;
36
33
  const endTime = Date.now();
37
34
  context.endTime = endTime;
@@ -41,16 +38,16 @@ var RequestContextManager = class {
41
38
  return context;
42
39
  }
43
40
  /**
44
- * Get request context by ID
41
+ * Get request context by trace ID
45
42
  */
46
- static getContext(requestId) {
47
- return this.contexts.get(requestId);
43
+ static getContext(traceId) {
44
+ return this.contexts.get(traceId);
48
45
  }
49
46
  /**
50
47
  * Remove request context (cleanup)
51
48
  */
52
- static removeContext(requestId) {
53
- return this.contexts.delete(requestId);
49
+ static removeContext(traceId) {
50
+ return this.contexts.delete(traceId);
54
51
  }
55
52
  /**
56
53
  * Get all active contexts
@@ -83,8 +80,8 @@ var RequestContextManager = class {
83
80
  static cleanup(maxAgeMs = 3e5) {
84
81
  const now = Date.now();
85
82
  let cleaned = 0;
86
- for (const [requestId, context] of this.contexts.entries()) if (context.endTime && now - context.endTime > maxAgeMs) {
87
- this.contexts.delete(requestId);
83
+ for (const [traceId, context] of this.contexts.entries()) if (context.endTime && now - context.endTime > maxAgeMs) {
84
+ this.contexts.delete(traceId);
88
85
  cleaned++;
89
86
  }
90
87
  return cleaned;
package/dist/nest.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nest.js","names":["TraceContext","context: RequestContext"],"sources":["../src/core/request-context.ts"],"sourcesContent":["/**\n * Request context tracking for Logitron\n */\n\nimport type { HttpRequest, HttpResponse, RequestContext } from '../types';\nimport { TraceContext } from '../utils/trace.utils';\n\nexport class RequestContextManager {\n private static contexts = new Map<string, RequestContext>();\n\n /**\n * Create a new request context\n */\n static createContext(request: HttpRequest, traceId?: string): RequestContext {\n const ctx = TraceContext.instance;\n const requestId = ctx.generate();\n const contextTraceId = traceId || ctx.getCurrentTraceId() || ctx.generate();\n\n const context: RequestContext = {\n requestId,\n traceId: contextTraceId,\n startTime: Date.now(),\n request,\n ...(request.userAgent && { userAgent: request.userAgent }),\n ...(request.ip && { ip: request.ip }),\n };\n\n this.contexts.set(requestId, context);\n\n // Set trace ID in async context\n TraceContext.instance.setTraceId(contextTraceId, {\n requestId,\n method: request.method,\n url: request.url,\n });\n\n return context;\n }\n\n /**\n * Update request context with response data\n */\n static updateContext(\n requestId: string,\n response?: HttpResponse,\n error?: Error\n ): RequestContext | undefined {\n const context = this.contexts.get(requestId);\n if (!context) {\n return undefined;\n }\n\n const endTime = Date.now();\n context.endTime = endTime;\n context.duration = endTime - context.startTime;\n\n if (response) {\n context.response = response;\n }\n\n if (error) {\n context.error = error;\n }\n\n return context;\n }\n\n /**\n * Get request context by ID\n */\n static getContext(requestId: string): RequestContext | undefined {\n return this.contexts.get(requestId);\n }\n\n /**\n * Remove request context (cleanup)\n */\n static removeContext(requestId: string): boolean {\n return this.contexts.delete(requestId);\n }\n\n /**\n * Get all active contexts\n */\n static getAllContexts(): RequestContext[] {\n return Array.from(this.contexts.values());\n }\n\n /**\n * Clear all contexts (useful for testing)\n */\n static clearAll(): void {\n this.contexts.clear();\n }\n\n /**\n * Get context statistics\n */\n static getStats(): {\n activeContexts: number;\n averageDuration: number;\n completedRequests: number;\n } {\n const contexts = Array.from(this.contexts.values());\n const completedContexts = contexts.filter((ctx) => ctx.endTime);\n\n const averageDuration =\n completedContexts.length > 0\n ? completedContexts.reduce((sum, ctx) => sum + (ctx.duration || 0), 0) /\n completedContexts.length\n : 0;\n\n return {\n activeContexts: contexts.length,\n averageDuration,\n completedRequests: completedContexts.length,\n };\n }\n\n /**\n * Cleanup old completed contexts (older than specified time)\n */\n static cleanup(maxAgeMs: number = 300000): number {\n // 5 minutes default\n const now = Date.now();\n let cleaned = 0;\n\n for (const [requestId, context] of this.contexts.entries()) {\n if (context.endTime && now - context.endTime > maxAgeMs) {\n this.contexts.delete(requestId);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n}\n\n/**\n * Helper function to create HTTP request object from various sources\n */\nexport function createHttpRequest(\n method: string,\n url: string,\n headers: Record<string, string | string[]> = {},\n options: {\n query?: Record<string, unknown>;\n params?: Record<string, unknown>;\n body?: unknown;\n ip?: string;\n userAgent?: string;\n } = {}\n): HttpRequest {\n return {\n method: method.toUpperCase(),\n url,\n headers,\n ...(options.query && { query: options.query }),\n ...(options.params && { params: options.params }),\n ...(options.body !== undefined && { body: options.body }),\n ...(options.ip && { ip: options.ip }),\n ...(options.userAgent && { userAgent: options.userAgent }),\n timestamp: Date.now(),\n };\n}\n\n/**\n * Helper function to create HTTP response object\n */\nexport function createHttpResponse(\n statusCode: number,\n headers: Record<string, string | string[]> = {},\n body?: unknown,\n contentLength?: number\n): HttpResponse {\n return {\n statusCode,\n headers,\n ...(body !== undefined && { body }),\n ...(contentLength !== undefined && { contentLength }),\n timestamp: Date.now(),\n };\n}\n"],"mappings":";;;;AAOA,IAAa,wBAAb,MAAmC;6CACP,IAAI,KAA6B;;;;CAK3D,OAAO,cAAc,SAAsB,SAAkC;EAC3E,MAAM,MAAMA,4CAAa;EACzB,MAAM,YAAY,IAAI,UAAU;EAChC,MAAM,iBAAiB,WAAW,IAAI,mBAAmB,IAAI,IAAI,UAAU;EAE3E,MAAMC,UAA0B;GAC9B;GACA,SAAS;GACT,WAAW,KAAK,KAAK;GACrB;GACA,GAAI,QAAQ,aAAa,EAAE,WAAW,QAAQ,WAAW;GACzD,GAAI,QAAQ,MAAM,EAAE,IAAI,QAAQ,IAAI;GACrC;AAED,OAAK,SAAS,IAAI,WAAW,QAAQ;AAGrC,8CAAa,SAAS,WAAW,gBAAgB;GAC/C;GACA,QAAQ,QAAQ;GAChB,KAAK,QAAQ;GACd,CAAC;AAEF,SAAO;;;;;CAMT,OAAO,cACL,WACA,UACA,OAC4B;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI,UAAU;AAC5C,MAAI,CAAC,QACH;EAGF,MAAM,UAAU,KAAK,KAAK;AAC1B,UAAQ,UAAU;AAClB,UAAQ,WAAW,UAAU,QAAQ;AAErC,MAAI,SACF,SAAQ,WAAW;AAGrB,MAAI,MACF,SAAQ,QAAQ;AAGlB,SAAO;;;;;CAMT,OAAO,WAAW,WAA+C;AAC/D,SAAO,KAAK,SAAS,IAAI,UAAU;;;;;CAMrC,OAAO,cAAc,WAA4B;AAC/C,SAAO,KAAK,SAAS,OAAO,UAAU;;;;;CAMxC,OAAO,iBAAmC;AACxC,SAAO,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;;;;;CAM3C,OAAO,WAAiB;AACtB,OAAK,SAAS,OAAO;;;;;CAMvB,OAAO,WAIL;EACA,MAAM,WAAW,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;EACnD,MAAM,oBAAoB,SAAS,QAAQ,QAAQ,IAAI,QAAQ;EAE/D,MAAM,kBACJ,kBAAkB,SAAS,IACvB,kBAAkB,QAAQ,KAAK,QAAQ,OAAO,IAAI,YAAY,IAAI,EAAE,GACpE,kBAAkB,SAClB;AAEN,SAAO;GACL,gBAAgB,SAAS;GACzB;GACA,mBAAmB,kBAAkB;GACtC;;;;;CAMH,OAAO,QAAQ,WAAmB,KAAgB;EAEhD,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,UAAU;AAEd,OAAK,MAAM,CAAC,WAAW,YAAY,KAAK,SAAS,SAAS,CACxD,KAAI,QAAQ,WAAW,MAAM,QAAQ,UAAU,UAAU;AACvD,QAAK,SAAS,OAAO,UAAU;AAC/B;;AAIJ,SAAO"}
1
+ {"version":3,"file":"nest.js","names":["TraceContext","context: RequestContext"],"sources":["../src/core/request-context.ts"],"sourcesContent":["/**\n * Request context tracking for Logitron\n */\n\nimport type { HttpRequest, HttpResponse, RequestContext } from '../types';\nimport { TraceContext } from '../utils/trace.utils';\n\nexport class RequestContextManager {\n private static contexts = new Map<string, RequestContext>();\n\n /**\n * Create a new request context\n */\n static createContext(request: HttpRequest, traceId?: string): RequestContext {\n const ctx = TraceContext.instance;\n const contextTraceId = traceId || ctx.getCurrentTraceId() || ctx.generate();\n\n const context: RequestContext = {\n traceId: contextTraceId,\n startTime: Date.now(),\n request,\n ...(request.userAgent && { userAgent: request.userAgent }),\n ...(request.ip && { ip: request.ip }),\n };\n\n this.contexts.set(contextTraceId, context);\n\n // Set trace ID in async context\n TraceContext.instance.setTraceId(contextTraceId, {\n method: request.method,\n url: request.url,\n });\n\n return context;\n }\n\n /**\n * Update request context with response data\n */\n static updateContext(\n traceId: string,\n response?: HttpResponse,\n error?: Error\n ): RequestContext | undefined {\n const context = this.contexts.get(traceId);\n if (!context) {\n return undefined;\n }\n\n const endTime = Date.now();\n context.endTime = endTime;\n context.duration = endTime - context.startTime;\n\n if (response) {\n context.response = response;\n }\n\n if (error) {\n context.error = error;\n }\n\n return context;\n }\n\n /**\n * Get request context by trace ID\n */\n static getContext(traceId: string): RequestContext | undefined {\n return this.contexts.get(traceId);\n }\n\n /**\n * Remove request context (cleanup)\n */\n static removeContext(traceId: string): boolean {\n return this.contexts.delete(traceId);\n }\n\n /**\n * Get all active contexts\n */\n static getAllContexts(): RequestContext[] {\n return Array.from(this.contexts.values());\n }\n\n /**\n * Clear all contexts (useful for testing)\n */\n static clearAll(): void {\n this.contexts.clear();\n }\n\n /**\n * Get context statistics\n */\n static getStats(): {\n activeContexts: number;\n averageDuration: number;\n completedRequests: number;\n } {\n const contexts = Array.from(this.contexts.values());\n const completedContexts = contexts.filter((ctx) => ctx.endTime);\n\n const averageDuration =\n completedContexts.length > 0\n ? completedContexts.reduce((sum, ctx) => sum + (ctx.duration || 0), 0) /\n completedContexts.length\n : 0;\n\n return {\n activeContexts: contexts.length,\n averageDuration,\n completedRequests: completedContexts.length,\n };\n }\n\n /**\n * Cleanup old completed contexts (older than specified time)\n */\n static cleanup(maxAgeMs: number = 300000): number {\n // 5 minutes default\n const now = Date.now();\n let cleaned = 0;\n\n for (const [traceId, context] of this.contexts.entries()) {\n if (context.endTime && now - context.endTime > maxAgeMs) {\n this.contexts.delete(traceId);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n}\n\n/**\n * Helper function to create HTTP request object from various sources\n */\nexport function createHttpRequest(\n method: string,\n url: string,\n headers: Record<string, string | string[]> = {},\n options: {\n query?: Record<string, unknown>;\n params?: Record<string, unknown>;\n body?: unknown;\n ip?: string;\n userAgent?: string;\n } = {}\n): HttpRequest {\n return {\n method: method.toUpperCase(),\n url,\n headers,\n ...(options.query && { query: options.query }),\n ...(options.params && { params: options.params }),\n ...(options.body !== undefined && { body: options.body }),\n ...(options.ip && { ip: options.ip }),\n ...(options.userAgent && { userAgent: options.userAgent }),\n timestamp: Date.now(),\n };\n}\n\n/**\n * Helper function to create HTTP response object\n */\nexport function createHttpResponse(\n statusCode: number,\n headers: Record<string, string | string[]> = {},\n body?: unknown,\n contentLength?: number\n): HttpResponse {\n return {\n statusCode,\n headers,\n ...(body !== undefined && { body }),\n ...(contentLength !== undefined && { contentLength }),\n timestamp: Date.now(),\n };\n}\n"],"mappings":";;;;AAOA,IAAa,wBAAb,MAAmC;6CACP,IAAI,KAA6B;;;;CAK3D,OAAO,cAAc,SAAsB,SAAkC;EAC3E,MAAM,MAAMA,4CAAa;EACzB,MAAM,iBAAiB,WAAW,IAAI,mBAAmB,IAAI,IAAI,UAAU;EAE3E,MAAMC,UAA0B;GAC9B,SAAS;GACT,WAAW,KAAK,KAAK;GACrB;GACA,GAAI,QAAQ,aAAa,EAAE,WAAW,QAAQ,WAAW;GACzD,GAAI,QAAQ,MAAM,EAAE,IAAI,QAAQ,IAAI;GACrC;AAED,OAAK,SAAS,IAAI,gBAAgB,QAAQ;AAG1C,8CAAa,SAAS,WAAW,gBAAgB;GAC/C,QAAQ,QAAQ;GAChB,KAAK,QAAQ;GACd,CAAC;AAEF,SAAO;;;;;CAMT,OAAO,cACL,SACA,UACA,OAC4B;EAC5B,MAAM,UAAU,KAAK,SAAS,IAAI,QAAQ;AAC1C,MAAI,CAAC,QACH;EAGF,MAAM,UAAU,KAAK,KAAK;AAC1B,UAAQ,UAAU;AAClB,UAAQ,WAAW,UAAU,QAAQ;AAErC,MAAI,SACF,SAAQ,WAAW;AAGrB,MAAI,MACF,SAAQ,QAAQ;AAGlB,SAAO;;;;;CAMT,OAAO,WAAW,SAA6C;AAC7D,SAAO,KAAK,SAAS,IAAI,QAAQ;;;;;CAMnC,OAAO,cAAc,SAA0B;AAC7C,SAAO,KAAK,SAAS,OAAO,QAAQ;;;;;CAMtC,OAAO,iBAAmC;AACxC,SAAO,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;;;;;CAM3C,OAAO,WAAiB;AACtB,OAAK,SAAS,OAAO;;;;;CAMvB,OAAO,WAIL;EACA,MAAM,WAAW,MAAM,KAAK,KAAK,SAAS,QAAQ,CAAC;EACnD,MAAM,oBAAoB,SAAS,QAAQ,QAAQ,IAAI,QAAQ;EAE/D,MAAM,kBACJ,kBAAkB,SAAS,IACvB,kBAAkB,QAAQ,KAAK,QAAQ,OAAO,IAAI,YAAY,IAAI,EAAE,GACpE,kBAAkB,SAClB;AAEN,SAAO;GACL,gBAAgB,SAAS;GACzB;GACA,mBAAmB,kBAAkB;GACtC;;;;;CAMH,OAAO,QAAQ,WAAmB,KAAgB;EAEhD,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,UAAU;AAEd,OAAK,MAAM,CAAC,SAAS,YAAY,KAAK,SAAS,SAAS,CACtD,KAAI,QAAQ,WAAW,MAAM,QAAQ,UAAU,UAAU;AACvD,QAAK,SAAS,OAAO,QAAQ;AAC7B;;AAIJ,SAAO"}