ultrawidify/src/ext/lib/logging/ComponentLogger.ts

75 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-05-01 00:55:22 +02:00
import { LogAggregator, LogSourceOptions } from './LogAggregator';
export enum LogLevel {
Debug = 'debug',
Info = 'info',
Log = 'log',
Warn = 'warn',
Error = 'error',
}
export type ComponentLoggerOptions = {
styles?: {
[x in LogLevel]?: string;
}
}
export class ComponentLogger {
private logAggregator: LogAggregator;
private component: string;
private componentOptions?: ComponentLoggerOptions;
constructor(logAggregator: LogAggregator, component: string, componentOptions?: ComponentLoggerOptions) {
this.logAggregator = logAggregator;
this.component = component;
2025-05-07 00:45:08 +02:00
this.componentOptions = componentOptions;
2025-05-01 00:55:22 +02:00
}
private handleLog(logLevel: LogLevel, sourceFunction: string | LogSourceOptions, ...message: any) {
let functionSource = typeof sourceFunction === 'string' ? sourceFunction : sourceFunction?.src;
2025-05-04 21:00:15 +02:00
let consoleMessageString = `[${this.component}${functionSource ? `::${functionSource}` : ''}]`;
2025-05-01 00:55:22 +02:00
const consoleMessageData = []
for (const m of message) {
if (typeof m === 'string') {
consoleMessageString = `${consoleMessageString} ${m}`;
} else if (typeof m === 'number') {
consoleMessageString = `${consoleMessageString} %f`;
2025-12-20 18:06:11 +01:00
consoleMessageData.push(m);
2025-05-04 21:00:15 +02:00
} else if (typeof HTMLElement !== 'undefined' && m instanceof HTMLElement) { // HTMLElement does not exist in background script, but this class may
2025-05-01 00:55:22 +02:00
consoleMessageString = `${consoleMessageString} %o`;
2025-12-20 18:06:11 +01:00
consoleMessageData.push(m);
2025-05-01 00:55:22 +02:00
} else {
consoleMessageString = `${consoleMessageString} %O`;
2025-12-20 18:06:11 +01:00
consoleMessageData.push(m);
2025-05-01 00:55:22 +02:00
}
}
const style = this.componentOptions?.styles?.[logLevel] ?? this.componentOptions?.styles?.[LogLevel.Log];
if (style) {
consoleMessageString = `%c${consoleMessageString}`;
consoleMessageData.unshift(style);
}
this.logAggregator.log(this.component, logLevel, typeof sourceFunction === 'object' ? sourceFunction : undefined, consoleMessageString, ...consoleMessageData);
}
debug(sourceFunction: string | LogSourceOptions, ...message: any[]) {
this.handleLog(LogLevel.Debug, sourceFunction, ...message);
}
info(sourceFunction: string | LogSourceOptions, ...message: any[]) {
this.handleLog(LogLevel.Info, sourceFunction, ...message);
}
log(sourceFunction: string | LogSourceOptions, ...message: any[]) {
this.handleLog(LogLevel.Log, sourceFunction, ...message);
}
warn(sourceFunction: string | LogSourceOptions, ...message: any[]) {
this.handleLog(LogLevel.Warn, sourceFunction, ...message);
}
error(sourceFunction: string | LogSourceOptions, ...message: any[]) {
this.handleLog(LogLevel.Error, sourceFunction, ...message);
}
}