@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
JavaScript
// @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
};