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.js CHANGED
@@ -1,11 +1,8 @@
1
- const require_chunk = require('./chunk-BTgCAUrQ.js');
2
- const require_logitron_logger_module = require('./logitron-logger.module-Fof9Er2E.js');
3
- const require_transport_manager = require('./transport.manager-DU1W0wV3.js');
4
- require('./search-DeZHhWxB.js');
5
- let node_crypto = require("node:crypto");
6
- node_crypto = require_chunk.__toESM(node_crypto);
1
+ const require_transport_manager = require('./transport.manager-DPjB-dFH.js');
2
+ const require_logitron_logger_module = require('./logitron-logger.module-CMDM61Iz.js');
3
+ require('./search-DoZF3RZj.js');
7
4
  let __nestjs_common = require("@nestjs/common");
8
- __nestjs_common = require_chunk.__toESM(__nestjs_common);
5
+ __nestjs_common = require_transport_manager.__toESM(__nestjs_common);
9
6
 
10
7
  //#region src/exceptions/exception.ts
11
8
  var LogixiaException = class extends Error {
@@ -42,13 +39,16 @@ function isLogixiaException(value) {
42
39
  //#endregion
43
40
  //#region src/exceptions/builder.ts
44
41
  /**
45
- * Generates a trace ID using Node's built-in `crypto.randomUUID`.
46
- * No extra dependencies required.
42
+ * Generates a trace ID via the shared {@link TraceContext} generator.
43
+ *
44
+ * Delegates to `TraceContext.instance.generate()` so any custom generator
45
+ * configured on `TraceIdConfig.generator` is respected — avoids the silent
46
+ * "builder has its own UUID source" divergence this module had previously.
47
47
  *
48
48
  * @example `'550e8400-e29b-41d4-a716-446655440000'`
49
49
  */
50
50
  function generateTraceId() {
51
- return (0, node_crypto.randomUUID)();
51
+ return require_logitron_logger_module.TraceContext.instance.generate();
52
52
  }
53
53
  /** @deprecated Use `generateTraceId` instead. */
54
54
  const generateRequestId = generateTraceId;
@@ -102,24 +102,34 @@ var ErrorResponseBuilder = class {
102
102
  * @param params - See `BuildParams`.
103
103
  * @returns The unified error response and the HTTP status code to send.
104
104
  *
105
+ * @remarks
106
+ * `traceId` does not need to be supplied by the caller in most cases — the
107
+ * builder reads `TraceContext.instance.getCurrentTraceId()` internally and
108
+ * falls back to the explicit `traceId` argument only when AsyncLocalStorage
109
+ * is empty. If neither source yields a value, `meta.trace_id` is omitted.
110
+ *
105
111
  * @example In a NestJS exception filter
106
112
  * ```ts
107
113
  * const { response, httpStatus } = ErrorResponseBuilder.build<AppCode, AppType>({
108
114
  * exception,
109
- * traceId: request.headers['x-trace-id'] as string | undefined,
115
+ * // Omit traceId it will be picked up from ALS automatically.
110
116
  * path: request.url,
111
117
  * service: process.env.SERVICE_NAME,
112
118
  * startTime: request.startTime,
113
119
  * });
114
120
  *
115
121
  * if (process.env.NODE_ENV === 'production') delete response.debug;
116
- * response.setHeader('X-Trace-ID', response.meta.trace_id);
122
+ * // Echo the resolved traceId back on whatever header your TraceIdConfig says —
123
+ * // do NOT hardcode 'X-Trace-Id', use `resolveResponseHeader(config)` instead.
124
+ * if (response.meta.trace_id) {
125
+ * response.setHeader(resolveResponseHeader(config) ?? 'X-Trace-Id', response.meta.trace_id);
126
+ * }
117
127
  * response.status(httpStatus).json(response);
118
128
  * ```
119
129
  */
120
130
  static build(params) {
121
131
  const { exception, path, service, startTime, traceId: rawTraceId } = params;
122
- const traceId = rawTraceId ?? generateTraceId();
132
+ const traceId = require_logitron_logger_module.TraceContext.instance.getCurrentTraceId() ?? rawTraceId;
123
133
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
124
134
  const durationMs = startTime !== void 0 ? Date.now() - startTime : void 0;
125
135
  if (isLogixiaException(exception)) {
@@ -137,7 +147,7 @@ var ErrorResponseBuilder = class {
137
147
  success: false,
138
148
  error: errorBlock,
139
149
  meta: {
140
- trace_id: traceId,
150
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
141
151
  timestamp,
142
152
  path,
143
153
  status: exception.httpStatus
@@ -168,7 +178,7 @@ var ErrorResponseBuilder = class {
168
178
  message
169
179
  },
170
180
  meta: {
171
- trace_id: traceId,
181
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
172
182
  timestamp,
173
183
  path,
174
184
  status
@@ -188,7 +198,7 @@ var ErrorResponseBuilder = class {
188
198
  message: "An unexpected error occurred."
189
199
  },
190
200
  meta: {
191
- trace_id: traceId,
201
+ ...traceId !== void 0 ? { trace_id: traceId } : {},
192
202
  timestamp,
193
203
  path,
194
204
  status: 500
@@ -202,6 +212,7 @@ var ErrorResponseBuilder = class {
202
212
 
203
213
  //#endregion
204
214
  //#region src/core/nestjs-extras.ts
215
+ var _ref;
205
216
  /**
206
217
  * Inject the Logixia logger registered in the current NestJS DI container.
207
218
  *
@@ -245,9 +256,12 @@ function LogMethod(options = {}) {
245
256
  const start = Date.now();
246
257
  const entry = { method: label };
247
258
  if (logArgs && args.length > 0) entry["args"] = args;
259
+ const reportLogFailure = (phase, err) => {
260
+ process.stderr.write(`[logixia] @LogMethod(${label}) ${phase} log failed: ${String(err)}\n`);
261
+ };
248
262
  if (logger$1) {
249
263
  const logFnRaw = logger$1[level];
250
- await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`→ ${label}`, entry).catch(() => void 0);
264
+ await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`→ ${label}`, entry).catch((e) => reportLogFailure("entry", e));
251
265
  }
252
266
  try {
253
267
  const result = await originalMethod.apply(this, args);
@@ -258,13 +272,17 @@ function LogMethod(options = {}) {
258
272
  if (logResult) exit["result"] = result;
259
273
  if (logger$1) {
260
274
  const logFnRaw = logger$1[level];
261
- await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`← ${label}`, exit).catch(() => void 0);
275
+ await (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(`← ${label}`, exit).catch((e) => reportLogFailure("exit", e));
262
276
  }
263
277
  return result;
264
278
  } catch (error) {
265
279
  if (logger$1 && logErrors) {
266
280
  const err = error instanceof Error ? error : new Error(String(error));
267
- logger$1.error(err, `${label} durationMs=${Date.now() - start}`);
281
+ const errLog = logger$1.error(err, {
282
+ method: label,
283
+ durationMs: Date.now() - start
284
+ });
285
+ if (errLog !== void 0 && errLog !== null && typeof errLog.catch === "function") errLog.catch((e) => reportLogFailure("error", e));
268
286
  }
269
287
  throw error;
270
288
  }
@@ -273,15 +291,16 @@ function LogMethod(options = {}) {
273
291
  };
274
292
  }
275
293
  let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
276
- constructor(logger$1) {
294
+ constructor(logger$1, loggerConfig) {
277
295
  this._logger = logger$1 ?? require_logitron_logger_module.LogixiaLoggerModule._globalLogger ?? void 0;
296
+ this._traceConfig = typeof (loggerConfig === null || loggerConfig === void 0 ? void 0 : loggerConfig.traceId) === "object" ? loggerConfig.traceId : void 0;
278
297
  }
279
298
  catch(exception, host) {
280
299
  var _request$headers;
281
300
  const ctx = host.switchToHttp();
282
301
  const request = ctx.getRequest();
283
302
  const response = ctx.getResponse();
284
- const traceId = ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers["x-trace-id"]) ?? request.id ?? void 0;
303
+ const traceId = require_logitron_logger_module.TraceContext.instance.getCurrentTraceId() ?? ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers["x-trace-id"]) ?? request.id ?? void 0;
285
304
  const { response: errorResponse, httpStatus } = ErrorResponseBuilder.build({
286
305
  exception,
287
306
  traceId,
@@ -293,16 +312,24 @@ let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
293
312
  method: request.method ?? "",
294
313
  url: request.url ?? "",
295
314
  status: httpStatus,
296
- trace_id: errorResponse.meta.trace_id
315
+ ...errorResponse.meta.trace_id !== void 0 ? { trace_id: errorResponse.meta.trace_id } : {}
316
+ };
317
+ const onLogFailure = (err) => {
318
+ process.stderr.write(`[logixia] ExceptionFilter failed to write log entry: ${String(err)}\n`);
297
319
  };
320
+ let logPromise;
298
321
  if (httpStatus >= 500) {
299
322
  const err = exception instanceof Error ? exception : new Error(String(exception));
300
- this._logger.error(err, requestMeta);
301
- } else if (isLogixiaException(exception)) this._logger.warn(`[${errorResponse.error.code}] ${errorResponse.error.message}`, requestMeta);
302
- else this._logger.warn(`[${httpStatus}] ${errorResponse.error.message}`, requestMeta);
323
+ logPromise = this._logger.error(err, requestMeta);
324
+ } else if (isLogixiaException(exception)) logPromise = this._logger.warn(`[${errorResponse.error.code}] ${errorResponse.error.message}`, requestMeta);
325
+ else logPromise = this._logger.warn(`[${httpStatus}] ${errorResponse.error.message}`, requestMeta);
326
+ if (logPromise && typeof logPromise.catch === "function") logPromise.catch(onLogFailure);
303
327
  }
304
328
  if (process.env["NODE_ENV"] === "production") delete errorResponse.debug;
305
- response.setHeader("X-Trace-ID", errorResponse.meta.trace_id);
329
+ if (errorResponse.meta.trace_id) {
330
+ const traceHeader = require_logitron_logger_module.resolveResponseHeader(this._traceConfig);
331
+ if (traceHeader) response.setHeader(traceHeader, errorResponse.meta.trace_id);
332
+ }
306
333
  if (httpStatus === 429) response.setHeader("Retry-After", "60");
307
334
  response.status(httpStatus).json(errorResponse);
308
335
  }
@@ -311,7 +338,9 @@ LogixiaExceptionFilter = require_logitron_logger_module.__decorate([
311
338
  (0, __nestjs_common.Catch)(),
312
339
  require_logitron_logger_module.__decorateParam(0, (0, __nestjs_common.Optional)()),
313
340
  require_logitron_logger_module.__decorateParam(0, (0, __nestjs_common.Inject)(`${require_logitron_logger_module.LOGIXIA_LOGGER_PREFIX}SERVICE`)),
314
- require_logitron_logger_module.__decorateMetadata("design:paramtypes", [Object])
341
+ require_logitron_logger_module.__decorateParam(1, (0, __nestjs_common.Optional)()),
342
+ require_logitron_logger_module.__decorateParam(1, (0, __nestjs_common.Inject)(require_logitron_logger_module.LOGIXIA_LOGGER_CONFIG)),
343
+ require_logitron_logger_module.__decorateMetadata("design:paramtypes", [Object, typeof (_ref = typeof Partial !== "undefined" && Partial) === "function" ? _ref : Object])
315
344
  ], LogixiaExceptionFilter);
316
345
 
317
346
  //#endregion
@@ -347,15 +376,18 @@ var JsonFormatter = class {
347
376
  }
348
377
  serializePayload(payload) {
349
378
  const serialized = {};
350
- for (const [key, value] of Object.entries(payload)) try {
351
- if (value instanceof Error) serialized[key] = require_logitron_logger_module.serializeError(value);
352
- else if (value instanceof Date) serialized[key] = value.toISOString();
353
- else if (typeof value === "function") serialized[key] = "[Function]";
354
- else if (typeof value === "symbol") serialized[key] = value.toString();
355
- else if (value === void 0) serialized[key] = null;
356
- else serialized[key] = value;
357
- } catch {
358
- serialized[key] = "[Unserializable]";
379
+ for (const [key, value] of Object.entries(payload)) {
380
+ if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
381
+ try {
382
+ if (value instanceof Error) serialized[key] = require_logitron_logger_module.serializeError(value);
383
+ else if (value instanceof Date) serialized[key] = value.toISOString();
384
+ else if (typeof value === "function") serialized[key] = "[Function]";
385
+ else if (typeof value === "symbol") serialized[key] = value.toString();
386
+ else if (value === void 0) serialized[key] = null;
387
+ else serialized[key] = value;
388
+ } catch {
389
+ serialized[key] = "[Unserializable]";
390
+ }
359
391
  }
360
392
  return serialized;
361
393
  }
@@ -363,6 +395,8 @@ var JsonFormatter = class {
363
395
 
364
396
  //#endregion
365
397
  //#region src/formatters/text.formatter.ts
398
+ const CONTROL_CHARS_RE = /[\x00-\x08\x0B-\x1F\x7F-\x9F]/g;
399
+ const stripControls = (value) => value.replace(CONTROL_CHARS_RE, "");
366
400
  var TextFormatter = class TextFormatter {
367
401
  constructor(options = {}) {
368
402
  this.colorize = options.colorize ?? true;
@@ -395,18 +429,22 @@ var TextFormatter = class TextFormatter {
395
429
  const formattedLevel = this.colorize ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}` : levelName.toUpperCase().padEnd(5);
396
430
  parts.push(`[${formattedLevel}]`);
397
431
  if (this.includeAppName) {
398
- const appName = this.colorize ? `${this.colors.bold}${entry.appName}${this.colors.reset}` : entry.appName;
432
+ const safeAppName = stripControls(entry.appName);
433
+ const appName = this.colorize ? `${this.colors.bold}${safeAppName}${this.colors.reset}` : safeAppName;
399
434
  parts.push(`[${appName}]`);
400
435
  }
401
436
  if (this.includeTraceId && entry.traceId) {
402
- const traceId = this.colorize ? `${this.colors.dim}${entry.traceId}${this.colors.reset}` : entry.traceId;
437
+ const safeTraceId = stripControls(entry.traceId);
438
+ const traceId = this.colorize ? `${this.colors.dim}${safeTraceId}${this.colors.reset}` : safeTraceId;
403
439
  parts.push(`[${traceId}]`);
404
440
  }
405
441
  if (this.includeContext && entry.context) {
406
- const context = this.colorize ? `${this.colors.cyan}${entry.context}${this.colors.reset}` : entry.context;
442
+ const safeContext = stripControls(entry.context);
443
+ const context = this.colorize ? `${this.colors.cyan}${safeContext}${this.colors.reset}` : safeContext;
407
444
  parts.push(`[${context}]`);
408
445
  }
409
- const message = this.colorize && entry.level === require_logitron_logger_module.LogLevel.ERROR ? `${this.colors.error}${entry.message}${this.colors.reset}` : entry.message;
446
+ const safeMessage = stripControls(entry.message);
447
+ const message = this.colorize && entry.level === require_logitron_logger_module.LogLevel.ERROR ? `${this.colors.error}${safeMessage}${this.colors.reset}` : safeMessage;
410
448
  parts.push(message);
411
449
  if (entry.payload && Object.keys(entry.payload).length > 0) {
412
450
  const payload = this.formatPayload(entry.payload);