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.
Files changed (177) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +125 -0
  3. package/dist/index.cjs +7 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +2 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +5 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/arrays.cjs +95 -0
  10. package/dist/lib/arrays.cjs.map +1 -0
  11. package/dist/lib/arrays.d.cts +15 -0
  12. package/dist/lib/arrays.d.ts +15 -0
  13. package/dist/lib/arrays.js +63 -0
  14. package/dist/lib/arrays.js.map +1 -0
  15. package/dist/lib/ascii-tables/index.cjs +642 -0
  16. package/dist/lib/ascii-tables/index.cjs.map +1 -0
  17. package/dist/lib/ascii-tables/index.d.cts +66 -0
  18. package/dist/lib/ascii-tables/index.d.ts +66 -0
  19. package/dist/lib/ascii-tables/index.js +603 -0
  20. package/dist/lib/ascii-tables/index.js.map +1 -0
  21. package/dist/lib/clamp.cjs +41 -0
  22. package/dist/lib/clamp.cjs.map +1 -0
  23. package/dist/lib/clamp.d.cts +26 -0
  24. package/dist/lib/clamp.d.ts +26 -0
  25. package/dist/lib/clamp.js +15 -0
  26. package/dist/lib/clamp.js.map +1 -0
  27. package/dist/lib/constants.cjs +73 -0
  28. package/dist/lib/constants.cjs.map +1 -0
  29. package/dist/lib/constants.d.cts +17 -0
  30. package/dist/lib/constants.d.ts +17 -0
  31. package/dist/lib/constants.js +34 -0
  32. package/dist/lib/constants.js.map +1 -0
  33. package/dist/lib/curly-brackets.cjs +77 -0
  34. package/dist/lib/curly-brackets.cjs.map +1 -0
  35. package/dist/lib/curly-brackets.d.cts +17 -0
  36. package/dist/lib/curly-brackets.d.ts +17 -0
  37. package/dist/lib/curly-brackets.js +52 -0
  38. package/dist/lib/curly-brackets.js.map +1 -0
  39. package/dist/lib/deep-clone.cjs +87 -0
  40. package/dist/lib/deep-clone.cjs.map +1 -0
  41. package/dist/lib/deep-clone.d.cts +19 -0
  42. package/dist/lib/deep-clone.d.ts +19 -0
  43. package/dist/lib/deep-clone.js +62 -0
  44. package/dist/lib/deep-clone.js.map +1 -0
  45. package/dist/lib/error-to-string.cjs +743 -0
  46. package/dist/lib/error-to-string.cjs.map +1 -0
  47. package/dist/lib/error-to-string.d.cts +3 -0
  48. package/dist/lib/error-to-string.d.ts +3 -0
  49. package/dist/lib/error-to-string.js +706 -0
  50. package/dist/lib/error-to-string.js.map +1 -0
  51. package/dist/lib/event-emitter.cjs +899 -0
  52. package/dist/lib/event-emitter.cjs.map +1 -0
  53. package/dist/lib/event-emitter.d.cts +78 -0
  54. package/dist/lib/event-emitter.d.ts +78 -0
  55. package/dist/lib/event-emitter.js +861 -0
  56. package/dist/lib/event-emitter.js.map +1 -0
  57. package/dist/lib/id-helpers.cjs +205 -0
  58. package/dist/lib/id-helpers.cjs.map +1 -0
  59. package/dist/lib/id-helpers.d.cts +198 -0
  60. package/dist/lib/id-helpers.d.ts +198 -0
  61. package/dist/lib/id-helpers.js +170 -0
  62. package/dist/lib/id-helpers.js.map +1 -0
  63. package/dist/lib/is-boolean.cjs +33 -0
  64. package/dist/lib/is-boolean.cjs.map +1 -0
  65. package/dist/lib/is-boolean.d.cts +19 -0
  66. package/dist/lib/is-boolean.d.ts +19 -0
  67. package/dist/lib/is-boolean.js +8 -0
  68. package/dist/lib/is-boolean.js.map +1 -0
  69. package/dist/lib/is-function.cjs +33 -0
  70. package/dist/lib/is-function.cjs.map +1 -0
  71. package/dist/lib/is-function.d.cts +3 -0
  72. package/dist/lib/is-function.d.ts +3 -0
  73. package/dist/lib/is-function.js +8 -0
  74. package/dist/lib/is-function.js.map +1 -0
  75. package/dist/lib/is-number.cjs +38 -0
  76. package/dist/lib/is-number.cjs.map +1 -0
  77. package/dist/lib/is-number.d.cts +38 -0
  78. package/dist/lib/is-number.d.ts +38 -0
  79. package/dist/lib/is-number.js +12 -0
  80. package/dist/lib/is-number.js.map +1 -0
  81. package/dist/lib/is-plain-object.cjs +33 -0
  82. package/dist/lib/is-plain-object.cjs.map +1 -0
  83. package/dist/lib/is-plain-object.d.cts +20 -0
  84. package/dist/lib/is-plain-object.d.ts +20 -0
  85. package/dist/lib/is-plain-object.js +8 -0
  86. package/dist/lib/is-plain-object.js.map +1 -0
  87. package/dist/lib/is-promise.cjs +34 -0
  88. package/dist/lib/is-promise.cjs.map +1 -0
  89. package/dist/lib/is-promise.d.cts +3 -0
  90. package/dist/lib/is-promise.d.ts +3 -0
  91. package/dist/lib/is-promise.js +9 -0
  92. package/dist/lib/is-promise.js.map +1 -0
  93. package/dist/lib/json-helpers.cjs +49 -0
  94. package/dist/lib/json-helpers.cjs.map +1 -0
  95. package/dist/lib/json-helpers.d.cts +10 -0
  96. package/dist/lib/json-helpers.d.ts +10 -0
  97. package/dist/lib/json-helpers.js +22 -0
  98. package/dist/lib/json-helpers.js.map +1 -0
  99. package/dist/lib/lifecycle-manager/index.cjs +5594 -0
  100. package/dist/lib/lifecycle-manager/index.cjs.map +1 -0
  101. package/dist/lib/lifecycle-manager/index.d.cts +2044 -0
  102. package/dist/lib/lifecycle-manager/index.d.ts +2044 -0
  103. package/dist/lib/lifecycle-manager/index.js +5543 -0
  104. package/dist/lib/lifecycle-manager/index.js.map +1 -0
  105. package/dist/lib/logger/index.cjs +2514 -0
  106. package/dist/lib/logger/index.cjs.map +1 -0
  107. package/dist/lib/logger/index.d.cts +630 -0
  108. package/dist/lib/logger/index.d.ts +630 -0
  109. package/dist/lib/logger/index.js +2470 -0
  110. package/dist/lib/logger/index.js.map +1 -0
  111. package/dist/lib/padding-utils.cjs +77 -0
  112. package/dist/lib/padding-utils.cjs.map +1 -0
  113. package/dist/lib/padding-utils.d.cts +44 -0
  114. package/dist/lib/padding-utils.d.ts +44 -0
  115. package/dist/lib/padding-utils.js +46 -0
  116. package/dist/lib/padding-utils.js.map +1 -0
  117. package/dist/lib/process-signal-manager.cjs +1306 -0
  118. package/dist/lib/process-signal-manager.cjs.map +1 -0
  119. package/dist/lib/process-signal-manager.d.cts +305 -0
  120. package/dist/lib/process-signal-manager.d.ts +305 -0
  121. package/dist/lib/process-signal-manager.js +1269 -0
  122. package/dist/lib/process-signal-manager.js.map +1 -0
  123. package/dist/lib/promise-protected-resolver.cjs +828 -0
  124. package/dist/lib/promise-protected-resolver.cjs.map +1 -0
  125. package/dist/lib/promise-protected-resolver.d.cts +17 -0
  126. package/dist/lib/promise-protected-resolver.d.ts +17 -0
  127. package/dist/lib/promise-protected-resolver.js +791 -0
  128. package/dist/lib/promise-protected-resolver.js.map +1 -0
  129. package/dist/lib/retry-utils/index.cjs +2183 -0
  130. package/dist/lib/retry-utils/index.cjs.map +1 -0
  131. package/dist/lib/retry-utils/index.d.cts +321 -0
  132. package/dist/lib/retry-utils/index.d.ts +321 -0
  133. package/dist/lib/retry-utils/index.js +2133 -0
  134. package/dist/lib/retry-utils/index.js.map +1 -0
  135. package/dist/lib/safe-handle-callback.cjs +818 -0
  136. package/dist/lib/safe-handle-callback.cjs.map +1 -0
  137. package/dist/lib/safe-handle-callback.d.cts +43 -0
  138. package/dist/lib/safe-handle-callback.d.ts +43 -0
  139. package/dist/lib/safe-handle-callback.js +780 -0
  140. package/dist/lib/safe-handle-callback.js.map +1 -0
  141. package/dist/lib/serialize-error/index.cjs +93 -0
  142. package/dist/lib/serialize-error/index.cjs.map +1 -0
  143. package/dist/lib/serialize-error/index.d.cts +26 -0
  144. package/dist/lib/serialize-error/index.d.ts +26 -0
  145. package/dist/lib/serialize-error/index.js +64 -0
  146. package/dist/lib/serialize-error/index.js.map +1 -0
  147. package/dist/lib/single-event-observer.cjs +841 -0
  148. package/dist/lib/single-event-observer.cjs.map +1 -0
  149. package/dist/lib/single-event-observer.d.cts +54 -0
  150. package/dist/lib/single-event-observer.d.ts +54 -0
  151. package/dist/lib/single-event-observer.js +803 -0
  152. package/dist/lib/single-event-observer.js.map +1 -0
  153. package/dist/lib/sleep.cjs +37 -0
  154. package/dist/lib/sleep.cjs.map +1 -0
  155. package/dist/lib/sleep.d.cts +11 -0
  156. package/dist/lib/sleep.d.ts +11 -0
  157. package/dist/lib/sleep.js +12 -0
  158. package/dist/lib/sleep.js.map +1 -0
  159. package/dist/lib/strings.cjs +186 -0
  160. package/dist/lib/strings.cjs.map +1 -0
  161. package/dist/lib/strings.d.cts +107 -0
  162. package/dist/lib/strings.d.ts +107 -0
  163. package/dist/lib/strings.js +149 -0
  164. package/dist/lib/strings.js.map +1 -0
  165. package/dist/lib/tmp-dir.cjs +254 -0
  166. package/dist/lib/tmp-dir.cjs.map +1 -0
  167. package/dist/lib/tmp-dir.d.cts +63 -0
  168. package/dist/lib/tmp-dir.d.ts +63 -0
  169. package/dist/lib/tmp-dir.js +211 -0
  170. package/dist/lib/tmp-dir.js.map +1 -0
  171. package/dist/lib/unix-time-helpers.cjs +53 -0
  172. package/dist/lib/unix-time-helpers.cjs.map +1 -0
  173. package/dist/lib/unix-time-helpers.d.cts +56 -0
  174. package/dist/lib/unix-time-helpers.d.ts +56 -0
  175. package/dist/lib/unix-time-helpers.js +24 -0
  176. package/dist/lib/unix-time-helpers.js.map +1 -0
  177. package/package.json +220 -0
@@ -0,0 +1,630 @@
1
+ import { EventEmitter } from '../event-emitter.cjs';
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 };