diff --git a/src/Logger.ts b/src/Logger.ts index e8d39cd..70cc41a 100644 --- a/src/Logger.ts +++ b/src/Logger.ts @@ -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); + } } diff --git a/src/interface/output.ts b/src/interface/output.ts index a91d58e..b929656 100644 --- a/src/interface/output.ts +++ b/src/interface/output.ts @@ -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; +} diff --git a/src/outputs/Tampermonkey.ts b/src/outputs/Tampermonkey.ts index 06c3558..94afbec 100644 --- a/src/outputs/Tampermonkey.ts +++ b/src/outputs/Tampermonkey.ts @@ -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;