lifecycleion 0.0.1
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/LICENSE +22 -0
- package/README.md +125 -0
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/arrays.cjs +95 -0
- package/dist/lib/arrays.cjs.map +1 -0
- package/dist/lib/arrays.d.cts +15 -0
- package/dist/lib/arrays.d.ts +15 -0
- package/dist/lib/arrays.js +63 -0
- package/dist/lib/arrays.js.map +1 -0
- package/dist/lib/ascii-tables/index.cjs +642 -0
- package/dist/lib/ascii-tables/index.cjs.map +1 -0
- package/dist/lib/ascii-tables/index.d.cts +66 -0
- package/dist/lib/ascii-tables/index.d.ts +66 -0
- package/dist/lib/ascii-tables/index.js +603 -0
- package/dist/lib/ascii-tables/index.js.map +1 -0
- package/dist/lib/clamp.cjs +41 -0
- package/dist/lib/clamp.cjs.map +1 -0
- package/dist/lib/clamp.d.cts +26 -0
- package/dist/lib/clamp.d.ts +26 -0
- package/dist/lib/clamp.js +15 -0
- package/dist/lib/clamp.js.map +1 -0
- package/dist/lib/constants.cjs +73 -0
- package/dist/lib/constants.cjs.map +1 -0
- package/dist/lib/constants.d.cts +17 -0
- package/dist/lib/constants.d.ts +17 -0
- package/dist/lib/constants.js +34 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/curly-brackets.cjs +77 -0
- package/dist/lib/curly-brackets.cjs.map +1 -0
- package/dist/lib/curly-brackets.d.cts +17 -0
- package/dist/lib/curly-brackets.d.ts +17 -0
- package/dist/lib/curly-brackets.js +52 -0
- package/dist/lib/curly-brackets.js.map +1 -0
- package/dist/lib/deep-clone.cjs +87 -0
- package/dist/lib/deep-clone.cjs.map +1 -0
- package/dist/lib/deep-clone.d.cts +19 -0
- package/dist/lib/deep-clone.d.ts +19 -0
- package/dist/lib/deep-clone.js +62 -0
- package/dist/lib/deep-clone.js.map +1 -0
- package/dist/lib/error-to-string.cjs +743 -0
- package/dist/lib/error-to-string.cjs.map +1 -0
- package/dist/lib/error-to-string.d.cts +3 -0
- package/dist/lib/error-to-string.d.ts +3 -0
- package/dist/lib/error-to-string.js +706 -0
- package/dist/lib/error-to-string.js.map +1 -0
- package/dist/lib/event-emitter.cjs +899 -0
- package/dist/lib/event-emitter.cjs.map +1 -0
- package/dist/lib/event-emitter.d.cts +78 -0
- package/dist/lib/event-emitter.d.ts +78 -0
- package/dist/lib/event-emitter.js +861 -0
- package/dist/lib/event-emitter.js.map +1 -0
- package/dist/lib/id-helpers.cjs +205 -0
- package/dist/lib/id-helpers.cjs.map +1 -0
- package/dist/lib/id-helpers.d.cts +198 -0
- package/dist/lib/id-helpers.d.ts +198 -0
- package/dist/lib/id-helpers.js +170 -0
- package/dist/lib/id-helpers.js.map +1 -0
- package/dist/lib/is-boolean.cjs +33 -0
- package/dist/lib/is-boolean.cjs.map +1 -0
- package/dist/lib/is-boolean.d.cts +19 -0
- package/dist/lib/is-boolean.d.ts +19 -0
- package/dist/lib/is-boolean.js +8 -0
- package/dist/lib/is-boolean.js.map +1 -0
- package/dist/lib/is-function.cjs +33 -0
- package/dist/lib/is-function.cjs.map +1 -0
- package/dist/lib/is-function.d.cts +3 -0
- package/dist/lib/is-function.d.ts +3 -0
- package/dist/lib/is-function.js +8 -0
- package/dist/lib/is-function.js.map +1 -0
- package/dist/lib/is-number.cjs +38 -0
- package/dist/lib/is-number.cjs.map +1 -0
- package/dist/lib/is-number.d.cts +38 -0
- package/dist/lib/is-number.d.ts +38 -0
- package/dist/lib/is-number.js +12 -0
- package/dist/lib/is-number.js.map +1 -0
- package/dist/lib/is-plain-object.cjs +33 -0
- package/dist/lib/is-plain-object.cjs.map +1 -0
- package/dist/lib/is-plain-object.d.cts +20 -0
- package/dist/lib/is-plain-object.d.ts +20 -0
- package/dist/lib/is-plain-object.js +8 -0
- package/dist/lib/is-plain-object.js.map +1 -0
- package/dist/lib/is-promise.cjs +34 -0
- package/dist/lib/is-promise.cjs.map +1 -0
- package/dist/lib/is-promise.d.cts +3 -0
- package/dist/lib/is-promise.d.ts +3 -0
- package/dist/lib/is-promise.js +9 -0
- package/dist/lib/is-promise.js.map +1 -0
- package/dist/lib/json-helpers.cjs +49 -0
- package/dist/lib/json-helpers.cjs.map +1 -0
- package/dist/lib/json-helpers.d.cts +10 -0
- package/dist/lib/json-helpers.d.ts +10 -0
- package/dist/lib/json-helpers.js +22 -0
- package/dist/lib/json-helpers.js.map +1 -0
- package/dist/lib/lifecycle-manager/index.cjs +5594 -0
- package/dist/lib/lifecycle-manager/index.cjs.map +1 -0
- package/dist/lib/lifecycle-manager/index.d.cts +2044 -0
- package/dist/lib/lifecycle-manager/index.d.ts +2044 -0
- package/dist/lib/lifecycle-manager/index.js +5543 -0
- package/dist/lib/lifecycle-manager/index.js.map +1 -0
- package/dist/lib/logger/index.cjs +2514 -0
- package/dist/lib/logger/index.cjs.map +1 -0
- package/dist/lib/logger/index.d.cts +630 -0
- package/dist/lib/logger/index.d.ts +630 -0
- package/dist/lib/logger/index.js +2470 -0
- package/dist/lib/logger/index.js.map +1 -0
- package/dist/lib/padding-utils.cjs +77 -0
- package/dist/lib/padding-utils.cjs.map +1 -0
- package/dist/lib/padding-utils.d.cts +44 -0
- package/dist/lib/padding-utils.d.ts +44 -0
- package/dist/lib/padding-utils.js +46 -0
- package/dist/lib/padding-utils.js.map +1 -0
- package/dist/lib/process-signal-manager.cjs +1306 -0
- package/dist/lib/process-signal-manager.cjs.map +1 -0
- package/dist/lib/process-signal-manager.d.cts +305 -0
- package/dist/lib/process-signal-manager.d.ts +305 -0
- package/dist/lib/process-signal-manager.js +1269 -0
- package/dist/lib/process-signal-manager.js.map +1 -0
- package/dist/lib/promise-protected-resolver.cjs +828 -0
- package/dist/lib/promise-protected-resolver.cjs.map +1 -0
- package/dist/lib/promise-protected-resolver.d.cts +17 -0
- package/dist/lib/promise-protected-resolver.d.ts +17 -0
- package/dist/lib/promise-protected-resolver.js +791 -0
- package/dist/lib/promise-protected-resolver.js.map +1 -0
- package/dist/lib/retry-utils/index.cjs +2183 -0
- package/dist/lib/retry-utils/index.cjs.map +1 -0
- package/dist/lib/retry-utils/index.d.cts +321 -0
- package/dist/lib/retry-utils/index.d.ts +321 -0
- package/dist/lib/retry-utils/index.js +2133 -0
- package/dist/lib/retry-utils/index.js.map +1 -0
- package/dist/lib/safe-handle-callback.cjs +818 -0
- package/dist/lib/safe-handle-callback.cjs.map +1 -0
- package/dist/lib/safe-handle-callback.d.cts +43 -0
- package/dist/lib/safe-handle-callback.d.ts +43 -0
- package/dist/lib/safe-handle-callback.js +780 -0
- package/dist/lib/safe-handle-callback.js.map +1 -0
- package/dist/lib/serialize-error/index.cjs +93 -0
- package/dist/lib/serialize-error/index.cjs.map +1 -0
- package/dist/lib/serialize-error/index.d.cts +26 -0
- package/dist/lib/serialize-error/index.d.ts +26 -0
- package/dist/lib/serialize-error/index.js +64 -0
- package/dist/lib/serialize-error/index.js.map +1 -0
- package/dist/lib/single-event-observer.cjs +841 -0
- package/dist/lib/single-event-observer.cjs.map +1 -0
- package/dist/lib/single-event-observer.d.cts +54 -0
- package/dist/lib/single-event-observer.d.ts +54 -0
- package/dist/lib/single-event-observer.js +803 -0
- package/dist/lib/single-event-observer.js.map +1 -0
- package/dist/lib/sleep.cjs +37 -0
- package/dist/lib/sleep.cjs.map +1 -0
- package/dist/lib/sleep.d.cts +11 -0
- package/dist/lib/sleep.d.ts +11 -0
- package/dist/lib/sleep.js +12 -0
- package/dist/lib/sleep.js.map +1 -0
- package/dist/lib/strings.cjs +186 -0
- package/dist/lib/strings.cjs.map +1 -0
- package/dist/lib/strings.d.cts +107 -0
- package/dist/lib/strings.d.ts +107 -0
- package/dist/lib/strings.js +149 -0
- package/dist/lib/strings.js.map +1 -0
- package/dist/lib/tmp-dir.cjs +254 -0
- package/dist/lib/tmp-dir.cjs.map +1 -0
- package/dist/lib/tmp-dir.d.cts +63 -0
- package/dist/lib/tmp-dir.d.ts +63 -0
- package/dist/lib/tmp-dir.js +211 -0
- package/dist/lib/tmp-dir.js.map +1 -0
- package/dist/lib/unix-time-helpers.cjs +53 -0
- package/dist/lib/unix-time-helpers.cjs.map +1 -0
- package/dist/lib/unix-time-helpers.d.cts +56 -0
- package/dist/lib/unix-time-helpers.d.ts +56 -0
- package/dist/lib/unix-time-helpers.js +24 -0
- package/dist/lib/unix-time-helpers.js.map +1 -0
- package/package.json +220 -0
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
import { EventEmitter } from '../event-emitter.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Log level enum for filtering logs by severity
|
|
5
|
+
* Lower numbers = more important/higher priority
|
|
6
|
+
* Higher numbers = less important/lower priority
|
|
7
|
+
*/
|
|
8
|
+
declare enum LogLevel {
|
|
9
|
+
ERROR = 0,
|
|
10
|
+
WARN = 1,
|
|
11
|
+
NOTICE = 2,// Normal but significant condition
|
|
12
|
+
SUCCESS = 3,
|
|
13
|
+
INFO = 3,// Same level as SUCCESS (routine operational info)
|
|
14
|
+
DEBUG = 4,
|
|
15
|
+
RAW = 99
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Log level types
|
|
19
|
+
*/
|
|
20
|
+
type LogType = 'error' | 'info' | 'warn' | 'success' | 'notice' | 'debug' | 'raw';
|
|
21
|
+
/**
|
|
22
|
+
* Maps a LogType to its corresponding LogLevel
|
|
23
|
+
*/
|
|
24
|
+
declare function getLogLevel(type: LogType): LogLevel;
|
|
25
|
+
/**
|
|
26
|
+
* Options for log methods
|
|
27
|
+
*/
|
|
28
|
+
interface LogOptions {
|
|
29
|
+
exitCode?: number;
|
|
30
|
+
params?: Record<string, unknown>;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
redactedKeys?: string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Complete log entry that gets passed to sinks
|
|
36
|
+
*/
|
|
37
|
+
interface LogEntry {
|
|
38
|
+
timestamp: number;
|
|
39
|
+
type: LogType;
|
|
40
|
+
serviceName?: string;
|
|
41
|
+
entityName?: string;
|
|
42
|
+
template: string;
|
|
43
|
+
message: string;
|
|
44
|
+
params?: Record<string, unknown>;
|
|
45
|
+
redactedParams?: Record<string, unknown>;
|
|
46
|
+
redactedKeys?: string[];
|
|
47
|
+
error?: unknown;
|
|
48
|
+
exitCode?: number;
|
|
49
|
+
tags?: string[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Sink interface - all sinks must implement this
|
|
53
|
+
*/
|
|
54
|
+
interface LogSink {
|
|
55
|
+
write(entry: LogEntry): void | Promise<void>;
|
|
56
|
+
close?(): void | Promise<void>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Result from beforeExit callback indicating whether to proceed with exit
|
|
60
|
+
*/
|
|
61
|
+
interface BeforeExitResult {
|
|
62
|
+
/**
|
|
63
|
+
* Whether to proceed with the exit
|
|
64
|
+
* - 'proceed': Continue with process exit
|
|
65
|
+
* - 'wait': Shutdown is already in progress, wait for it to complete
|
|
66
|
+
*/
|
|
67
|
+
action: 'proceed' | 'wait';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Redaction function type
|
|
71
|
+
*/
|
|
72
|
+
type RedactFunction = (keyName: string, value: unknown) => unknown;
|
|
73
|
+
/**
|
|
74
|
+
* Array log transformer function type.
|
|
75
|
+
* Receives a log entry and returns either a transformed entry or false to keep the original.
|
|
76
|
+
*/
|
|
77
|
+
type ArrayLogTransformer = (entry: LogEntry) => LogEntry | false;
|
|
78
|
+
/**
|
|
79
|
+
* Main logger configuration options
|
|
80
|
+
*/
|
|
81
|
+
interface LoggerOptions {
|
|
82
|
+
sinks?: LogSink[];
|
|
83
|
+
redactFunction?: RedactFunction;
|
|
84
|
+
callProcessExit?: boolean;
|
|
85
|
+
beforeExitCallback?: (exitCode: number, isFirstExit: boolean) => BeforeExitResult | Promise<BeforeExitResult>;
|
|
86
|
+
onSinkError?: (error: Error, context: 'write' | 'close', sink: LogSink) => void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Logger event types
|
|
90
|
+
*/
|
|
91
|
+
interface LoggerEventMap {
|
|
92
|
+
log: {
|
|
93
|
+
eventType: 'log';
|
|
94
|
+
logType: LogType;
|
|
95
|
+
message: string;
|
|
96
|
+
timestamp: number;
|
|
97
|
+
};
|
|
98
|
+
'exit-called': {
|
|
99
|
+
eventType: 'exit-called';
|
|
100
|
+
code: number;
|
|
101
|
+
isFirstExit: boolean;
|
|
102
|
+
};
|
|
103
|
+
'exit-process': {
|
|
104
|
+
eventType: 'exit-process';
|
|
105
|
+
code: number;
|
|
106
|
+
};
|
|
107
|
+
uncaughtException: {
|
|
108
|
+
eventType: 'uncaughtException';
|
|
109
|
+
error: Error;
|
|
110
|
+
};
|
|
111
|
+
close: {
|
|
112
|
+
eventType: 'close';
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
type LoggerEvent = LoggerEventMap[keyof LoggerEventMap];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Internal types used by Logger and LoggerService
|
|
119
|
+
* These are not part of the public API
|
|
120
|
+
*/
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Internal options for handleLog method
|
|
124
|
+
* Extends LogOptions with internal-only fields
|
|
125
|
+
*/
|
|
126
|
+
interface HandleLogOptions extends LogOptions {
|
|
127
|
+
serviceName?: string;
|
|
128
|
+
entityName?: string;
|
|
129
|
+
error?: unknown;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* ArraySink stores logs in memory for testing and debugging
|
|
134
|
+
*/
|
|
135
|
+
declare class ArraySink implements LogSink {
|
|
136
|
+
logs: LogEntry[];
|
|
137
|
+
private transformer?;
|
|
138
|
+
private closed;
|
|
139
|
+
constructor(options?: {
|
|
140
|
+
transformer?: ArrayLogTransformer;
|
|
141
|
+
});
|
|
142
|
+
write(entry: LogEntry): void;
|
|
143
|
+
/**
|
|
144
|
+
* Clear all stored logs
|
|
145
|
+
*/
|
|
146
|
+
clear(): void;
|
|
147
|
+
/**
|
|
148
|
+
* Get logs in a snapshot-friendly format for testing
|
|
149
|
+
*/
|
|
150
|
+
getSnapshotFriendlyLogs(): string[];
|
|
151
|
+
/**
|
|
152
|
+
* Close the sink and stop accepting new logs
|
|
153
|
+
*/
|
|
154
|
+
close(): void;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
interface ConsoleSinkOptions {
|
|
158
|
+
colors?: boolean;
|
|
159
|
+
timestamps?: boolean;
|
|
160
|
+
typeLabels?: boolean;
|
|
161
|
+
muted?: boolean;
|
|
162
|
+
minLevel?: LogLevel;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* ConsoleSink writes logs to the console with optional colors, timestamps, and type labels
|
|
166
|
+
*/
|
|
167
|
+
declare class ConsoleSink implements LogSink {
|
|
168
|
+
private colors;
|
|
169
|
+
private timestamps;
|
|
170
|
+
private typeLabels;
|
|
171
|
+
private closed;
|
|
172
|
+
private muted;
|
|
173
|
+
private minLevel;
|
|
174
|
+
constructor(options?: ConsoleSinkOptions);
|
|
175
|
+
write(entry: LogEntry): void;
|
|
176
|
+
/**
|
|
177
|
+
* Set the minimum log level for this sink
|
|
178
|
+
*/
|
|
179
|
+
setMinLevel(level: LogLevel): void;
|
|
180
|
+
/**
|
|
181
|
+
* Get the current minimum log level
|
|
182
|
+
*/
|
|
183
|
+
getMinLevel(): LogLevel;
|
|
184
|
+
/**
|
|
185
|
+
* Mute the sink to stop writing logs to console
|
|
186
|
+
*/
|
|
187
|
+
mute(): void;
|
|
188
|
+
/**
|
|
189
|
+
* Unmute the sink to resume writing logs to console
|
|
190
|
+
*/
|
|
191
|
+
unmute(): void;
|
|
192
|
+
/**
|
|
193
|
+
* Check if the sink is currently muted
|
|
194
|
+
*/
|
|
195
|
+
isMuted(): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Close the sink and stop accepting new logs
|
|
198
|
+
*/
|
|
199
|
+
close(): void;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* LoggerService for scoped logging with service names
|
|
204
|
+
*/
|
|
205
|
+
declare class LoggerService {
|
|
206
|
+
private handleLog;
|
|
207
|
+
private serviceName;
|
|
208
|
+
private entityName?;
|
|
209
|
+
constructor(handleLog: (type: LogType, template: string, options?: HandleLogOptions) => void, serviceName: string, entityName?: string);
|
|
210
|
+
/**
|
|
211
|
+
* Create a scoped logger for a specific entity within this service
|
|
212
|
+
*/
|
|
213
|
+
entity(entityName: string): LoggerService;
|
|
214
|
+
/**
|
|
215
|
+
* Log an error message
|
|
216
|
+
*/
|
|
217
|
+
error(message: string, options?: LogOptions): void;
|
|
218
|
+
/**
|
|
219
|
+
* Log an error object with optional prefix
|
|
220
|
+
*/
|
|
221
|
+
errorObject(prefix: string, error: unknown, options?: LogOptions): void;
|
|
222
|
+
/**
|
|
223
|
+
* Log an informational message
|
|
224
|
+
*/
|
|
225
|
+
info(message: string, options?: LogOptions): void;
|
|
226
|
+
/**
|
|
227
|
+
* Log a warning message
|
|
228
|
+
*/
|
|
229
|
+
warn(message: string, options?: LogOptions): void;
|
|
230
|
+
/**
|
|
231
|
+
* Log a success message
|
|
232
|
+
*/
|
|
233
|
+
success(message: string, options?: LogOptions): void;
|
|
234
|
+
/**
|
|
235
|
+
* Log a notice message
|
|
236
|
+
*/
|
|
237
|
+
notice(message: string, options?: LogOptions): void;
|
|
238
|
+
/**
|
|
239
|
+
* Log a debug message
|
|
240
|
+
*/
|
|
241
|
+
debug(message: string, options?: LogOptions): void;
|
|
242
|
+
/**
|
|
243
|
+
* Log a raw message without any formatting
|
|
244
|
+
*/
|
|
245
|
+
raw(message: string, options?: LogOptions): void;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
interface FileSinkOptions {
|
|
249
|
+
logDir: string;
|
|
250
|
+
basename: string;
|
|
251
|
+
maxSizeMB?: number;
|
|
252
|
+
jsonFormat?: boolean;
|
|
253
|
+
maxRetries?: number;
|
|
254
|
+
closeTimeoutMS?: number;
|
|
255
|
+
minLevel?: LogLevel;
|
|
256
|
+
onError?: (error: Error, entry: LogEntry, attempt: number, willRetry: boolean) => void;
|
|
257
|
+
}
|
|
258
|
+
interface FileSinkHealth {
|
|
259
|
+
isHealthy: boolean;
|
|
260
|
+
queueSize: number;
|
|
261
|
+
lastError?: Error;
|
|
262
|
+
consecutiveFailures: number;
|
|
263
|
+
isInitialized: boolean;
|
|
264
|
+
}
|
|
265
|
+
interface FlushResult {
|
|
266
|
+
success: boolean;
|
|
267
|
+
entriesWritten: number;
|
|
268
|
+
entriesFailed: number;
|
|
269
|
+
timedOut: boolean;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* FileSink writes logs to files with automatic rotation based on size and date
|
|
273
|
+
*/
|
|
274
|
+
declare class FileSink implements LogSink {
|
|
275
|
+
private logDir;
|
|
276
|
+
private basename;
|
|
277
|
+
private maxSizeMB;
|
|
278
|
+
private jsonFormat;
|
|
279
|
+
private maxRetries;
|
|
280
|
+
private minLevel;
|
|
281
|
+
private onError?;
|
|
282
|
+
private logFileStream?;
|
|
283
|
+
private currentLogFile?;
|
|
284
|
+
private currentLogSize;
|
|
285
|
+
private writeQueue;
|
|
286
|
+
private isInitialized;
|
|
287
|
+
private initPromise?;
|
|
288
|
+
private isProcessing;
|
|
289
|
+
private lastError?;
|
|
290
|
+
private consecutiveFailures;
|
|
291
|
+
private totalEntriesWritten;
|
|
292
|
+
private totalEntriesFailed;
|
|
293
|
+
private closing;
|
|
294
|
+
private closed;
|
|
295
|
+
private closeTimeoutMS;
|
|
296
|
+
constructor(options: FileSinkOptions);
|
|
297
|
+
write(entry: LogEntry): void;
|
|
298
|
+
/**
|
|
299
|
+
* Set the minimum log level for this sink
|
|
300
|
+
*/
|
|
301
|
+
setMinLevel(level: LogLevel): void;
|
|
302
|
+
/**
|
|
303
|
+
* Get the current minimum log level
|
|
304
|
+
*/
|
|
305
|
+
getMinLevel(): LogLevel;
|
|
306
|
+
/**
|
|
307
|
+
* Get current health status of the sink
|
|
308
|
+
*/
|
|
309
|
+
getHealth(): FileSinkHealth;
|
|
310
|
+
/**
|
|
311
|
+
* Flush all pending writes and wait for completion
|
|
312
|
+
* Returns statistics about the flush operation
|
|
313
|
+
* @param timeoutMS Maximum time to wait in milliseconds (default: 30000ms / 30s)
|
|
314
|
+
*/
|
|
315
|
+
flush(timeoutMS?: number): Promise<FlushResult>;
|
|
316
|
+
/**
|
|
317
|
+
* Close the log file and wait for all pending writes
|
|
318
|
+
*/
|
|
319
|
+
close(): Promise<void>;
|
|
320
|
+
/**
|
|
321
|
+
* Initialize the file sink asynchronously
|
|
322
|
+
*/
|
|
323
|
+
private initialize;
|
|
324
|
+
/**
|
|
325
|
+
* Process the write queue
|
|
326
|
+
* Processes entries one at a time with retry logic
|
|
327
|
+
*/
|
|
328
|
+
private processQueue;
|
|
329
|
+
/**
|
|
330
|
+
* Write a single entry to the file
|
|
331
|
+
* If stream is broken, it will be recreated on next attempt
|
|
332
|
+
*/
|
|
333
|
+
private writeEntry;
|
|
334
|
+
/**
|
|
335
|
+
* Format a log entry for file output
|
|
336
|
+
*/
|
|
337
|
+
private formatEntry;
|
|
338
|
+
/**
|
|
339
|
+
* Setup the log file
|
|
340
|
+
*/
|
|
341
|
+
private setupLogFile;
|
|
342
|
+
/**
|
|
343
|
+
* Destroy the current stream
|
|
344
|
+
*/
|
|
345
|
+
private destroyStream;
|
|
346
|
+
/**
|
|
347
|
+
* Rotate log file if needed based on size or date
|
|
348
|
+
*/
|
|
349
|
+
private rotateIfNeeded;
|
|
350
|
+
/**
|
|
351
|
+
* Rotate the current log file
|
|
352
|
+
* Queue processing pauses during rotation, then resumes
|
|
353
|
+
*/
|
|
354
|
+
private rotateFile;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Types of pipe errors that can occur
|
|
359
|
+
*/
|
|
360
|
+
declare enum PipeErrorType {
|
|
361
|
+
WRITE = "write",
|
|
362
|
+
CLOSE = "close",
|
|
363
|
+
NOT_FOUND = "not_found",
|
|
364
|
+
NOT_A_PIPE = "not_a_pipe",
|
|
365
|
+
PERMISSION = "permission",
|
|
366
|
+
UNSUPPORTED_PLATFORM = "unsupported_platform"
|
|
367
|
+
}
|
|
368
|
+
interface NamedPipeSinkOptions {
|
|
369
|
+
pipePath: string;
|
|
370
|
+
jsonFormat?: boolean;
|
|
371
|
+
closeTimeoutMS?: number;
|
|
372
|
+
onError?: (errorType: PipeErrorType, error: Error, pipePath: string) => void;
|
|
373
|
+
formatter?: (entry: LogEntry) => string;
|
|
374
|
+
}
|
|
375
|
+
type ReconnectStatus = {
|
|
376
|
+
success: true;
|
|
377
|
+
} | {
|
|
378
|
+
success: false;
|
|
379
|
+
reason: 'already_reconnecting';
|
|
380
|
+
} | {
|
|
381
|
+
success: false;
|
|
382
|
+
reason: 'error';
|
|
383
|
+
error: Error;
|
|
384
|
+
};
|
|
385
|
+
/**
|
|
386
|
+
* NamedPipeSink writes logs to a named pipe (FIFO)
|
|
387
|
+
* Only supported on Linux and macOS
|
|
388
|
+
*/
|
|
389
|
+
declare class NamedPipeSink implements LogSink {
|
|
390
|
+
private pipePath;
|
|
391
|
+
private jsonFormat;
|
|
392
|
+
private onError?;
|
|
393
|
+
private formatter?;
|
|
394
|
+
private pipeStream?;
|
|
395
|
+
private writeQueue;
|
|
396
|
+
private isInitialized;
|
|
397
|
+
private _isReconnecting;
|
|
398
|
+
private initPromise;
|
|
399
|
+
private closing;
|
|
400
|
+
private closed;
|
|
401
|
+
private closeTimeoutMS;
|
|
402
|
+
constructor(options: NamedPipeSinkOptions);
|
|
403
|
+
write(entry: LogEntry): void;
|
|
404
|
+
/**
|
|
405
|
+
* Attempt to reconnect to the named pipe.
|
|
406
|
+
* Useful when the pipe reader restarts or after a temporary error.
|
|
407
|
+
* Queued writes during the outage will be flushed on successful reconnection.
|
|
408
|
+
*/
|
|
409
|
+
get isReconnecting(): boolean;
|
|
410
|
+
reconnect(): Promise<ReconnectStatus>;
|
|
411
|
+
close(): Promise<void>;
|
|
412
|
+
/**
|
|
413
|
+
* Initialize the named pipe connection
|
|
414
|
+
*/
|
|
415
|
+
private initializePipe;
|
|
416
|
+
/**
|
|
417
|
+
* Process queued entries
|
|
418
|
+
*/
|
|
419
|
+
private processQueue;
|
|
420
|
+
/**
|
|
421
|
+
* Write a single entry
|
|
422
|
+
*/
|
|
423
|
+
private writeEntry;
|
|
424
|
+
/**
|
|
425
|
+
* Format a log entry for pipe output
|
|
426
|
+
*/
|
|
427
|
+
private formatEntry;
|
|
428
|
+
/**
|
|
429
|
+
* Handle errors
|
|
430
|
+
*/
|
|
431
|
+
private handleError;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Main Logger class with sink-based architecture and EventEmitter support
|
|
436
|
+
*/
|
|
437
|
+
declare class Logger extends EventEmitter {
|
|
438
|
+
readonly isLoggerClass = true;
|
|
439
|
+
private sinks;
|
|
440
|
+
private redactFunction?;
|
|
441
|
+
private callProcessExit;
|
|
442
|
+
private beforeExitCallback?;
|
|
443
|
+
private onSinkError?;
|
|
444
|
+
private _didExit;
|
|
445
|
+
private _exitCode;
|
|
446
|
+
private _exitRequested;
|
|
447
|
+
private _isPendingExit;
|
|
448
|
+
private _closed;
|
|
449
|
+
private _reportErrorListenerRegistered;
|
|
450
|
+
private _reportErrorListener;
|
|
451
|
+
constructor(options?: LoggerOptions);
|
|
452
|
+
get didExit(): boolean;
|
|
453
|
+
get exitCode(): number;
|
|
454
|
+
get isPendingExit(): boolean;
|
|
455
|
+
get hasExitedOrPending(): boolean;
|
|
456
|
+
get closed(): boolean;
|
|
457
|
+
/**
|
|
458
|
+
* Exit the process with the specified code
|
|
459
|
+
*/
|
|
460
|
+
exit(code: number): void;
|
|
461
|
+
/**
|
|
462
|
+
* Set or update the beforeExit callback
|
|
463
|
+
*
|
|
464
|
+
* This allows setting the callback after Logger construction, which is useful
|
|
465
|
+
* when the callback needs to reference objects that depend on the Logger instance.
|
|
466
|
+
*
|
|
467
|
+
* **Note:** This method overwrites any existing beforeExit callback (including
|
|
468
|
+
* one set in the Logger constructor). Pass `undefined` to remove the callback.
|
|
469
|
+
*
|
|
470
|
+
* **Error Handling:** If the callback throws an error or rejects, the logger will
|
|
471
|
+
* proceed with exit anyway to prevent the process from hanging. The error will be
|
|
472
|
+
* reported via the global `reportError` event.
|
|
473
|
+
*
|
|
474
|
+
* @param callback - Function to call before process exit (receives exitCode and isFirstExit).
|
|
475
|
+
* Must return BeforeExitResult indicating whether to proceed with exit or wait.
|
|
476
|
+
* Return `{ action: 'proceed' }` to continue with exit.
|
|
477
|
+
* Return `{ action: 'wait' }` to prevent exit (e.g., shutdown already in progress).
|
|
478
|
+
* If the callback throws, exit proceeds automatically.
|
|
479
|
+
*
|
|
480
|
+
* Pass undefined to remove the callback.
|
|
481
|
+
*
|
|
482
|
+
* @example
|
|
483
|
+
* ```typescript
|
|
484
|
+
* const logger = new Logger();
|
|
485
|
+
* const lifecycle = new LifecycleManager({ logger });
|
|
486
|
+
*
|
|
487
|
+
* // Set callback after both are constructed
|
|
488
|
+
* logger.setBeforeExitCallback(async (exitCode, isFirstExit) => {
|
|
489
|
+
* if (isFirstExit) {
|
|
490
|
+
* await lifecycle.stopAllComponents();
|
|
491
|
+
* }
|
|
492
|
+
* return { action: 'proceed' };
|
|
493
|
+
* });
|
|
494
|
+
*
|
|
495
|
+
* // Later, remove the callback
|
|
496
|
+
* logger.setBeforeExitCallback(undefined);
|
|
497
|
+
* ```
|
|
498
|
+
*/
|
|
499
|
+
setBeforeExitCallback(callback: ((exitCode: number, isFirstExit: boolean) => BeforeExitResult | Promise<BeforeExitResult>) | undefined): void;
|
|
500
|
+
/**
|
|
501
|
+
* Log an error message
|
|
502
|
+
*/
|
|
503
|
+
error(message: string, options?: LogOptions): void;
|
|
504
|
+
/**
|
|
505
|
+
* Log an error object with optional prefix
|
|
506
|
+
*/
|
|
507
|
+
errorObject(prefix: string, error: unknown, options?: LogOptions): void;
|
|
508
|
+
/**
|
|
509
|
+
* Log an informational message
|
|
510
|
+
*/
|
|
511
|
+
info(message: string, options?: LogOptions): void;
|
|
512
|
+
/**
|
|
513
|
+
* Log a warning message
|
|
514
|
+
*/
|
|
515
|
+
warn(message: string, options?: LogOptions): void;
|
|
516
|
+
/**
|
|
517
|
+
* Log a success message
|
|
518
|
+
*/
|
|
519
|
+
success(message: string, options?: LogOptions): void;
|
|
520
|
+
/**
|
|
521
|
+
* Log a notice message
|
|
522
|
+
*/
|
|
523
|
+
notice(message: string, options?: LogOptions): void;
|
|
524
|
+
/**
|
|
525
|
+
* Log a debug message
|
|
526
|
+
*/
|
|
527
|
+
debug(message: string, options?: LogOptions): void;
|
|
528
|
+
/**
|
|
529
|
+
* Log a raw message without any formatting
|
|
530
|
+
*/
|
|
531
|
+
raw(message: string, options?: LogOptions): void;
|
|
532
|
+
/**
|
|
533
|
+
* Create a scoped logger with a service name
|
|
534
|
+
*/
|
|
535
|
+
service(serviceName: string): LoggerService;
|
|
536
|
+
/**
|
|
537
|
+
* Registers a listener for the 'reportError' event.
|
|
538
|
+
*
|
|
539
|
+
* If the listener is already registered, it returns 'already_registered'.
|
|
540
|
+
* If 'globalThis.reportError' is not available, it returns 'not_available'.
|
|
541
|
+
* Otherwise, it registers the listener and returns 'success'.
|
|
542
|
+
*
|
|
543
|
+
* @param prefix - The prefix to use when logging the error object. Default is 'Uncaught exception'.
|
|
544
|
+
* @returns 'success' if the listener is registered successfully,
|
|
545
|
+
* 'already_registered' if the listener is already registered,
|
|
546
|
+
* 'not_available' if 'globalThis.reportError' is not available.
|
|
547
|
+
*/
|
|
548
|
+
registerReportErrorListener(prefix?: string): 'success' | 'already_registered' | 'not_available';
|
|
549
|
+
/**
|
|
550
|
+
* Unregister the listener for the 'reportError' event.
|
|
551
|
+
*
|
|
552
|
+
* If the listener is not registered, it returns 'not_registered'.
|
|
553
|
+
* Otherwise, it unregister the listener and returns 'success'.
|
|
554
|
+
*
|
|
555
|
+
* @returns 'success' if the listener is unregistered successfully,
|
|
556
|
+
* 'not_registered' if the listener is not registered.
|
|
557
|
+
*/
|
|
558
|
+
unregisterReportErrorListener(): 'success' | 'not_registered';
|
|
559
|
+
/**
|
|
560
|
+
* Check if the 'reportError' event listener is registered
|
|
561
|
+
*
|
|
562
|
+
* @returns 'true' if the listener is registered, 'false' otherwise.
|
|
563
|
+
*/
|
|
564
|
+
isReportErrorListenerRegistered(): boolean;
|
|
565
|
+
/**
|
|
566
|
+
* Check if 'globalThis.reportError' is available
|
|
567
|
+
*
|
|
568
|
+
* @returns 'true' if 'globalThis.reportError' is available, 'false' otherwise.
|
|
569
|
+
*/
|
|
570
|
+
isReportErrorAvailable(): boolean;
|
|
571
|
+
/**
|
|
572
|
+
* Add a sink to the logger
|
|
573
|
+
*/
|
|
574
|
+
addSink(sink: LogSink): void;
|
|
575
|
+
/**
|
|
576
|
+
* Remove a sink from the logger
|
|
577
|
+
* Returns true if the sink was found and removed, false otherwise
|
|
578
|
+
*/
|
|
579
|
+
removeSink(sink: LogSink): boolean;
|
|
580
|
+
/**
|
|
581
|
+
* Get a readonly copy of the current sinks
|
|
582
|
+
*/
|
|
583
|
+
getSinks(): readonly LogSink[];
|
|
584
|
+
/**
|
|
585
|
+
* Close all sinks and cleanup resources
|
|
586
|
+
* After closing, the logger is marked as closed and all sinks are removed
|
|
587
|
+
*/
|
|
588
|
+
close(): Promise<void>;
|
|
589
|
+
/**
|
|
590
|
+
* Create a logger optimized for testing.
|
|
591
|
+
* Includes an ArraySink by default for easy log inspection.
|
|
592
|
+
* Process exit is disabled to prevent tests from terminating.
|
|
593
|
+
*/
|
|
594
|
+
static createTestOptimizedLogger(options?: {
|
|
595
|
+
sinks?: LogSink[];
|
|
596
|
+
arrayLogTransformer?: (entry: LogEntry) => LogEntry | false;
|
|
597
|
+
includeConsoleSink?: boolean;
|
|
598
|
+
muteConsole?: boolean;
|
|
599
|
+
}): {
|
|
600
|
+
logger: Logger;
|
|
601
|
+
arraySink: ArraySink;
|
|
602
|
+
consoleSink?: ConsoleSink;
|
|
603
|
+
};
|
|
604
|
+
/**
|
|
605
|
+
* Create a logger optimized for frontend/browser use.
|
|
606
|
+
* Includes a ConsoleSink by default for browser devtools output.
|
|
607
|
+
* Process exit is disabled since browsers don't have process.exit.
|
|
608
|
+
*/
|
|
609
|
+
static createFrontendOptimizedLogger(options?: {
|
|
610
|
+
sinks?: LogSink[];
|
|
611
|
+
muteConsole?: boolean;
|
|
612
|
+
}): {
|
|
613
|
+
logger: Logger;
|
|
614
|
+
consoleSink: ConsoleSink;
|
|
615
|
+
};
|
|
616
|
+
/**
|
|
617
|
+
* Internal method to handle all log operations
|
|
618
|
+
*/
|
|
619
|
+
protected handleLog(type: LogType, template: string, options?: HandleLogOptions): void;
|
|
620
|
+
/**
|
|
621
|
+
* Handle sink errors by calling the onSinkError callback or falling back to console.error
|
|
622
|
+
*/
|
|
623
|
+
private handleSinkError;
|
|
624
|
+
/**
|
|
625
|
+
* Process the exit
|
|
626
|
+
*/
|
|
627
|
+
private processExit;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
export { type ArrayLogTransformer, ArraySink, type BeforeExitResult, ConsoleSink, type ConsoleSinkOptions, FileSink, type FileSinkOptions, type LogEntry, LogLevel, type LogOptions, type LogSink, type LogType, Logger, type LoggerEvent, type LoggerEventMap, type LoggerOptions, LoggerService, NamedPipeSink, type NamedPipeSinkOptions, PipeErrorType, type ReconnectStatus, type RedactFunction, getLogLevel };
|