mirror of
https://github.com/koush/scrypted.git
synced 2026-03-01 16:52:56 +00:00
93 lines
2.5 KiB
TypeScript
93 lines
2.5 KiB
TypeScript
import { EventEmitter } from 'events';
|
|
import { ScryptedRuntime } from './runtime';
|
|
import crypto from 'crypto';
|
|
import { ScryptedAlert } from './db-types';
|
|
import { PluginLogger } from './plugin/plugin-api';
|
|
|
|
export function makeAlertId(path: string, msg: string): string {
|
|
return crypto.createHash('sha256').update(path).update(msg).digest('base64');
|
|
}
|
|
|
|
export interface LogEntry {
|
|
title: string;
|
|
timestamp: number;
|
|
level: string,
|
|
message: string;
|
|
path: string;
|
|
}
|
|
|
|
export class Logger extends EventEmitter implements PluginLogger {
|
|
logs: LogEntry[] = [];
|
|
children: { [id: string]: Logger } = {};
|
|
path: string;
|
|
title: string;
|
|
scrypted: ScryptedRuntime;
|
|
|
|
constructor(scrypted: ScryptedRuntime, path: string, title: string) {
|
|
super();
|
|
this.scrypted = scrypted;
|
|
this.path = path;
|
|
this.title = title;
|
|
}
|
|
|
|
async log(level: string, message: string) {
|
|
const timestamp = Date.now();
|
|
const entry = {
|
|
timestamp,
|
|
level,
|
|
message,
|
|
path: this.path,
|
|
title: this.title,
|
|
};
|
|
this.logs.push(entry);
|
|
|
|
console.log(level, this.title, message);
|
|
this.emit('log', entry);
|
|
}
|
|
|
|
purge(before: number) {
|
|
this.logs = this.logs.filter(log => log.timestamp < before);
|
|
for (const child of Object.values(this.children)) {
|
|
child.purge(before);
|
|
}
|
|
}
|
|
|
|
async clear() {
|
|
await this.clearAlerts();
|
|
|
|
this.logs = [];
|
|
for (const child of Object.values(this.children)) {
|
|
await child.clear();
|
|
}
|
|
}
|
|
|
|
async clearAlert(message: string) {
|
|
const id = makeAlertId(this.path, message);
|
|
await this.scrypted.datastore.removeId(ScryptedAlert, id);
|
|
}
|
|
|
|
async clearAlerts() {
|
|
for await (const alert of this.scrypted.datastore.getAll(ScryptedAlert)) {
|
|
if (alert.path.startsWith(this.path)) {
|
|
await this.scrypted.datastore.remove(alert);
|
|
}
|
|
}
|
|
}
|
|
|
|
getLogger(id: string, title: string): Logger {
|
|
if (this.children[id])
|
|
return this.children[id];
|
|
|
|
const ret = new Logger(this.scrypted, `${this.path}/${id}`, title);
|
|
ret.on('log', entry => this.emit('log', entry));
|
|
this.children[id] = ret;
|
|
return ret;
|
|
}
|
|
|
|
getLogs(): LogEntry[] {
|
|
const allLogs = Object.values(this.children).map(child => child.getLogs()).flat().concat(this.logs);
|
|
allLogs.sort((a, b) => a.timestamp - b.timestamp);
|
|
return allLogs;
|
|
}
|
|
}
|