UNPKG

@nowarajs/logger

Version:

Type-safe logging library for Bun with advanced TypeScript body intersection, modular sink pattern, transform streams, and immutable API design.

64 lines (63 loc) 1.68 kB
// @bun // source/sinks/console-logger.ts class ConsoleLoggerSink { log(level, timestamp, object) { const logEntry = { timestamp, level, content: object }; const logLevel = level.toLowerCase(); console[logLevel]?.(JSON.stringify(logEntry)); } } // source/sinks/devnull-logger.ts class DevNullLoggerSink { log() {} } // source/sinks/file-logger/enums/file-logger-error-keys.ts var FILE_LOGGER_ERROR_KEYS = { FAILED_TO_CLOSE_STREAM: "nowarajs.logger.file_logger.error.failed_to_close_stream" }; // source/sinks/file-logger/file-logger.ts import { InternalError } from "@nowarajs/error"; import { createWriteStream } from "fs"; class FileLoggerSink { config; _stream; _isClosed = false; constructor(config) { this.config = config; this._stream = createWriteStream(config.path, { flags: "a", encoding: "utf8", highWaterMark: config.bufferSize ?? 16 * 1024 }); } async log(level, timestamp, object) { if (this._isClosed) return; const logEntry = JSON.stringify({ timestamp, level, content: object }) + ` `; const canContinue = this._stream.write(logEntry); if (!canContinue) await new Promise((resolve) => { this._stream.once("drain", resolve); }); } async close() { if (this._isClosed) return; this._isClosed = true; return new Promise((resolve, reject) => { this._stream.end((err) => { if (err) reject(new InternalError(FILE_LOGGER_ERROR_KEYS.FAILED_TO_CLOSE_STREAM, err.message)); else resolve(); }); }); } } export { FileLoggerSink, FILE_LOGGER_ERROR_KEYS, DevNullLoggerSink, ConsoleLoggerSink };