node-logy 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/logger.js ADDED
@@ -0,0 +1,656 @@
1
+ import fs from "node:fs";
2
+ import path, { dirname } from "node:path";
3
+ import { LOG_LEVEL, METHOD, } from "./protocol.js";
4
+ import { Worker } from "node:worker_threads";
5
+ import { fileURLToPath } from "node:url";
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ // ANSI color codes
9
+ const Colors = {
10
+ reset: "\x1b[0m",
11
+ bright: "\x1b[1m",
12
+ dim: "\x1b[2m",
13
+ red: "\x1b[31m",
14
+ green: "\x1b[32m",
15
+ yellow: "\x1b[33m",
16
+ blue: "\x1b[34m",
17
+ magenta: "\x1b[35m",
18
+ cyan: "\x1b[36m",
19
+ white: "\x1b[37m",
20
+ gray: "\x1b[90m",
21
+ };
22
+ const defaultLoggerOptions = {
23
+ basePath: "./logs",
24
+ outputToConsole: true,
25
+ saveToLogFiles: false,
26
+ useColoredOutput: true,
27
+ colorMap: {
28
+ [LOG_LEVEL.INFO]: Colors.cyan,
29
+ [LOG_LEVEL.WARN]: Colors.yellow,
30
+ [LOG_LEVEL.ERROR]: Colors.red,
31
+ [LOG_LEVEL.DEBUG]: Colors.gray,
32
+ [LOG_LEVEL.FATAL]: Colors.magenta,
33
+ },
34
+ showTimestamps: true,
35
+ timestampType: "iso",
36
+ showLogLevel: true,
37
+ logLevelMap: {
38
+ [LOG_LEVEL.INFO]: "INFO",
39
+ [LOG_LEVEL.WARN]: "WARN",
40
+ [LOG_LEVEL.ERROR]: "ERROR",
41
+ [LOG_LEVEL.DEBUG]: "DEBUG",
42
+ [LOG_LEVEL.FATAL]: "FATAL",
43
+ },
44
+ };
45
+ /**
46
+ * Custom error for logger initialization failures
47
+ */
48
+ export class LoggerInitializationError extends Error {
49
+ constructor(message) {
50
+ super(message);
51
+ this.name = "LoggerInitializationError";
52
+ }
53
+ }
54
+ /**
55
+ * Used to log to console and also the log files
56
+ */
57
+ export class Logger {
58
+ /**
59
+ * Local reference to options passed
60
+ */
61
+ _options;
62
+ /**
63
+ * Holds the worker thread
64
+ */
65
+ _worker = null;
66
+ /**
67
+ * A request's id
68
+ */
69
+ _id = 1;
70
+ /**
71
+ * Gets the next ID; if it exceeds 1 million then rolls back to zero
72
+ */
73
+ _getNextId = () => {
74
+ if (this._id > 1000000) {
75
+ this._id = 1;
76
+ }
77
+ return this._id++;
78
+ };
79
+ /**
80
+ * Holds batch of LOG requests only (fire-and-forget)
81
+ */
82
+ _logBatch = [];
83
+ /**
84
+ * How long it will wait until it flushes / sends the logs to the worker
85
+ */
86
+ _logRequestFlushMs = 100;
87
+ /**
88
+ * Holds the timeout for log batch flushing
89
+ */
90
+ _logBatchTimeout = null;
91
+ /**
92
+ * How large we want the batch array to get before we send it
93
+ */
94
+ _logBatchMaxSize = 250;
95
+ /**
96
+ * Holds pending requests that expect a response (FLUSH, RELOAD, SHUTDOWN)
97
+ */
98
+ _pending = new Map();
99
+ constructor(options = {}) {
100
+ const mergedColorMap = {
101
+ ...defaultLoggerOptions.colorMap,
102
+ ...options.colorMap,
103
+ };
104
+ const mergedLogLevelMap = {
105
+ ...defaultLoggerOptions.logLevelMap,
106
+ ...options.logLevelMap,
107
+ };
108
+ this._options = {
109
+ ...defaultLoggerOptions,
110
+ ...options,
111
+ colorMap: mergedColorMap,
112
+ logLevelMap: mergedLogLevelMap,
113
+ };
114
+ this._validateBasePath();
115
+ this._initializeDirectory();
116
+ this._initWorker();
117
+ }
118
+ /**
119
+ * Get the path to the worker
120
+ * @returns Path to the worker
121
+ */
122
+ _getWorkerPath() {
123
+ return path.join(__dirname, "worker.js");
124
+ }
125
+ /**
126
+ * Inits the worker thread
127
+ */
128
+ _initWorker() {
129
+ if (!this._options.saveToLogFiles)
130
+ return;
131
+ try {
132
+ const workerPath = this._getWorkerPath();
133
+ if (!fs.existsSync(workerPath)) {
134
+ throw new Error("Worker file not found");
135
+ }
136
+ this._worker = new Worker(workerPath);
137
+ this._worker.on("message", (response) => {
138
+ this._handleResponse(response);
139
+ });
140
+ this._worker.stderr.on("data", (chunk) => {
141
+ process.stderr.write(`Sidecar error: ${chunk.toString()}`);
142
+ });
143
+ this._worker.on("error", (err) => {
144
+ this._clearPending();
145
+ process.stderr.write(`Sidecar error: ${this._stringify(err)}`);
146
+ });
147
+ this._worker.on("exit", () => {
148
+ this._clearPending();
149
+ this._worker = null;
150
+ });
151
+ }
152
+ catch (error) {
153
+ process.stderr.write(`Failed to spawn sidecar: ${this._stringify(error)}`);
154
+ }
155
+ }
156
+ /**
157
+ * Flush the current log batch to worker immediately
158
+ */
159
+ _flushLogBatch() {
160
+ if (!this._worker || this._logBatch.length === 0) {
161
+ return;
162
+ }
163
+ this._worker.postMessage(this._logBatch);
164
+ this._logBatch = [];
165
+ this._stopLogBatchTimer();
166
+ }
167
+ /**
168
+ * Starts the timer to flush log batch after delay
169
+ */
170
+ _startLogBatchTimer() {
171
+ if (this._logBatchTimeout)
172
+ return;
173
+ this._logBatchTimeout = setTimeout(() => {
174
+ this._flushLogBatch();
175
+ }, this._logRequestFlushMs);
176
+ }
177
+ /**
178
+ * Stops the log batch flush timer
179
+ */
180
+ _stopLogBatchTimer() {
181
+ if (this._logBatchTimeout) {
182
+ clearTimeout(this._logBatchTimeout);
183
+ this._logBatchTimeout = null;
184
+ }
185
+ }
186
+ /**
187
+ * Adds a LOG request to the batch (fire-and-forget)
188
+ */
189
+ _addToLogBatch(request) {
190
+ this._logBatch.push(request);
191
+ if (this._logBatch.length >= this._logBatchMaxSize) {
192
+ this._flushLogBatch();
193
+ }
194
+ else {
195
+ this._startLogBatchTimer();
196
+ }
197
+ }
198
+ /**
199
+ * Clears pending requests on process exit/error
200
+ */
201
+ _clearPending() {
202
+ const error = new Error("Sidecar process terminated");
203
+ for (const [_, { reject }] of this._pending) {
204
+ reject(error);
205
+ }
206
+ this._pending.clear();
207
+ }
208
+ /**
209
+ * Handle a decoded response from worker
210
+ */
211
+ _handleResponse(response) {
212
+ this._resolvePending(response);
213
+ if (!response.success) {
214
+ process.stderr.write(`Log operation failed: id=${response.id}, method=${response.method}, level=${response.level}\n`);
215
+ }
216
+ }
217
+ /**
218
+ * Resolve any pending requests that expected a response
219
+ */
220
+ _resolvePending(response) {
221
+ const pending = this._pending.get(response.id);
222
+ if (!pending)
223
+ return;
224
+ if (response.success) {
225
+ pending.resolve();
226
+ }
227
+ else {
228
+ pending.reject(new Error("Request failed"));
229
+ }
230
+ this._pending.delete(response.id);
231
+ }
232
+ /**
233
+ * Send a request that expects a response (FLUSH, RELOAD, SHUTDOWN)
234
+ * These are sent immediately, not batched
235
+ */
236
+ _sendControlRequest(request) {
237
+ const id = request.id;
238
+ if (!id)
239
+ throw new Error("Request must contain and ID");
240
+ return new Promise((resolve, reject) => {
241
+ const timeout = setTimeout(() => {
242
+ if (this._pending.has(id)) {
243
+ this._pending
244
+ .get(id)
245
+ ?.reject(new Error(`Request timed out: ${this._stringify(request)}`));
246
+ this._pending.delete(id);
247
+ }
248
+ }, 4000);
249
+ this._pending.set(id, {
250
+ reject: (reason) => {
251
+ clearTimeout(timeout);
252
+ reject(reason);
253
+ },
254
+ resolve: (value) => {
255
+ clearTimeout(timeout);
256
+ resolve(value);
257
+ },
258
+ });
259
+ this._worker?.postMessage([request]);
260
+ });
261
+ }
262
+ /**
263
+ * Validates the basePath option
264
+ */
265
+ _validateBasePath() {
266
+ const { basePath } = this._options;
267
+ if (basePath === undefined || basePath === null) {
268
+ throw new LoggerInitializationError("basePath is required and cannot be null or undefined");
269
+ }
270
+ if (typeof basePath !== "string") {
271
+ throw new LoggerInitializationError(`basePath must be a string, received ${typeof basePath}`);
272
+ }
273
+ if (basePath.trim().length === 0) {
274
+ throw new LoggerInitializationError("basePath cannot be an empty string");
275
+ }
276
+ this._options.basePath = path.resolve(basePath);
277
+ }
278
+ /**
279
+ * Creates the log directory if file logging is enabled
280
+ */
281
+ _initializeDirectory() {
282
+ if (!this._options.saveToLogFiles) {
283
+ return;
284
+ }
285
+ try {
286
+ fs.mkdirSync(this._options.basePath, { recursive: true });
287
+ }
288
+ catch (error) {
289
+ const nodeError = error;
290
+ throw new LoggerInitializationError(`Failed to create log directory at "${this._options.basePath}": ${nodeError.message}`);
291
+ }
292
+ this._verifyWritable();
293
+ }
294
+ /**
295
+ * Extract call site information (file:line:column) from stack trace
296
+ */
297
+ _getCallSite() {
298
+ const originalPrepareStackTrace = Error.prepareStackTrace;
299
+ try {
300
+ Error.prepareStackTrace = (_, stack) => stack;
301
+ const err = new Error();
302
+ const stack = err.stack;
303
+ const customFrameIndex = this._options.callSiteOptions?.frameIndex;
304
+ const thisFileName = path.basename(__filename);
305
+ let frameIndex;
306
+ if (customFrameIndex !== undefined && customFrameIndex >= 0) {
307
+ // User wants specific control:
308
+ // 0 = who called info/warn/etc (skip _getCallSite, _formatMessage, log, info/warn/etc)
309
+ // Need to skip 4 frames: _getCallSite, _formatMessage, log, wrapper (info/warn/etc)
310
+ frameIndex = customFrameIndex + 4;
311
+ }
312
+ else {
313
+ // Auto-detect: skip all logger internals
314
+ frameIndex = 1; // Start after _getCallSite itself
315
+ while (frameIndex < stack.length) {
316
+ const frame = stack[frameIndex];
317
+ const frameFileName = frame?.getFileName();
318
+ if (!frameFileName) {
319
+ frameIndex++;
320
+ continue;
321
+ }
322
+ const isLoggerFile = frameFileName === __filename ||
323
+ path.basename(frameFileName) === thisFileName;
324
+ if (!isLoggerFile) {
325
+ break;
326
+ }
327
+ frameIndex++;
328
+ }
329
+ }
330
+ // Safety check
331
+ if (frameIndex >= stack.length) {
332
+ return "unknown";
333
+ }
334
+ const frame = stack[frameIndex];
335
+ if (!frame)
336
+ return "unknown";
337
+ const fileName = frame.getFileName() || "unknown";
338
+ const lineNumber = frame.getLineNumber() || 0;
339
+ const columnNumber = frame.getColumnNumber() || 0;
340
+ const useFullPath = this._options.callSiteOptions?.fullFilePath ?? false;
341
+ const displayFileName = useFullPath ? fileName : path.basename(fileName);
342
+ return `${displayFileName}:${lineNumber}:${columnNumber}`;
343
+ }
344
+ catch {
345
+ return "unknown";
346
+ }
347
+ finally {
348
+ Error.prepareStackTrace = originalPrepareStackTrace;
349
+ }
350
+ }
351
+ /**
352
+ * Verifies the log directory is writable
353
+ */
354
+ _verifyWritable() {
355
+ try {
356
+ const testFile = path.join(this._options.basePath, ".write-test");
357
+ fs.writeFileSync(testFile, "", { flag: "wx" });
358
+ fs.unlinkSync(testFile);
359
+ }
360
+ catch (error) {
361
+ const nodeError = error;
362
+ throw new LoggerInitializationError(`Log directory "${this._options.basePath}" is not writable: ${nodeError.message}`);
363
+ }
364
+ }
365
+ /**
366
+ * Get the string representation of a log level
367
+ */
368
+ _getLevelString(level) {
369
+ return this._options.logLevelMap[level] ?? "UNKNOWN";
370
+ }
371
+ /**
372
+ * Format timestamp based on the configured timestampType
373
+ */
374
+ _formatTimestamp(date) {
375
+ const { timestampType } = this._options;
376
+ switch (timestampType) {
377
+ case "iso":
378
+ return date.toISOString();
379
+ case "locale":
380
+ return date.toLocaleString();
381
+ case "utc":
382
+ return date.toUTCString();
383
+ case "unix":
384
+ return Math.floor(date.getTime() / 1000).toString();
385
+ case "unix_ms":
386
+ return date.getTime().toString();
387
+ case "date":
388
+ return date.toISOString().split("T")[0];
389
+ case "time":
390
+ return date.toTimeString().split(" ")[0];
391
+ case "datetime":
392
+ return date.toISOString().replace("T", " ").replace("Z", "");
393
+ case "short":
394
+ const d = date;
395
+ const day = d.getDate().toString().padStart(2, "0");
396
+ const month = (d.getMonth() + 1).toString().padStart(2, "0");
397
+ const year = d.getFullYear();
398
+ const hours = d.getHours().toString().padStart(2, "0");
399
+ const minutes = d.getMinutes().toString().padStart(2, "0");
400
+ return `${day}/${month}/${year} ${hours}:${minutes}`;
401
+ default:
402
+ return date.toISOString();
403
+ }
404
+ }
405
+ /**
406
+ * Convert any value to string representation
407
+ */
408
+ _stringify(value) {
409
+ const valueType = typeof value;
410
+ if (value === null)
411
+ return "null";
412
+ if (value === undefined)
413
+ return "undefined";
414
+ if (valueType === "string")
415
+ return value;
416
+ if (valueType === "number")
417
+ return String(value);
418
+ if (valueType === "boolean")
419
+ return String(value);
420
+ if (valueType === "bigint")
421
+ return `${value}n`;
422
+ if (valueType === "symbol")
423
+ return value.toString();
424
+ if (valueType === "function")
425
+ return `[Function: ${value.name || "anonymous"}]`;
426
+ // Check if value is an Error instance (must be object, so check after primitives)
427
+ if (value instanceof Error) {
428
+ const errorParts = [
429
+ `name: ${value.name}`,
430
+ `message: ${value.message}`,
431
+ ];
432
+ if (value.stack)
433
+ errorParts.push(`stack: ${value.stack}`);
434
+ if ("code" in value && value.code !== undefined)
435
+ errorParts.push(`code: ${value.code}`);
436
+ if ("errno" in value && value.errno !== undefined)
437
+ errorParts.push(`errno: ${value.errno}`);
438
+ if ("syscall" in value && value.syscall !== undefined)
439
+ errorParts.push(`syscall: ${value.syscall}`);
440
+ if ("path" in value && value.path !== undefined)
441
+ errorParts.push(`path: ${value.path}`);
442
+ // Capture custom properties
443
+ const standardProps = new Set([
444
+ "name",
445
+ "message",
446
+ "stack",
447
+ "code",
448
+ "errno",
449
+ "syscall",
450
+ "path",
451
+ ]);
452
+ for (const prop of Object.getOwnPropertyNames(value)) {
453
+ if (standardProps.has(prop))
454
+ continue;
455
+ try {
456
+ const propValue = value[prop];
457
+ errorParts.push(`${prop}: ${typeof propValue === "object" && propValue !== null ? "[object]" : propValue}`);
458
+ }
459
+ catch {
460
+ errorParts.push(`${prop}: [unreadable]`);
461
+ }
462
+ }
463
+ return `Error { ${errorParts.join(", ")} }`;
464
+ }
465
+ if (valueType === "object") {
466
+ const keys = Object.keys(value);
467
+ if (keys.length === 0)
468
+ return "{}";
469
+ const entries = keys.map((key) => {
470
+ try {
471
+ const val = value[key];
472
+ // Show type for nested objects/arrays, value for primitives
473
+ const display = val === null
474
+ ? "null"
475
+ : Array.isArray(val)
476
+ ? "[Array]"
477
+ : typeof val === "object"
478
+ ? "[Object]"
479
+ : typeof val === "function"
480
+ ? "[Function]"
481
+ : typeof val === "symbol"
482
+ ? "[Symbol]"
483
+ : String(val);
484
+ return `${key}: ${display}`;
485
+ }
486
+ catch {
487
+ return `${key}: [unreadable]`;
488
+ }
489
+ });
490
+ return `{ ${entries.join(", ")} }`;
491
+ }
492
+ // Fallback (shouldn't reach here with standard JS types)
493
+ return String(value);
494
+ }
495
+ /**
496
+ * Format a log message with optional fields
497
+ */
498
+ _formatMessage(level, message, additionalMessages) {
499
+ const parts = [];
500
+ // Add call site if enabled
501
+ if (this._options.showCallSite) {
502
+ const callSite = this._getCallSite();
503
+ parts.push(`[${callSite}]`);
504
+ }
505
+ // Add timestamp if enabled
506
+ if (this._options.showTimestamps) {
507
+ const timestamp = this._formatTimestamp(new Date());
508
+ parts.push(`[${timestamp}]`);
509
+ }
510
+ // Add log level if enabled
511
+ if (this._options.showLogLevel) {
512
+ const levelStr = this._getLevelString(level);
513
+ parts.push(`[${levelStr}]`);
514
+ }
515
+ // Add user prefixes
516
+ const addPrefixes = this._options.additionalPrefixes;
517
+ if (addPrefixes) {
518
+ for (let i = 0; i < addPrefixes.length; i++) {
519
+ parts.push(addPrefixes[i]);
520
+ }
521
+ }
522
+ // Build the message content
523
+ const mainMessage = this._stringify(message);
524
+ const additionalStr = additionalMessages
525
+ .map((msg) => this._stringify(msg))
526
+ .join(" ");
527
+ const fullMessage = additionalStr
528
+ ? `${mainMessage} ${additionalStr}`
529
+ : mainMessage;
530
+ // Combine parts with message
531
+ if (parts.length > 0) {
532
+ return `${parts.join(" ")}: ${fullMessage}`;
533
+ }
534
+ else {
535
+ return fullMessage;
536
+ }
537
+ }
538
+ /**
539
+ * Apply color to the entire message if colored output is enabled
540
+ */
541
+ _colorize(level, message) {
542
+ if (!this._options.useColoredOutput) {
543
+ return message;
544
+ }
545
+ const color = this._options.colorMap[level] || Colors.reset;
546
+ return `${color}${message}${Colors.reset}`;
547
+ }
548
+ /**
549
+ * Log a specific level and content
550
+ * @param level The specific level to log
551
+ * @param message The content of the message
552
+ * @param messages Any additional messages
553
+ */
554
+ log(level, message, ...messages) {
555
+ const formattedMessage = this._formatMessage(level, message, messages);
556
+ if (this._options.saveToLogFiles) {
557
+ this._addToLogBatch({
558
+ // we don't need ID and level
559
+ method: METHOD.LOG,
560
+ payload: formattedMessage,
561
+ });
562
+ }
563
+ if (this._options.outputToConsole) {
564
+ const coloredMessage = this._colorize(level, formattedMessage);
565
+ if (level === LOG_LEVEL.ERROR || level === LOG_LEVEL.FATAL) {
566
+ process.stderr.write(coloredMessage + "\n");
567
+ }
568
+ else {
569
+ process.stdout.write(coloredMessage + "\n");
570
+ }
571
+ }
572
+ }
573
+ /**
574
+ * Convenience method for INFO level
575
+ */
576
+ info(message, ...messages) {
577
+ this.log(LOG_LEVEL.INFO, message, ...messages);
578
+ }
579
+ /**
580
+ * Convenience method for WARN level
581
+ */
582
+ warn(message, ...messages) {
583
+ this.log(LOG_LEVEL.WARN, message, ...messages);
584
+ }
585
+ /**
586
+ * Convenience method for ERROR level
587
+ */
588
+ error(message, ...messages) {
589
+ this.log(LOG_LEVEL.ERROR, message, ...messages);
590
+ }
591
+ /**
592
+ * Convenience method for DEBUG level
593
+ */
594
+ debug(message, ...messages) {
595
+ this.log(LOG_LEVEL.DEBUG, message, ...messages);
596
+ }
597
+ /**
598
+ * Convenience method for FATAL level
599
+ */
600
+ fatal(message, ...messages) {
601
+ this.log(LOG_LEVEL.FATAL, message, ...messages);
602
+ }
603
+ /**
604
+ * Flush remaining buffer to log files
605
+ */
606
+ flush() {
607
+ if (!this._options.saveToLogFiles) {
608
+ return Promise.resolve();
609
+ }
610
+ this._flushLogBatch();
611
+ return this._sendControlRequest({
612
+ id: this._getNextId(),
613
+ level: LOG_LEVEL.INFO,
614
+ method: METHOD.FLUSH,
615
+ payload: "",
616
+ });
617
+ }
618
+ /**
619
+ * Used to reload / refresh the process
620
+ */
621
+ reload() {
622
+ if (!this._options.saveToLogFiles) {
623
+ return Promise.resolve();
624
+ }
625
+ this._flushLogBatch();
626
+ return this._sendControlRequest({
627
+ id: this._getNextId(),
628
+ level: LOG_LEVEL.INFO,
629
+ method: METHOD.RELOAD,
630
+ payload: "",
631
+ });
632
+ }
633
+ /**
634
+ * Used to shut down the child process and clean up
635
+ */
636
+ async shutdown() {
637
+ if (!this._options.saveToLogFiles) {
638
+ return Promise.resolve();
639
+ }
640
+ this._flushLogBatch();
641
+ await this._sendControlRequest({
642
+ id: this._getNextId(),
643
+ level: LOG_LEVEL.INFO,
644
+ method: METHOD.SHUTDOWN,
645
+ payload: "",
646
+ });
647
+ await this._worker?.terminate();
648
+ }
649
+ /**
650
+ * Get current logger options (read-only copy)
651
+ */
652
+ get options() {
653
+ return { ...this._options };
654
+ }
655
+ }
656
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}