cspj-application/client/src/lib/logcatService.ts
2024-11-10 19:27:13 +08:00

65 lines
1.7 KiB
TypeScript

type LogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR" | "CRITICAL";
export interface LogEntry {
level: LogLevel;
message: string;
timestamp: number;
}
export class LogcatServiceClass {
private logs: LogEntry[] = [];
private lastLogTimestamp: number | null = null;
private listeners: (() => void)[] = [];
constructor() {
this.log("LogcatService initialised", "INFO");
}
addListener(callback: () => void) {
this.listeners.push(callback);
}
removeListener(callback: () => void) {
this.listeners = this.listeners.filter((listener) => listener !== callback);
}
private notifyListeners() {
this.listeners.forEach((listener) => listener());
}
log(message: string, level: LogLevel = "INFO"): void {
const currentTimestamp = new Date().getTime();
const timeSinceLastLog = this.lastLogTimestamp ? currentTimestamp - this.lastLogTimestamp : 0;
const logEntry: LogEntry = { message, level, timestamp: timeSinceLastLog };
this.logs.push(logEntry);
switch (level) {
case "DEBUG":
console.debug(`> [${level}] ${message} (+${timeSinceLastLog}ms)`);
break;
case "INFO":
console.info(`> [${level}] ${message} (+${timeSinceLastLog}ms)`);
break;
case "WARN":
console.warn(`> [${level}] ${message} (+${timeSinceLastLog}ms)`);
break;
case "ERROR":
console.error(`> [${level}] ${message} (+${timeSinceLastLog}ms)`);
break;
case "CRITICAL":
console.error(`> [${level}] ${message} (+${timeSinceLastLog}ms)`);
break;
}
this.lastLogTimestamp = currentTimestamp;
this.notifyListeners();
}
getLogs(): LogEntry[] {
return this.logs;
}
}
export const logcat = new LogcatServiceClass();