logixia 1.8.2 → 1.8.4

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 (88) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{index-CthBT3t8.d.mts → index-DknhKCCg.d.ts} +12 -1
  3. package/dist/index-DknhKCCg.d.ts.map +1 -0
  4. package/dist/{index-ClPZrfIU.d.ts → index-DnhKoNBG.d.mts} +12 -1
  5. package/dist/index-DnhKoNBG.d.mts.map +1 -0
  6. package/dist/index.d.mts +87 -16
  7. package/dist/index.d.mts.map +1 -1
  8. package/dist/index.d.ts +86 -15
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +78 -40
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +77 -37
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/{logitron-logger.module-Dx2mUz-g.d.ts → logitron-logger.module-BkPXi0He.d.ts} +97 -5
  15. package/dist/logitron-logger.module-BkPXi0He.d.ts.map +1 -0
  16. package/dist/logitron-logger.module-CMDM61Iz.js +2566 -0
  17. package/dist/logitron-logger.module-CMDM61Iz.js.map +1 -0
  18. package/dist/{logitron-logger.module-KU_L04y1.d.mts → logitron-logger.module-Cd5M_59H.d.mts} +97 -5
  19. package/dist/logitron-logger.module-Cd5M_59H.d.mts.map +1 -0
  20. package/dist/logitron-logger.module-uyg1-Khn.mjs +2285 -0
  21. package/dist/logitron-logger.module-uyg1-Khn.mjs.map +1 -0
  22. package/dist/middleware.d.mts +1 -1
  23. package/dist/middleware.d.mts.map +1 -1
  24. package/dist/middleware.d.ts +1 -1
  25. package/dist/middleware.d.ts.map +1 -1
  26. package/dist/middleware.js +4 -1
  27. package/dist/middleware.js.map +1 -1
  28. package/dist/middleware.mjs +4 -1
  29. package/dist/middleware.mjs.map +1 -1
  30. package/dist/nest.d.mts +4 -44
  31. package/dist/nest.d.mts.map +1 -1
  32. package/dist/nest.d.ts +4 -44
  33. package/dist/nest.d.ts.map +1 -1
  34. package/dist/nest.js +3 -93
  35. package/dist/nest.mjs +3 -92
  36. package/dist/search.d.mts +1 -1
  37. package/dist/search.js +1 -1
  38. package/dist/search.mjs +1 -1
  39. package/dist/testing.d.mts +1 -1
  40. package/dist/testing.d.ts +1 -1
  41. package/dist/{transport.manager-BCnLEmOy.mjs → transport.manager-D3U03fJg.mjs} +21 -11
  42. package/dist/transport.manager-D3U03fJg.mjs.map +1 -0
  43. package/dist/{transport.manager-DU1W0wV3.js → transport.manager-DPjB-dFH.js} +49 -15
  44. package/dist/transport.manager-DPjB-dFH.js.map +1 -0
  45. package/dist/transports.d.mts +3 -1
  46. package/dist/transports.d.mts.map +1 -1
  47. package/dist/transports.d.ts +3 -1
  48. package/dist/transports.d.ts.map +1 -1
  49. package/dist/transports.js +1 -1
  50. package/dist/transports.mjs +1 -1
  51. package/package.json +24 -23
  52. package/dist/build-DOx-YxF1.js +0 -536
  53. package/dist/build-DOx-YxF1.js.map +0 -1
  54. package/dist/build-DWmxA6A2.mjs +0 -536
  55. package/dist/build-DWmxA6A2.mjs.map +0 -1
  56. package/dist/chunk-BTgCAUrQ.js +0 -53
  57. package/dist/chunk-uEZWKkIX.mjs +0 -32
  58. package/dist/esm-1Ra90uql.mjs +0 -4256
  59. package/dist/esm-1Ra90uql.mjs.map +0 -1
  60. package/dist/esm-FNhqFIqG.js +0 -4267
  61. package/dist/esm-FNhqFIqG.js.map +0 -1
  62. package/dist/index-ClPZrfIU.d.ts.map +0 -1
  63. package/dist/index-CthBT3t8.d.mts.map +0 -1
  64. package/dist/lib-8XKCHDOH.mjs +0 -66301
  65. package/dist/lib-8XKCHDOH.mjs.map +0 -1
  66. package/dist/lib-BNEYXXTQ.js +0 -66304
  67. package/dist/lib-BNEYXXTQ.js.map +0 -1
  68. package/dist/logitron-logger.module-DucvDnxZ.mjs +0 -10986
  69. package/dist/logitron-logger.module-DucvDnxZ.mjs.map +0 -1
  70. package/dist/logitron-logger.module-Dx2mUz-g.d.ts.map +0 -1
  71. package/dist/logitron-logger.module-Fof9Er2E.js +0 -11260
  72. package/dist/logitron-logger.module-Fof9Er2E.js.map +0 -1
  73. package/dist/logitron-logger.module-KU_L04y1.d.mts.map +0 -1
  74. package/dist/nest.js.map +0 -1
  75. package/dist/nest.mjs.map +0 -1
  76. package/dist/promise-BI-3eI4n.js +0 -22743
  77. package/dist/promise-BI-3eI4n.js.map +0 -1
  78. package/dist/promise-BrZcjavs.mjs +0 -22740
  79. package/dist/promise-BrZcjavs.mjs.map +0 -1
  80. package/dist/sqlite3-CSkpjC90.js +0 -420
  81. package/dist/sqlite3-CSkpjC90.js.map +0 -1
  82. package/dist/sqlite3-DD2_nRRH.mjs +0 -417
  83. package/dist/sqlite3-DD2_nRRH.mjs.map +0 -1
  84. package/dist/transport.manager-BCnLEmOy.mjs.map +0 -1
  85. package/dist/transport.manager-DU1W0wV3.js.map +0 -1
  86. /package/dist/{search-DanSf_yc.d.mts → search-DN676Dnz.d.mts} +0 -0
  87. /package/dist/{search-1txemGPh.mjs → search-DOvSI-mb.mjs} +0 -0
  88. /package/dist/{search-DeZHhWxB.js → search-DoZF3RZj.js} +0 -0
