node-logy 0.2.2 → 0.2.4

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