From e094dd16a3fb69c15a1e9e7859d879a39ae95769 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Tue, 12 Mar 2024 03:14:45 -0500 Subject: [PATCH] Add callback output --- src/outputs/Callback.ts | 20 ++++++++++++++++++++ src/types/logger.ts | 18 +++++++++++------- src/types/output.ts | 9 +++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/outputs/Callback.ts diff --git a/src/outputs/Callback.ts b/src/outputs/Callback.ts new file mode 100644 index 0000000..831f4b7 --- /dev/null +++ b/src/outputs/Callback.ts @@ -0,0 +1,20 @@ +import { LogContext, LogMeta } from "../types/logger"; +import { Loggable } from "../interface/output"; +import { CallbackOutputConfig } from "../types/output"; + +export default class Callback implements Loggable { + private callback: + | ((message: string, meta: LogMeta, context: LogContext) => void) + | ((message: string, meta: LogMeta, context: LogContext) => Promise) + | undefined; + enabled: boolean; + constructor(config: CallbackOutputConfig) { + this.enabled = config.enabled; + this.callback = config.callback; + } + write(message: string, meta: LogMeta, context: LogContext): void { + if (this.callback) { + this.callback(message, meta, context); + } + } +} diff --git a/src/types/logger.ts b/src/types/logger.ts index 21a818e..d63b4d6 100644 --- a/src/types/logger.ts +++ b/src/types/logger.ts @@ -1,3 +1,5 @@ +import { z } from "zod"; + export enum LogLevel { TRACE = 10, DEBUG = 20, @@ -14,14 +16,16 @@ export enum LogLabel { FATAL = "fatal", } -export interface LogContext { - [key: string]: any; -} +export const LogContext = z.record(z.any()); -export interface LogMeta { - level: LogLevel; - time: Date; -} +export type LogContext = z.infer; + +export const LogMeta = z.object({ + level: z.nativeEnum(LogLevel), + time: z.date(), +}); + +export type LogMeta = z.infer; export interface LogData { message: string; diff --git a/src/types/output.ts b/src/types/output.ts index 36c2a75..3e40927 100644 --- a/src/types/output.ts +++ b/src/types/output.ts @@ -1,3 +1,4 @@ +import { LogContext, LogMeta } from "logger"; import { z } from "zod"; export const ConsoleStyles = z @@ -123,3 +124,11 @@ export interface TampermonkeyBucketInfo { size: number; createdAt: number; } + +export interface CallbackOutputConfig { + enabled: boolean; + callback: + | ((message: string, meta: LogMeta, context: LogContext) => void) + | ((message: string, meta: LogMeta, context: LogContext) => Promise) + | undefined; +}