package/dist/index.mjs CHANGED
@@ -1,7 +1,6 @@
1
- import { A as disableOtelBridge, B as PluginRegistry, C as traceStorage, D as resetShutdownHandlers, E as registerForShutdown, F as normalizeError, G as createFastifyContextHook, H as usePlugin, I as serializeError, L as DEFAULT_LOG_COLORS, M as getOtelMetaFields, N as initOtelBridge, O as applyRedaction, P as isError, R as DEFAULT_LOG_LEVELS, S as setTraceId, T as flushOnExit, U as LogixiaContext, V as globalPluginRegistry, W as createExpressContextMiddleware, _ as createTraceMiddleware, b as getTraceContextKey, c as LogixiaLoggerService, d as LogixiaLogger, f as createLogger$1, g as _setActiveContextKey, h as TraceContext, i as WebSocketTraceInterceptor, j as getActiveOtelContext, k as redactObject, l as __decorate, m as TRACE_CONTEXT_KEY, n as LOGIXIA_LOGGER_PREFIX, o as __decorateParam, p as DEFAULT_TRACE_HEADERS, r as LogixiaLoggerModule, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG, u as __decorateMetadata, v as extractTraceId, w as deregisterFromShutdown, x as runWithTraceId, y as getCurrentTraceId, z as LogLevel } from "./logitron-logger.module-DucvDnxZ.mjs";
2
- import { f as internalWarn } from "./transport.manager-BCnLEmOy.mjs";
3
- import "./search-1txemGPh.mjs";
4
- import { randomUUID } from "node:crypto";
1
+ import { f as internalWarn } from "./transport.manager-D3U03fJg.mjs";
2
+ import { A as redactObject, B as LogLevel, C as setTraceId, D as registerForShutdown, E as flushOnExit, F as isError, G as createExpressContextMiddleware, H as globalPluginRegistry, I as normalizeError, K as createFastifyContextHook, L as serializeError, M as getActiveOtelContext, N as getOtelMetaFields, O as resetShutdownHandlers, P as initOtelBridge, R as DEFAULT_LOG_COLORS, S as runWithTraceId, T as deregisterFromShutdown, U as usePlugin, V as PluginRegistry, W as LogixiaContext, _ as _setActiveContextKey, b as getCurrentTraceId, c as KafkaTraceInterceptor, d as __decorateMetadata, f as LogixiaLogger, g as TraceContext, h as TRACE_CONTEXT_KEY, i as WebSocketTraceInterceptor, j as disableOtelBridge, k as applyRedaction, l as LogixiaLoggerService, m as DEFAULT_TRACE_HEADERS, n as LOGIXIA_LOGGER_PREFIX, o as resolveResponseHeader, p as createLogger$1, r as LogixiaLoggerModule, s as __decorateParam, t as LOGIXIA_LOGGER_CONFIG, u as __decorate, v as createTraceMiddleware, w as traceStorage, x as getTraceContextKey, y as extractTraceId, z as DEFAULT_LOG_LEVELS } from "./logitron-logger.module-uyg1-Khn.mjs";
3
+ import "./search-DOvSI-mb.mjs";
5
4
  import { Catch, Inject, Optional } from "@nestjs/common";
