Add Buffered interface for outputs that maintain an internal buffer

This commit is contained in:
Clayton Wilson 2024-03-12 23:02:05 -05:00
parent 2297f9928a
commit 8e1e988cea
3 changed files with 21 additions and 5 deletions

View File

@ -1,5 +1,5 @@
import { LogContext, LogLevel, LogMeta } from "./types/logger";
import { Loggable, Storable } from "./interface/output";
import { Buffered, Loggable, Storable } from "./interface/output";
export class Logger {
private outputs: Loggable[] = [];
@ -17,8 +17,6 @@ export class Logger {
}
log(message: string, level: LogLevel, context: LogContext) {
// const label = getLabel(level);
const meta: LogMeta = {
level,
time: new Date(),
@ -55,4 +53,18 @@ export class Logger {
fatal(message: string, context: LogContext = {}) {
this.log(message, LogLevel.FATAL, context);
}
async flush() {
const promises = [];
for (const output of this.outputs) {
// BUG: Typescript doesn't realize that outputs can be Storables or Buffered as well
// @ts-ignore
if (output.flush) {
promises.push((output as Buffered).flush());
}
}
await Promise.allSettled(promises);
}
}

View File

@ -9,3 +9,7 @@ export abstract class Storable extends Loggable {
entries: number
): Promise<{ message: string; meta: LogMeta; context: LogContext }[]>;
}
export abstract class Buffered extends Storable {
abstract flush(): Promise<void>;
}

View File

@ -1,4 +1,4 @@
import { Storable } from "../interface/output";
import { Buffered } from "../interface/output";
import {
StrictTampermonkeyOutputConfig,
TampermonkeyBucketInfo,
@ -7,7 +7,7 @@ import {
import { gzip, randomString, ungzip } from "../lib/utilities";
import { LogContext, LogData, LogMeta } from "../types/logger";
export default class Tampermonkey implements Storable {
export default class Tampermonkey implements Buffered {
private buffer: LogData[];
private bucketList: TampermonkeyBucketInfo[];
private bufferCapacity: number;