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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/{index-CthBT3t8.d.mts → index-DknhKCCg.d.ts} +12 -1
- package/dist/index-DknhKCCg.d.ts.map +1 -0
- package/dist/{index-ClPZrfIU.d.ts → index-DnhKoNBG.d.mts} +12 -1
- package/dist/index-DnhKoNBG.d.mts.map +1 -0
- package/dist/index.d.mts +87 -16
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +86 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -40
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +77 -37
- package/dist/index.mjs.map +1 -1
- package/dist/{logitron-logger.module-Dx2mUz-g.d.ts → logitron-logger.module-BkPXi0He.d.ts} +97 -5
- package/dist/logitron-logger.module-BkPXi0He.d.ts.map +1 -0
- package/dist/logitron-logger.module-CMDM61Iz.js +2566 -0
- package/dist/logitron-logger.module-CMDM61Iz.js.map +1 -0
- package/dist/{logitron-logger.module-KU_L04y1.d.mts → logitron-logger.module-Cd5M_59H.d.mts} +97 -5
- package/dist/logitron-logger.module-Cd5M_59H.d.mts.map +1 -0
- package/dist/logitron-logger.module-uyg1-Khn.mjs +2285 -0
- package/dist/logitron-logger.module-uyg1-Khn.mjs.map +1 -0
- package/dist/middleware.d.mts +1 -1
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +4 -1
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +4 -1
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +4 -44
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +4 -44
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +3 -93
- package/dist/nest.mjs +3 -92
- package/dist/search.d.mts +1 -1
- package/dist/search.js +1 -1
- package/dist/search.mjs +1 -1
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/{transport.manager-BCnLEmOy.mjs → transport.manager-D3U03fJg.mjs} +21 -11
- package/dist/transport.manager-D3U03fJg.mjs.map +1 -0
- package/dist/{transport.manager-DU1W0wV3.js → transport.manager-DPjB-dFH.js} +49 -15
- package/dist/transport.manager-DPjB-dFH.js.map +1 -0
- package/dist/transports.d.mts +3 -1
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +3 -1
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +1 -1
- package/dist/transports.mjs +1 -1
- package/package.json +24 -23
- package/dist/build-DOx-YxF1.js +0 -536
- package/dist/build-DOx-YxF1.js.map +0 -1
- package/dist/build-DWmxA6A2.mjs +0 -536
- package/dist/build-DWmxA6A2.mjs.map +0 -1
- package/dist/chunk-BTgCAUrQ.js +0 -53
- package/dist/chunk-uEZWKkIX.mjs +0 -32
- package/dist/esm-1Ra90uql.mjs +0 -4256
- package/dist/esm-1Ra90uql.mjs.map +0 -1
- package/dist/esm-FNhqFIqG.js +0 -4267
- package/dist/esm-FNhqFIqG.js.map +0 -1
- package/dist/index-ClPZrfIU.d.ts.map +0 -1
- package/dist/index-CthBT3t8.d.mts.map +0 -1
- package/dist/lib-8XKCHDOH.mjs +0 -66301
- package/dist/lib-8XKCHDOH.mjs.map +0 -1
- package/dist/lib-BNEYXXTQ.js +0 -66304
- package/dist/lib-BNEYXXTQ.js.map +0 -1
- package/dist/logitron-logger.module-DucvDnxZ.mjs +0 -10986
- package/dist/logitron-logger.module-DucvDnxZ.mjs.map +0 -1
- package/dist/logitron-logger.module-Dx2mUz-g.d.ts.map +0 -1
- package/dist/logitron-logger.module-Fof9Er2E.js +0 -11260
- package/dist/logitron-logger.module-Fof9Er2E.js.map +0 -1
- package/dist/logitron-logger.module-KU_L04y1.d.mts.map +0 -1
- package/dist/nest.js.map +0 -1
- package/dist/nest.mjs.map +0 -1
- package/dist/promise-BI-3eI4n.js +0 -22743
- package/dist/promise-BI-3eI4n.js.map +0 -1
- package/dist/promise-BrZcjavs.mjs +0 -22740
- package/dist/promise-BrZcjavs.mjs.map +0 -1
- package/dist/sqlite3-CSkpjC90.js +0 -420
- package/dist/sqlite3-CSkpjC90.js.map +0 -1
- package/dist/sqlite3-DD2_nRRH.mjs +0 -417
- package/dist/sqlite3-DD2_nRRH.mjs.map +0 -1
- package/dist/transport.manager-BCnLEmOy.mjs.map +0 -1
- package/dist/transport.manager-DU1W0wV3.js.map +0 -1
- /package/dist/{search-DanSf_yc.d.mts → search-DN676Dnz.d.mts} +0 -0
- /package/dist/{search-1txemGPh.mjs → search-DOvSI-mb.mjs} +0 -0
- /package/dist/{search-DeZHhWxB.js → search-DoZF3RZj.js} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { f as
|
|
3
|
-
import "./search-
|
|
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
|
|
43
|
-
*
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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 =
|
|
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(() =>
|
|
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(() =>
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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))
|
|
348
|
-
if (
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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);
|