memorium/lib/log.ts
2023-08-13 02:26:22 +02:00

51 lines
1.3 KiB
TypeScript

import { EventEmitter } from "https://deno.land/x/evtemitter@v3.0.0/mod.ts";
enum LOG_LEVEL {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3,
}
const logFuncs = {
[LOG_LEVEL.DEBUG]: console.debug,
[LOG_LEVEL.INFO]: console.info,
[LOG_LEVEL.WARN]: console.warn,
[LOG_LEVEL.ERROR]: console.error,
} as const;
let longestScope = 0;
let logLevel = LOG_LEVEL.WARN;
const ee = new EventEmitter<{
log: { level: LOG_LEVEL; scope: string; args: unknown[] };
}>();
export function setLogLevel(level: LOG_LEVEL) {
logLevel = level;
}
type LoggerOptions = {
enabled?: boolean;
};
const createLogFunction =
(scope: string, level: LOG_LEVEL) => (...data: unknown[]) => {
ee.emit("log", { level, scope, args: data });
if (level <= logLevel) return;
logFuncs[level](`[${scope.padEnd(longestScope, " ")}]`, ...data);
};
export function createLogger(scope: string, _options?: LoggerOptions) {
longestScope = Math.max(scope.length, longestScope);
return {
debug: createLogFunction(scope, LOG_LEVEL.DEBUG),
info: createLogFunction(scope, LOG_LEVEL.INFO),
error: createLogFunction(scope, LOG_LEVEL.ERROR),
warn: createLogFunction(scope, LOG_LEVEL.WARN),
addEventListener:
((type, cb) =>
ee.addEventListener(type, cb)) as typeof ee.addEventListener,
};
}