6
5
 
7
6
  //#region src/exceptions/exception.ts
@@ -39,13 +38,16 @@ function isLogixiaException(value) {
39
38
  //#endregion
40
39
  //#region src/exceptions/builder.ts
41
40
  /**
42
- * Generates a trace ID using Node's built-in `crypto.randomUUID`.
43
- * No extra dependencies required.
41
+ * Generates a trace ID via the shared {@link TraceContext} generator.
42
+ *
43
+ * Delegates to `TraceContext.instance.generate()` so any custom generator
44
+ * configured on `TraceIdConfig.generator` is respected — avoids the silent
45
+ * "builder has its own UUID source" divergence this module had previously.
44
46
  *
45
47
  * @example `'550e8400-e29b-41d4-a716-446655440000'`
46
48
  */
47
49
  function generateTraceId() {
48
- return randomUUID();
50
+ return TraceContext.instance.generate();
49
51
  }
50
52
  /** @deprecated Use `generateTraceId` instead. */
51
53
  const generateRequestId = generateTraceId;
@@ -99,24 +101,34 @@ var ErrorResponseBuilder = class {
99
101
  * @param params - See `BuildParams`.
100
102
  * @returns The unified error response and the HTTP status code to send.
101
103
  *
104
+ * @remarks
105
+ * `traceId` does not need to be supplied by the caller in most cases — the
106
+ * builder reads `TraceContext.instance.getCurrentTraceId()` internally and
107
+ * falls back to the explicit `traceId` argument only when AsyncLocalStorage
108
+ * is empty. If neither source yields a value, `meta.trace_id` is omitted.
109
+ *
102
110
  * @example In a NestJS exception filter
103
111
  * ```ts
104
112
  * const { response, httpStatus } = ErrorResponseBuilder.build<AppCode, AppType>({
105
113
  * exception,
106
- * traceId: request.headers['x-trace-id'] as string | undefined,
114
+ * // Omit traceId it will be picked up from ALS automatically.
107
115
  * path: request.url,
108
116
  * service: process.env.SERVICE_NAME,
109
117
  * startTime: request.startTime,
110
118
  * });
111
119
  *
112
120
  * if (process.env.NODE_ENV === 'production') delete response.debug;
113
- * response.setHeader('X-Trace-ID', response.meta.trace_id);
121
+ * // Echo the resolved traceId back on whatever header your TraceIdConfig says —
122
+ * // do NOT hardcode 'X-Trace-Id', use `resolveResponseHeader(config)` instead.
123
+ * if (response.meta.trace_id) {
124
+ * response.setHeader(resolveResponseHeader(config) ?? 'X-Trace-Id', response.meta.trace_id);
125
+ * }
114
126
  * response.status(httpStatus).json(response);
115
127
  * ```
116
128
  */
117
129
  static build(params) {
118
130
  const { exception, path, service, startTime, traceId: rawTraceId } = params;
119
- const traceId = rawTraceId ?? generateTraceId();
131
+ const traceId = TraceContext.instance.getCurrentTraceId() ?? rawTraceId;
120
132
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
121
133
  const durationMs = startTime !== void 0 ? Date.now() - startTime : void 0;
122
134
  if (isLogixiaException(exception)) {
@@ -134,7 +146,7 @@ var ErrorResponseBuilder = class {
134
146
  success: false,
135
147
  error: errorBlock,
136
148
  meta: {
137
- trace_id: traceId,
149
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
138
150
  timestamp,
139
151
  path,
140
152
  status: exception.httpStatus
@@ -165,7 +177,7 @@ var ErrorResponseBuilder = class {
165
177
  message
166
178
  },
167
179
  meta: {
168
- trace_id: traceId,
180
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
169
181
  timestamp,
170
182
  path,
171
183
  status
@@ -185,7 +197,7 @@ var ErrorResponseBuilder = class {
185
197
  message: "An unexpected error occurred."
186
198
  },
187
199
  meta: {
188
- trace_id: traceId,
200
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
189
201
  timestamp,
190
202
  path,
191
203
  status: 500
@@ -199,6 +211,7 @@ var ErrorResponseBuilder = class {
199
211
 
200
212
  //#endregion
201
213
  //#region src/core/nestjs-extras.ts
214
+ var _ref;
202
215
  /**
203
216
  * Inject the Logixia logger registered in the current NestJS DI container.
204
217
  *
@@ -242,9 +255,12 @@ function LogMethod(options = {}) {
242
255
  const start = Date.now();
243
256
  const entry = { method: label };
244
257
  if (logArgs && args.length > 0) entry["args"] = args;
258
+ const reportLogFailure = (phase, err) => {
259
+ process.stderr.write(`[logixia] @LogMethod(${label}) ${phase} log failed: ${String(err)}\n`);
260
+ };
245
261
  if (logger$1) {
246
262
  const logFnRaw = logger$1[level];
247
- await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`→ ${label}`, entry).catch(() => void 0);
263
+ await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`→ ${label}`, entry).catch((e) => reportLogFailure("entry", e));
248
264
  }
249
265
  try {
250
266
  const result = await originalMethod.apply(this, args);
@@ -255,13 +271,17 @@ function LogMethod(options = {}) {
255
271
  if (logResult) exit["result"] = result;
256
272
  if (logger$1) {
257
273
  const logFnRaw = logger$1[level];
258
- await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`← ${label}`, exit).catch(() => void 0);
274
+ await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`← ${label}`, exit).catch((e) => reportLogFailure("exit", e));
259
275
  }
260
276
  return result;
261
277
  } catch (error) {
262
278
  if (logger$1 && logErrors) {
263
279
  const err = error instanceof Error ? error : new Error(String(error));
264
- logger$1.error(err, `${label} durationMs=${Date.now() - start}`);
280
+ const errLog = logger$1.error(err, {
281
+ method: label,
282
+ durationMs: Date.now() - start
283
+ });
284
+ if (errLog !== void 0 && errLog !== null && typeof errLog.catch === "function") errLog.catch((e) => reportLogFailure("error", e));
265
285
  }
266
286
  throw error;
267
287
  }
@@ -270,15 +290,16 @@ function LogMethod(options = {}) {
270
290
  };
271
291
  }
272
292
  let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
273
- constructor(logger$1) {
293
+ constructor(logger$1, loggerConfig) {
274
294
  this._logger = logger$1 ?? LogixiaLoggerModule._globalLogger ?? void 0;
295
+ this._traceConfig = typeof (loggerConfig === null || loggerConfig === void 0 ? void 0 : loggerConfig.traceId) === "object" ? loggerConfig.traceId : void 0;
275
296
  }
276
297
  catch(exception, host) {
277
298
  var _request$headers;
278
299
  const ctx = host.switchToHttp();
279
300
  const request = ctx.getRequest();
280
301
  const response = ctx.getResponse();
281
- const traceId = ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers["x-trace-id"]) ?? request.id ?? void 0;
302
+ const traceId = TraceContext.instance.getCurrentTraceId() ?? ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers["x-trace-id"]) ?? request.id ?? void 0;
282
303
  const { response: errorResponse, httpStatus } = ErrorResponseBuilder.build({
283
304
  exception,
284
305
  traceId,
@@ -290,16 +311,24 @@ let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
290
311
  method: request.method ?? "",
291
312
  url: request.url ?? "",
292
313
  status: httpStatus,
293
- trace_id: errorResponse.meta.trace_id
314
+ ...errorResponse.meta.trace_id !== void 0 ? { trace_id: errorResponse.meta.trace_id } : {}
315
+ };
316
+ const onLogFailure = (err) => {
317
+ process.stderr.write(`[logixia] ExceptionFilter failed to write log entry: ${String(err)}\n`);
294
318
  };
319
+ let logPromise;
295
320
  if (httpStatus >= 500) {
296
321
  const err = exception instanceof Error ? exception : new Error(String(exception));
297
- this._logger.error(err, requestMeta);
298
- } else if (isLogixiaException(exception)) this._logger.warn(`[${errorResponse.error.code}] ${errorResponse.error.message}`, requestMeta);
299
- else this._logger.warn(`[${httpStatus}] ${errorResponse.error.message}`, requestMeta);
322
+ logPromise = this._logger.error(err, requestMeta);
323
+ } else if (isLogixiaException(exception)) logPromise = this._logger.warn(`[${errorResponse.error.code}] ${errorResponse.error.message}`, requestMeta);
324
+ else logPromise = this._logger.warn(`[${httpStatus}] ${errorResponse.error.message}`, requestMeta);
325
+ if (logPromise && typeof logPromise.catch === "function") logPromise.catch(onLogFailure);
300
326
  }
301
327
  if (process.env["NODE_ENV"] === "production") delete errorResponse.debug;
302
- response.setHeader("X-Trace-ID", errorResponse.meta.trace_id);
328
+ if (errorResponse.meta.trace_id) {
329
+ const traceHeader = resolveResponseHeader(this._traceConfig);
330
+ if (traceHeader) response.setHeader(traceHeader, errorResponse.meta.trace_id);
331
+ }
303
332
  if (httpStatus === 429) response.setHeader("Retry-After", "60");
304
333
  response.status(httpStatus).json(errorResponse);
305
334
  }
@@ -308,7 +337,9 @@ LogixiaExceptionFilter = __decorate([
308
337
  Catch(),
309
338
  __decorateParam(0, Optional()),
310
339
  __decorateParam(0, Inject(`${LOGIXIA_LOGGER_PREFIX}SERVICE`)),
311
- __decorateMetadata("design:paramtypes", [Object])
340
+ __decorateParam(1, Optional()),
341
+ __decorateParam(1, Inject(LOGIXIA_LOGGER_CONFIG)),
342
+ __decorateMetadata("design:paramtypes", [Object, typeof (_ref = typeof Partial !== "undefined" && Partial) === "function" ? _ref : Object])
312
343
  ], LogixiaExceptionFilter);
313
344
 
314
345
  //#endregion
@@ -344,15 +375,18 @@ var JsonFormatter = class {
344
375
  }
345
376
  serializePayload(payload) {
346
377
  const serialized = {};
347
- for (const [key, value] of Object.entries(payload)) try {
348
- if (value instanceof Error) serialized[key] = serializeError(value);
349
- else if (value instanceof Date) serialized[key] = value.toISOString();
350
- else if (typeof value === "function") serialized[key] = "[Function]";
351
- else if (typeof value === "symbol") serialized[key] = value.toString();
352
- else if (value === void 0) serialized[key] = null;
353
- else serialized[key] = value;
354
- } catch {
355
- serialized[key] = "[Unserializable]";
378
+ for (const [key, value] of Object.entries(payload)) {
379
+ if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
380
+ try {
381
+ if (value instanceof Error) serialized[key] = serializeError(value);
382
+ else if (value instanceof Date) serialized[key] = value.toISOString();
383
+ else if (typeof value === "function") serialized[key] = "[Function]";
384
+ else if (typeof value === "symbol") serialized[key] = value.toString();
385
+ else if (value === void 0) serialized[key] = null;
386
+ else serialized[key] = value;
387
+ } catch {
388
+ serialized[key] = "[Unserializable]";
389
+ }
356
390
  }
357
391
  return serialized;
358
392
  }
@@ -360,6 +394,8 @@ var JsonFormatter = class {
360
394
 
361
395
  //#endregion
362
396
  //#region src/formatters/text.formatter.ts
397
+ const CONTROL_CHARS_RE = /[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;
398
+ const stripControls = (value) => value.replace(CONTROL_CHARS_RE, "");
363
399
  var TextFormatter = class TextFormatter {
364
400
  constructor(options = {}) {
365
401
  this.colorize = options.colorize ?? true;
@@ -392,18 +428,22 @@ var TextFormatter = class TextFormatter {
392
428
  const formattedLevel = this.colorize ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}` : levelName.toUpperCase().padEnd(5);
393
429
  parts.push(`[${formattedLevel}]`);
394
430
  if (this.includeAppName) {
395
- const appName = this.colorize ? `${this.colors.bold}${entry.appName}${this.colors.reset}` : entry.appName;
431
+ const safeAppName = stripControls(entry.appName);
432
+ const appName = this.colorize ? `${this.colors.bold}${safeAppName}${this.colors.reset}` : safeAppName;
396
433
  parts.push(`[${appName}]`);
397
434
  }
398
435
  if (this.includeTraceId && entry.traceId) {
399
- const traceId = this.colorize ? `${this.colors.dim}${entry.traceId}${this.colors.reset}` : entry.traceId;
436
+ const safeTraceId = stripControls(entry.traceId);
437
+ const traceId = this.colorize ? `${this.colors.dim}${safeTraceId}${this.colors.reset}` : safeTraceId;
400
438
  parts.push(`[${traceId}]`);
401
439
  }
402
440
  if (this.includeContext && entry.context) {
403
- const context = this.colorize ? `${this.colors.cyan}${entry.context}${this.colors.reset}` : entry.context;
441
+ const safeContext = stripControls(entry.context);
442
+ const context = this.colorize ? `${this.colors.cyan}${safeContext}${this.colors.reset}` : safeContext;
404
443
  parts.push(`[${context}]`);
405
444
  }
406
- const message = this.colorize && entry.level === LogLevel.ERROR ? `${this.colors.error}${entry.message}${this.colors.reset}` : entry.message;
445
+ const safeMessage = stripControls(entry.message);
446
+ const message = this.colorize && entry.level === LogLevel.ERROR ? `${this.colors.error}${safeMessage}${this.colors.reset}` : safeMessage;
407
447
  parts.push(message);
408
448
  if (entry.payload && Object.keys(entry.payload).length > 0) {
409
449
  const payload = this.formatPayload(entry.payload);