logixia 1.12.4 → 1.12.6
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/README.md +80 -27
- package/dist/.tsbuildinfo +1 -1
- package/dist/async-context-CSHWoHMB.js +88 -0
- package/dist/async-context-CSHWoHMB.js.map +1 -0
- package/dist/async-context-CwBNMm2E.mjs +68 -0
- package/dist/async-context-CwBNMm2E.mjs.map +1 -0
- package/dist/azure-monitor.transport-CG7ClkYj.d.ts +62 -0
- package/dist/azure-monitor.transport-CG7ClkYj.d.ts.map +1 -0
- package/dist/azure-monitor.transport-CHnjVRF-.mjs +152 -0
- package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +1 -0
- package/dist/azure-monitor.transport-Cm74kXZS.d.mts +62 -0
- package/dist/azure-monitor.transport-Cm74kXZS.d.mts.map +1 -0
- package/dist/azure-monitor.transport-CrvfHd9C.js +157 -0
- package/dist/azure-monitor.transport-CrvfHd9C.js.map +1 -0
- package/dist/azure.d.mts +3 -0
- package/dist/azure.d.ts +3 -0
- package/dist/azure.js +6 -0
- package/dist/azure.mjs +6 -0
- package/dist/batch-buffer-BY-mRWIK.js +170 -0
- package/dist/batch-buffer-BY-mRWIK.js.map +1 -0
- package/dist/batch-buffer-PGvSgbmd.mjs +132 -0
- package/dist/batch-buffer-PGvSgbmd.mjs.map +1 -0
- package/dist/browser.d.mts +427 -0
- package/dist/browser.d.mts.map +1 -0
- package/dist/browser.d.ts +427 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +590 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.mjs +586 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/chunk-DLSkYcPk.mjs +7 -0
- package/dist/chunk-nOFOJqeH.js +30 -0
- package/dist/cloudwatch.d.mts +3 -0
- package/dist/cloudwatch.d.ts +3 -0
- package/dist/cloudwatch.js +6 -0
- package/dist/cloudwatch.mjs +6 -0
- package/dist/cloudwatch.transport-CGHY4buE.d.mts +81 -0
- package/dist/cloudwatch.transport-CGHY4buE.d.mts.map +1 -0
- package/dist/cloudwatch.transport-DK_8cKd3.d.ts +81 -0
- package/dist/cloudwatch.transport-DK_8cKd3.d.ts.map +1 -0
- package/dist/cloudwatch.transport-pNBNWJLt.js +370 -0
- package/dist/cloudwatch.transport-pNBNWJLt.js.map +1 -0
- package/dist/cloudwatch.transport-yBwm4OeO.mjs +360 -0
- package/dist/cloudwatch.transport-yBwm4OeO.mjs.map +1 -0
- package/dist/coerce.utils-BN980Y9V.js +44 -0
- package/dist/coerce.utils-BN980Y9V.js.map +1 -0
- package/dist/coerce.utils-Dxv4_ikC.mjs +38 -0
- package/dist/coerce.utils-Dxv4_ikC.mjs.map +1 -0
- package/dist/correlation.d.mts +238 -0
- package/dist/correlation.d.mts.map +1 -0
- package/dist/correlation.d.ts +238 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +272 -0
- package/dist/correlation.js.map +1 -0
- package/dist/correlation.mjs +261 -0
- package/dist/correlation.mjs.map +1 -0
- package/dist/gcp.d.mts +3 -0
- package/dist/gcp.d.ts +3 -0
- package/dist/gcp.js +6 -0
- package/dist/gcp.mjs +6 -0
- package/dist/gcp.transport-BJuNRFe_.mjs +192 -0
- package/dist/gcp.transport-BJuNRFe_.mjs.map +1 -0
- package/dist/gcp.transport-BOhkVKlI.d.ts +71 -0
- package/dist/gcp.transport-BOhkVKlI.d.ts.map +1 -0
- package/dist/gcp.transport-Bi6CUqZR.d.mts +71 -0
- package/dist/gcp.transport-Bi6CUqZR.d.mts.map +1 -0
- package/dist/gcp.transport-SHdtc1n0.js +198 -0
- package/dist/gcp.transport-SHdtc1n0.js.map +1 -0
- package/dist/{index-CwFww7VC.d.ts → index-BPKwwERo.d.mts} +18 -174
- package/dist/index-BPKwwERo.d.mts.map +1 -0
- package/dist/{index-DnyeaoZU.d.mts → index-C1X-TE5I.d.ts} +18 -174
- package/dist/index-C1X-TE5I.d.ts.map +1 -0
- package/dist/index.d.mts +41 -11
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +40 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -147
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +62 -132
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-BUJYMZbE.js +70 -0
- package/dist/internal-log-BUJYMZbE.js.map +1 -0
- package/dist/internal-log-Cm8SOWSV.mjs +52 -0
- package/dist/internal-log-Cm8SOWSV.mjs.map +1 -0
- package/dist/{logitron-logger.module-BIGTm2V6.mjs → logitron-logger.module-Bs3XYZgF.mjs} +266 -166
- package/dist/logitron-logger.module-Bs3XYZgF.mjs.map +1 -0
- package/dist/{logitron-logger.module-BTxDpK6u.js → logitron-logger.module-BsDZR5BH.js} +297 -203
- package/dist/logitron-logger.module-BsDZR5BH.js.map +1 -0
- package/dist/{logitron-logger.module-BmT-ewin.d.ts → logitron-logger.module-CxT1F6Cm.d.ts} +23 -10
- package/dist/logitron-logger.module-CxT1F6Cm.d.ts.map +1 -0
- package/dist/{logitron-logger.module-BCq3sF27.d.mts → logitron-logger.module-zDKVd_o0.d.mts} +23 -10
- package/dist/logitron-logger.module-zDKVd_o0.d.mts.map +1 -0
- package/dist/middleware.d.mts +5 -2
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +5 -2
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +13 -4
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +14 -4
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +3 -2
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +3 -2
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +6 -2
- package/dist/nest.mjs +6 -2
- package/dist/safe-stringify-DJ66tW5I.mjs +118 -0
- package/dist/safe-stringify-DJ66tW5I.mjs.map +1 -0
- package/dist/safe-stringify-DWo3aZp_.js +142 -0
- package/dist/safe-stringify-DWo3aZp_.js.map +1 -0
- package/dist/search-CFQRISUv.mjs +1596 -0
- package/dist/search-CFQRISUv.mjs.map +1 -0
- package/dist/search-CQOo-Iq6.d.mts +816 -0
- package/dist/search-CQOo-Iq6.d.mts.map +1 -0
- package/dist/search-DujhR94O.d.ts +816 -0
- package/dist/search-DujhR94O.d.ts.map +1 -0
- package/dist/search-njTI2hdo.js +1631 -0
- package/dist/search-njTI2hdo.js.map +1 -0
- package/dist/search.d.mts +4 -1
- package/dist/search.d.ts +4 -1
- package/dist/search.js +9 -1
- package/dist/search.mjs +3 -2
- package/dist/testing.d.mts +2 -1
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +2 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/{transport.manager-ciG4r5uz.js → transport.manager-BivyUTtU.js} +497 -437
- package/dist/transport.manager-BivyUTtU.js.map +1 -0
- package/dist/{transport.manager-DETpXuaY.mjs → transport.manager-D6KL3t9V.mjs} +473 -364
- package/dist/transport.manager-D6KL3t9V.mjs.map +1 -0
- package/dist/transport.types-B5vcyv2k.d.mts +187 -0
- package/dist/transport.types-B5vcyv2k.d.mts.map +1 -0
- package/dist/transport.types-BuY84TwO.d.ts +187 -0
- package/dist/transport.types-BuY84TwO.d.ts.map +1 -0
- package/dist/transports.d.mts +90 -29
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +90 -29
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +14 -2
- package/dist/transports.mjs +10 -2
- package/dist/worker-entry.js +1241 -0
- package/dist/worker.d.mts +3 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.js +4 -0
- package/dist/worker.mjs +4 -0
- package/dist/worker.transport-BP8Q28Z2.d.mts +76 -0
- package/dist/worker.transport-BP8Q28Z2.d.mts.map +1 -0
- package/dist/worker.transport-BhMyvqQ2.mjs +167 -0
- package/dist/worker.transport-BhMyvqQ2.mjs.map +1 -0
- package/dist/worker.transport-CfH6z37Z.js +168 -0
- package/dist/worker.transport-CfH6z37Z.js.map +1 -0
- package/dist/worker.transport-mKXgNK0L.d.ts +76 -0
- package/dist/worker.transport-mKXgNK0L.d.ts.map +1 -0
- package/package.json +23 -18
- package/dist/index-CwFww7VC.d.ts.map +0 -1
- package/dist/index-DnyeaoZU.d.mts.map +0 -1
- package/dist/logitron-logger.module-BCq3sF27.d.mts.map +0 -1
- package/dist/logitron-logger.module-BIGTm2V6.mjs.map +0 -1
- package/dist/logitron-logger.module-BTxDpK6u.js.map +0 -1
- package/dist/logitron-logger.module-BmT-ewin.d.ts.map +0 -1
- package/dist/search-Cg_OasF-.d.ts +0 -1
- package/dist/search-DN676Dnz.d.mts +0 -1
- package/dist/search-DOvSI-mb.mjs +0 -1
- package/dist/search-DoZF3RZj.js +0 -0
- package/dist/transport.manager-DETpXuaY.mjs.map +0 -1
- package/dist/transport.manager-ciG4r5uz.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as TraceIdConfig, b as LoggerWithLevels, f as ILogger, h as LogEntry, p as ILoggerDefault, v as LogLevelString, x as NamespaceLevels, y as LoggerConfig } from "./index-
|
|
1
|
+
import { E as TraceIdConfig, b as LoggerWithLevels, f as ILogger, h as LogEntry, p as ILoggerDefault, v as LogLevelString, x as NamespaceLevels, y as LoggerConfig } from "./index-C1X-TE5I.js";
|
|
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";
|
|
@@ -109,7 +109,7 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
109
109
|
private context?;
|
|
110
110
|
private timers;
|
|
111
111
|
private contextData;
|
|
112
|
-
private transportManager
|
|
112
|
+
private transportManager;
|
|
113
113
|
private fieldState;
|
|
114
114
|
/** Stable fallback trace ID generated ONCE per logger instance. */
|
|
115
115
|
private readonly fallbackTraceId;
|
|
@@ -117,6 +117,8 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
117
117
|
private _levelValues;
|
|
118
118
|
/** Numeric threshold for the currently active log level. */
|
|
119
119
|
private _minLevelValue;
|
|
120
|
+
/** `source=value` pairs already reported as unknown levels — warn once per logger. */
|
|
121
|
+
private readonly _warnedInvalidLevels;
|
|
120
122
|
/** Pre-built ANSI color codes to avoid recreating the object in colorize(). */
|
|
121
123
|
private _colorMap;
|
|
122
124
|
/** Pre-computed field-enabled booleans so isFieldEnabled() isn't called per log. */
|
|
@@ -133,10 +135,12 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
133
135
|
/** True when a redact config is present — short-circuits applyRedaction when false. */
|
|
134
136
|
private _hasRedact;
|
|
135
137
|
/** Sampling engine — only created when sampling config is present. */
|
|
136
|
-
private _sampler
|
|
138
|
+
private _sampler;
|
|
137
139
|
/** Per-instance plugin registry — also inherits from the global registry at creation time. */
|
|
138
140
|
private readonly _pluginRegistry;
|
|
139
|
-
|
|
141
|
+
/** Set on loggers created by child(); they borrow the root's transports, sampler and plugins. */
|
|
142
|
+
private readonly _parent;
|
|
143
|
+
constructor(config: TConfig, context?: string, parent?: LogixiaLogger<TConfig>);
|
|
140
144
|
private setupGracefulShutdown;
|
|
141
145
|
private createCustomLevelMethods;
|
|
142
146
|
/**
|
|
@@ -156,6 +160,12 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
156
160
|
timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
|
|
157
161
|
setLevel(level: LogLevelString): void;
|
|
158
162
|
getLevel(): LogLevelString;
|
|
163
|
+
private _validLevelList;
|
|
164
|
+
/**
|
|
165
|
+
* Canonicalise a level from config/ENV. Unknown values return undefined so the
|
|
166
|
+
* caller falls through to the next source, and warn once per logger per source.
|
|
167
|
+
*/
|
|
168
|
+
private _validLevel;
|
|
159
169
|
/**
|
|
160
170
|
* Replace the per-namespace level map at runtime — no restart needed.
|
|
161
171
|
*
|
|
@@ -182,7 +192,9 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
182
192
|
isFieldEnabled(fieldName: string): boolean;
|
|
183
193
|
getFieldState(): Record<string, boolean>;
|
|
184
194
|
resetFieldState(): void;
|
|
195
|
+
/** @deprecated No-op. Library code never prompts on stdin; use setTransportLevels(). */
|
|
185
196
|
enableTransportLevelPrompting(): void;
|
|
197
|
+
/** @deprecated No-op. */
|
|
186
198
|
disableTransportLevelPrompting(): void;
|
|
187
199
|
setTransportLevels(transportId: string, levels: string[]): void;
|
|
188
200
|
getTransportLevels(transportId: string): string[] | undefined;
|
|
@@ -457,6 +469,7 @@ declare class WebSocketTraceInterceptor implements NestInterceptor {
|
|
|
457
469
|
//#endregion
|
|
458
470
|
//#region src/core/logitron-logger.module.d.ts
|
|
459
471
|
declare const LOGIXIA_LOGGER_CONFIG = "LOGIXIA_LOGGER_CONFIG";
|
|
472
|
+
declare const LOGIXIA_TRACE_CONFIG = "TRACE_CONFIG";
|
|
460
473
|
declare const LOGIXIA_LOGGER_PREFIX = "LOGIXIA_LOGGER_";
|
|
461
474
|
interface LogixiaAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
462
475
|
useExisting?: Type<LogixiaOptionsFactory>;
|
|
@@ -536,12 +549,12 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
536
549
|
useValue?: never;
|
|
537
550
|
} | {
|
|
538
551
|
provide: typeof KafkaTraceInterceptor;
|
|
539
|
-
useFactory: (traceConfig:
|
|
552
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
|
|
540
553
|
inject: string[];
|
|
541
554
|
useValue?: never;
|
|
542
555
|
} | {
|
|
543
556
|
provide: typeof WebSocketTraceInterceptor;
|
|
544
|
-
useFactory: (traceConfig:
|
|
557
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
|
|
545
558
|
inject: string[];
|
|
546
559
|
useValue?: never;
|
|
547
560
|
})[];
|
|
@@ -575,11 +588,11 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
575
588
|
inject: string[];
|
|
576
589
|
} | {
|
|
577
590
|
provide: typeof KafkaTraceInterceptor;
|
|
578
|
-
useFactory: (traceConfig:
|
|
591
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
|
|
579
592
|
inject: string[];
|
|
580
593
|
} | {
|
|
581
594
|
provide: typeof WebSocketTraceInterceptor;
|
|
582
|
-
useFactory: (traceConfig:
|
|
595
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
|
|
583
596
|
inject: string[];
|
|
584
597
|
})[];
|
|
585
598
|
exports: (string | typeof WebSocketTraceInterceptor | typeof KafkaTraceInterceptor | typeof LogixiaLoggerService)[];
|
|
@@ -601,5 +614,5 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
601
614
|
private static createAsyncOptionsProvider;
|
|
602
615
|
}
|
|
603
616
|
//#endregion
|
|
604
|
-
export {
|
|
605
|
-
//# sourceMappingURL=logitron-logger.module-
|
|
617
|
+
export { usePlugin as _, LogixiaLoggerModule as a, KafkaTraceInterceptor as c, LogixiaServiceWithLevels as d, LogixiaLogger as f, globalPluginRegistry as g, PluginRegistry as h, LogixiaAsyncOptions as i, LogixiaLoggerService as l, LogixiaPlugin as m, LOGIXIA_LOGGER_PREFIX as n, LogixiaOptionsFactory as o, createLogger as p, LOGIXIA_TRACE_CONFIG as r, WebSocketTraceInterceptor as s, LOGIXIA_LOGGER_CONFIG as t, LogixiaServiceWith as u };
|
|
618
|
+
//# sourceMappingURL=logitron-logger.module-CxT1F6Cm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logitron-logger.module-CxT1F6Cm.d.ts","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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"}
|
package/dist/{logitron-logger.module-BCq3sF27.d.mts → logitron-logger.module-zDKVd_o0.d.mts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { E as TraceIdConfig, b as LoggerWithLevels, f as ILogger, h as LogEntry, p as ILoggerDefault, v as LogLevelString, x as NamespaceLevels, y as LoggerConfig } from "./index-
|
|
1
|
+
import { E as TraceIdConfig, b as LoggerWithLevels, f as ILogger, h as LogEntry, p as ILoggerDefault, v as LogLevelString, x as NamespaceLevels, y as LoggerConfig } from "./index-BPKwwERo.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";
|
|
@@ -109,7 +109,7 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
109
109
|
private context?;
|
|
110
110
|
private timers;
|
|
111
111
|
private contextData;
|
|
112
|
-
private transportManager
|
|
112
|
+
private transportManager;
|
|
113
113
|
private fieldState;
|
|
114
114
|
/** Stable fallback trace ID generated ONCE per logger instance. */
|
|
115
115
|
private readonly fallbackTraceId;
|
|
@@ -117,6 +117,8 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
117
117
|
private _levelValues;
|
|
118
118
|
/** Numeric threshold for the currently active log level. */
|
|
119
119
|
private _minLevelValue;
|
|
120
|
+
/** `source=value` pairs already reported as unknown levels — warn once per logger. */
|
|
121
|
+
private readonly _warnedInvalidLevels;
|
|
120
122
|
/** Pre-built ANSI color codes to avoid recreating the object in colorize(). */
|
|
121
123
|
private _colorMap;
|
|
122
124
|
/** Pre-computed field-enabled booleans so isFieldEnabled() isn't called per log. */
|
|
@@ -133,10 +135,12 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
133
135
|
/** True when a redact config is present — short-circuits applyRedaction when false. */
|
|
134
136
|
private _hasRedact;
|
|
135
137
|
/** Sampling engine — only created when sampling config is present. */
|
|
136
|
-
private _sampler
|
|
138
|
+
private _sampler;
|
|
137
139
|
/** Per-instance plugin registry — also inherits from the global registry at creation time. */
|
|
138
140
|
private readonly _pluginRegistry;
|
|
139
|
-
|
|
141
|
+
/** Set on loggers created by child(); they borrow the root's transports, sampler and plugins. */
|
|
142
|
+
private readonly _parent;
|
|
143
|
+
constructor(config: TConfig, context?: string, parent?: LogixiaLogger<TConfig>);
|
|
140
144
|
private setupGracefulShutdown;
|
|
141
145
|
private createCustomLevelMethods;
|
|
142
146
|
/**
|
|
@@ -156,6 +160,12 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
156
160
|
timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
|
|
157
161
|
setLevel(level: LogLevelString): void;
|
|
158
162
|
getLevel(): LogLevelString;
|
|
163
|
+
private _validLevelList;
|
|
164
|
+
/**
|
|
165
|
+
* Canonicalise a level from config/ENV. Unknown values return undefined so the
|
|
166
|
+
* caller falls through to the next source, and warn once per logger per source.
|
|
167
|
+
*/
|
|
168
|
+
private _validLevel;
|
|
159
169
|
/**
|
|
160
170
|
* Replace the per-namespace level map at runtime — no restart needed.
|
|
161
171
|
*
|
|
@@ -182,7 +192,9 @@ declare class LogixiaLogger<TConfig extends LoggerConfig<Record<string, number>>
|
|
|
182
192
|
isFieldEnabled(fieldName: string): boolean;
|
|
183
193
|
getFieldState(): Record<string, boolean>;
|
|
184
194
|
resetFieldState(): void;
|
|
195
|
+
/** @deprecated No-op. Library code never prompts on stdin; use setTransportLevels(). */
|
|
185
196
|
enableTransportLevelPrompting(): void;
|
|
197
|
+
/** @deprecated No-op. */
|
|
186
198
|
disableTransportLevelPrompting(): void;
|
|
187
199
|
setTransportLevels(transportId: string, levels: string[]): void;
|
|
188
200
|
getTransportLevels(transportId: string): string[] | undefined;
|
|
@@ -457,6 +469,7 @@ declare class WebSocketTraceInterceptor implements NestInterceptor {
|
|
|
457
469
|
//#endregion
|
|
458
470
|
//#region src/core/logitron-logger.module.d.ts
|
|
459
471
|
declare const LOGIXIA_LOGGER_CONFIG = "LOGIXIA_LOGGER_CONFIG";
|
|
472
|
+
declare const LOGIXIA_TRACE_CONFIG = "TRACE_CONFIG";
|
|
460
473
|
declare const LOGIXIA_LOGGER_PREFIX = "LOGIXIA_LOGGER_";
|
|
461
474
|
interface LogixiaAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
462
475
|
useExisting?: Type<LogixiaOptionsFactory>;
|
|
@@ -536,12 +549,12 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
536
549
|
useValue?: never;
|
|
537
550
|
} | {
|
|
538
551
|
provide: typeof KafkaTraceInterceptor;
|
|
539
|
-
useFactory: (traceConfig:
|
|
552
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
|
|
540
553
|
inject: string[];
|
|
541
554
|
useValue?: never;
|
|
542
555
|
} | {
|
|
543
556
|
provide: typeof WebSocketTraceInterceptor;
|
|
544
|
-
useFactory: (traceConfig:
|
|
557
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
|
|
545
558
|
inject: string[];
|
|
546
559
|
useValue?: never;
|
|
547
560
|
})[];
|
|
@@ -575,11 +588,11 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
575
588
|
inject: string[];
|
|
576
589
|
} | {
|
|
577
590
|
provide: typeof KafkaTraceInterceptor;
|
|
578
|
-
useFactory: (traceConfig:
|
|
591
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
|
|
579
592
|
inject: string[];
|
|
580
593
|
} | {
|
|
581
594
|
provide: typeof WebSocketTraceInterceptor;
|
|
582
|
-
useFactory: (traceConfig:
|
|
595
|
+
useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
|
|
583
596
|
inject: string[];
|
|
584
597
|
})[];
|
|
585
598
|
exports: (string | typeof WebSocketTraceInterceptor | typeof KafkaTraceInterceptor | typeof LogixiaLoggerService)[];
|
|
@@ -601,5 +614,5 @@ declare class LogixiaLoggerModule implements NestModule {
|
|
|
601
614
|
private static createAsyncOptionsProvider;
|
|
602
615
|
}
|
|
603
616
|
//#endregion
|
|
604
|
-
export {
|
|
605
|
-
//# sourceMappingURL=logitron-logger.module-
|
|
617
|
+
export { usePlugin as _, LogixiaLoggerModule as a, KafkaTraceInterceptor as c, LogixiaServiceWithLevels as d, LogixiaLogger as f, globalPluginRegistry as g, PluginRegistry as h, LogixiaAsyncOptions as i, LogixiaLoggerService as l, LogixiaPlugin as m, LOGIXIA_LOGGER_PREFIX as n, LogixiaOptionsFactory as o, createLogger as p, LOGIXIA_TRACE_CONFIG as r, WebSocketTraceInterceptor as s, LOGIXIA_LOGGER_CONFIG as t, LogixiaServiceWith as u };
|
|
618
|
+
//# sourceMappingURL=logitron-logger.module-zDKVd_o0.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logitron-logger.module-zDKVd_o0.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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"}
|
package/dist/middleware.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./transport.types-B5vcyv2k.mjs";
|
|
2
|
+
import { u as IBaseLogger } from "./index-BPKwwERo.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/middleware/http-logger.d.ts
|
|
4
5
|
|
|
@@ -77,7 +78,9 @@ interface FastifyInstance {
|
|
|
77
78
|
* await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));
|
|
78
79
|
* ```
|
|
79
80
|
*/
|
|
80
|
-
declare function createFastifyPlugin(logger: IBaseLogger, options?: HttpLoggerOptions): (fastify: FastifyInstance, _opts: unknown, done: () => void) => void
|
|
81
|
+
declare function createFastifyPlugin(logger: IBaseLogger, options?: HttpLoggerOptions): ((fastify: FastifyInstance, _opts: unknown, done: () => void) => void) & {
|
|
82
|
+
[x: symbol]: string | boolean;
|
|
83
|
+
};
|
|
81
84
|
//#endregion
|
|
82
85
|
export { type FastifyInstance, type HttpLoggerOptions, type IncomingRequest, type OutgoingResponse, createExpressMiddleware, createFastifyPlugin };
|
|
83
86
|
//# sourceMappingURL=middleware.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.mts","names":[],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.d.mts","names":[],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":[],"mappings":";;;;;UA6BiB,iBAAA;;;;;eAKF;;;;;;;;;;;;;;;;;;sBAkBO,oBAAoB;;;;;;;;;;;;;;;;;;;;;UAuBzB,eAAA;;;YAGL;;;;;;;UAMK,gBAAA;;;;;;;;;iBA0DD,uBAAA,SACN,uBACC,0BACF,sBAAsB;UA6Ed,eAAA;;;;;;;;;;;iBAYD,mBAAA,SAA4B,uBAAsB,+BAUzB"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./transport.types-BuY84TwO.js";
|
|
2
|
+
import { u as IBaseLogger } from "./index-C1X-TE5I.js";
|
|
2
3
|
|
|
3
4
|
//#region src/middleware/http-logger.d.ts
|
|
4
5
|
|
|
@@ -77,7 +78,9 @@ interface FastifyInstance {
|
|
|
77
78
|
* await fastify.register(createFastifyPlugin(logger, { slowRequestThresholdMs: 500 }));
|
|
78
79
|
* ```
|
|
79
80
|
*/
|
|
80
|
-
declare function createFastifyPlugin(logger: IBaseLogger, options?: HttpLoggerOptions): (fastify: FastifyInstance, _opts: unknown, done: () => void) => void
|
|
81
|
+
declare function createFastifyPlugin(logger: IBaseLogger, options?: HttpLoggerOptions): ((fastify: FastifyInstance, _opts: unknown, done: () => void) => void) & {
|
|
82
|
+
[x: symbol]: string | boolean;
|
|
83
|
+
};
|
|
81
84
|
//#endregion
|
|
82
85
|
export { type FastifyInstance, type HttpLoggerOptions, type IncomingRequest, type OutgoingResponse, createExpressMiddleware, createFastifyPlugin };
|
|
83
86
|
//# sourceMappingURL=middleware.d.ts.map
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","names":[],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","names":[],"sources":["../src/middleware/http-logger.ts"],"sourcesContent":[],"mappings":";;;;;UA6BiB,iBAAA;;;;;eAKF;;;;;;;;;;;;;;;;;;sBAkBO,oBAAoB;;;;;;;;;;;;;;;;;;;;;UAuBzB,eAAA;;;YAGL;;;;;;;UAMK,gBAAA;;;;;;;;;iBA0DD,uBAAA,SACN,uBACC,0BACF,sBAAsB;UA6Ed,eAAA;;;;;;;;;;;iBAYD,mBAAA,SAA4B,uBAAsB,+BAUzB"}
|
package/dist/middleware.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const require_safe_stringify = require('./safe-stringify-DWo3aZp_.js');
|
|
1
2
|
|
|
2
3
|
//#region src/middleware/http-logger.ts
|
|
3
4
|
const DEFAULT_REDACT_HEADERS = new Set([
|
|
@@ -83,7 +84,7 @@ function createExpressMiddleware(logger, options = {}) {
|
|
|
83
84
|
*/
|
|
84
85
|
function createFastifyPlugin(logger, options = {}) {
|
|
85
86
|
const { skip, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
|
|
86
|
-
|
|
87
|
+
function logixiaFastifyPlugin(fastify, _opts, done) {
|
|
87
88
|
fastify.addHook("onRequest", (request, _reply, hookDone) => {
|
|
88
89
|
var _req$headers2;
|
|
89
90
|
const req = request;
|
|
@@ -99,8 +100,12 @@ function createFastifyPlugin(logger, options = {}) {
|
|
|
99
100
|
});
|
|
100
101
|
fastify.addHook("onResponse", (request, reply, hookDone) => {
|
|
101
102
|
const req = request;
|
|
103
|
+
if (req._logixiaStart === void 0) {
|
|
104
|
+
hookDone();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
102
107
|
const rep = reply;
|
|
103
|
-
const duration = Date.now() -
|
|
108
|
+
const duration = Date.now() - req._logixiaStart;
|
|
104
109
|
const status = rep.statusCode ?? 0;
|
|
105
110
|
const traceId = req._logixiaId ?? shortId();
|
|
106
111
|
const level = status >= 500 ? errorLevel : responseLevel;
|
|
@@ -119,12 +124,16 @@ function createFastifyPlugin(logger, options = {}) {
|
|
|
119
124
|
hookDone();
|
|
120
125
|
});
|
|
121
126
|
done();
|
|
122
|
-
}
|
|
127
|
+
}
|
|
128
|
+
return Object.assign(logixiaFastifyPlugin, {
|
|
129
|
+
[Symbol.for("skip-override")]: true,
|
|
130
|
+
[Symbol.for("fastify.display-name")]: "logixia"
|
|
131
|
+
});
|
|
123
132
|
}
|
|
124
133
|
function truncateBody(body, maxBytes = 4096) {
|
|
125
134
|
if (typeof body === "string") return body.length > maxBytes ? body.slice(0, maxBytes) + "…[truncated]" : body;
|
|
126
135
|
if (body && typeof body === "object") {
|
|
127
|
-
const str =
|
|
136
|
+
const str = require_safe_stringify.stringifyForLog(body);
|
|
128
137
|
if (str.length > maxBytes) return str.slice(0, maxBytes) + "…[truncated]";
|
|
129
138
|
}
|
|
130
139
|
return body;
|
package/dist/middleware.js.map
CHANGED
|
@@ -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 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\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 if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\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 //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\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 covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\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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"}
|
|
1
|
+
{"version":3,"file":"middleware.js","names":["out: Record<string, unknown>","fields: Record<string, unknown>","stringifyForLog"],"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\nimport type { IBaseLogger } from '../types';\nimport { stringifyForLog } from '../utils/safe-stringify';\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 if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\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 //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\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 covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\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 function logixiaFastifyPlugin(fastify: FastifyInstance, _opts: unknown, done: () => void): 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 if (req._logixiaStart === undefined) {\n hookDone();\n return;\n }\n\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - req._logixiaStart;\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 return Object.assign(logixiaFastifyPlugin, {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'logixia',\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 = stringifyForLog(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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"}
|
package/dist/middleware.mjs
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { i as stringifyForLog } from "./safe-stringify-DJ66tW5I.mjs";
|
|
2
|
+
|
|
1
3
|
//#region src/middleware/http-logger.ts
|
|
2
4
|
const DEFAULT_REDACT_HEADERS = new Set([
|
|
3
5
|
"authorization",
|
|
@@ -82,7 +84,7 @@ function createExpressMiddleware(logger, options = {}) {
|
|
|
82
84
|
*/
|
|
83
85
|
function createFastifyPlugin(logger, options = {}) {
|
|
84
86
|
const { skip, traceIdHeader = "x-trace-id", requestLevel = "debug", responseLevel = "info", errorLevel = "error", slowRequestThresholdMs = 1e3 } = options;
|
|
85
|
-
|
|
87
|
+
function logixiaFastifyPlugin(fastify, _opts, done) {
|
|
86
88
|
fastify.addHook("onRequest", (request, _reply, hookDone) => {
|
|
87
89
|
var _req$headers2;
|
|
88
90
|
const req = request;
|
|
@@ -98,8 +100,12 @@ function createFastifyPlugin(logger, options = {}) {
|
|
|
98
100
|
});
|
|
99
101
|
fastify.addHook("onResponse", (request, reply, hookDone) => {
|
|
100
102
|
const req = request;
|
|
103
|
+
if (req._logixiaStart === void 0) {
|
|
104
|
+
hookDone();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
101
107
|
const rep = reply;
|
|
102
|
-
const duration = Date.now() -
|
|
108
|
+
const duration = Date.now() - req._logixiaStart;
|
|
103
109
|
const status = rep.statusCode ?? 0;
|
|
104
110
|
const traceId = req._logixiaId ?? shortId();
|
|
105
111
|
const level = status >= 500 ? errorLevel : responseLevel;
|
|
@@ -118,12 +124,16 @@ function createFastifyPlugin(logger, options = {}) {
|
|
|
118
124
|
hookDone();
|
|
119
125
|
});
|
|
120
126
|
done();
|
|
121
|
-
}
|
|
127
|
+
}
|
|
128
|
+
return Object.assign(logixiaFastifyPlugin, {
|
|
129
|
+
[Symbol.for("skip-override")]: true,
|
|
130
|
+
[Symbol.for("fastify.display-name")]: "logixia"
|
|
131
|
+
});
|
|
122
132
|
}
|
|
123
133
|
function truncateBody(body, maxBytes = 4096) {
|
|
124
134
|
if (typeof body === "string") return body.length > maxBytes ? body.slice(0, maxBytes) + "…[truncated]" : body;
|
|
125
135
|
if (body && typeof body === "object") {
|
|
126
|
-
const str =
|
|
136
|
+
const str = stringifyForLog(body);
|
|
127
137
|
if (str.length > maxBytes) return str.slice(0, maxBytes) + "…[truncated]";
|
|
128
138
|
}
|
|
129
139
|
return body;
|
package/dist/middleware.mjs.map
CHANGED
|
@@ -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 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\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 if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\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 //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\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 covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\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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"}
|
|
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\nimport type { IBaseLogger } from '../types';\nimport { stringifyForLog } from '../utils/safe-stringify';\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 if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\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 //\n // BOTH 'finish' and 'close' fire on a normal response, so guard against\n // logging the completion twice (which would duplicate the completed entry and\n // the slow-request warning).\n let completed = false;\n const onFinish = (): void => {\n if (completed) return;\n completed = true;\n\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 covers a client that disconnects before 'finish' fires. The\n // `completed` guard ensures a normal finish+close pair logs only once.\n res.once?.('close', onFinish);\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 function logixiaFastifyPlugin(fastify: FastifyInstance, _opts: unknown, done: () => void): 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 if (req._logixiaStart === undefined) {\n hookDone();\n return;\n }\n\n const rep = reply as { statusCode?: number };\n const duration = Date.now() - req._logixiaStart;\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 return Object.assign(logixiaFastifyPlugin, {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'logixia',\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 = stringifyForLog(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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"}
|
package/dist/nest.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import "./transport.types-B5vcyv2k.mjs";
|
|
2
|
+
import { E as TraceIdConfig } from "./index-BPKwwERo.mjs";
|
|
3
|
+
import { a as LogixiaLoggerModule, c as KafkaTraceInterceptor, d as LogixiaServiceWithLevels, i as LogixiaAsyncOptions, l as LogixiaLoggerService, n as LOGIXIA_LOGGER_PREFIX, o as LogixiaOptionsFactory, s as WebSocketTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG, u as LogixiaServiceWith } from "./logitron-logger.module-zDKVd_o0.mjs";
|
|
3
4
|
import { NestMiddleware } from "@nestjs/common";
|
|
4
5
|
import { NextFunction, Request, Response } from "express";
|
|
5
6
|
|
package/dist/nest.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;QAmFyB,MAAA,CAAA;EAAgB,UAAA,OAAA,CAAA;IAxBD,UAAA,OAAA,CAAA;MAAc,OAAA,CAAA,EAAA,MAAA;;;;cAAzC,eAAA,YAA2B;;;uBAGY;WAqBzC,cAAc,gBAAgB"}
|
package/dist/nest.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import "./transport.types-BuY84TwO.js";
|
|
2
|
+
import { E as TraceIdConfig } from "./index-C1X-TE5I.js";
|
|
3
|
+
import { a as LogixiaLoggerModule, c as KafkaTraceInterceptor, d as LogixiaServiceWithLevels, i as LogixiaAsyncOptions, l as LogixiaLoggerService, n as LOGIXIA_LOGGER_PREFIX, o as LogixiaOptionsFactory, s as WebSocketTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG, u as LogixiaServiceWith } from "./logitron-logger.module-CxT1F6Cm.js";
|
|
3
4
|
import { NestMiddleware } from "@nestjs/common";
|
|
4
5
|
import { NextFunction, Request, Response } from "express";
|
|
5
6
|
|
package/dist/nest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nest.d.ts","names":[],"sources":["../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;QAmFyB,MAAA,CAAA;EAAgB,UAAA,OAAA,CAAA;IAxBD,UAAA,OAAA,CAAA;MAAc,OAAA,CAAA,EAAA,MAAA;;;;cAAzC,eAAA,YAA2B;;;uBAGY;WAqBzC,cAAc,gBAAgB"}
|
package/dist/nest.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
require('./
|
|
2
|
-
|
|
1
|
+
require('./internal-log-BUJYMZbE.js');
|
|
2
|
+
require('./safe-stringify-DWo3aZp_.js');
|
|
3
|
+
require('./async-context-CSHWoHMB.js');
|
|
4
|
+
const require_logitron_logger_module = require('./logitron-logger.module-BsDZR5BH.js');
|
|
5
|
+
require('./coerce.utils-BN980Y9V.js');
|
|
6
|
+
require('./transport.manager-BivyUTtU.js');
|
|
3
7
|
|
|
4
8
|
Object.defineProperty(exports, 'KafkaTraceInterceptor', {
|
|
5
9
|
enumerable: true,
|
package/dist/nest.mjs
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import
|
|
1
|
+
import "./internal-log-Cm8SOWSV.mjs";
|
|
2
|
+
import "./safe-stringify-DJ66tW5I.mjs";
|
|
3
|
+
import "./async-context-CwBNMm2E.mjs";
|
|
4
|
+
import { a as WebSocketTraceInterceptor, i as LogixiaLoggerModule, l as KafkaTraceInterceptor, n as LOGIXIA_LOGGER_PREFIX, o as TraceMiddleware, t as LOGIXIA_LOGGER_CONFIG, u as LogixiaLoggerService } from "./logitron-logger.module-Bs3XYZgF.mjs";
|
|
5
|
+
import "./coerce.utils-Dxv4_ikC.mjs";
|
|
6
|
+
import "./transport.manager-D6KL3t9V.mjs";
|
|
3
7
|
|
|
4
8
|
export { KafkaTraceInterceptor, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LogixiaLoggerModule, LogixiaLoggerService, TraceMiddleware, WebSocketTraceInterceptor };
|