@coinbase/cdp-sdk
Version:
SDK for interacting with the Coinbase Developer Platform Wallet API
204 lines (187 loc) • 5.41 kB
text/typescript
export const LogLevel = {
Debug: "debug",
Info: "info",
Warn: "warn",
Error: "error",
} as const;
export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];
const logLevelMap: Record<LogLevel, number> = {
[LogLevel.Debug]: 1,
[LogLevel.Info]: 2,
[LogLevel.Warn]: 3,
[LogLevel.Error]: 4,
};
export interface ILogger {
/**
* Logs a debug message.
* @param message - The message to log
* @param args - Additional arguments to log
*/
debug(message: string, ...args: unknown[]): void;
/**
* Logs an info message.
* @param message - The message to log
* @param args - Additional arguments to log
*/
info(message: string, ...args: unknown[]): void;
/**
* Logs a warning message.
* @param message - The message to log
* @param args - Additional arguments to log
*/
warn(message: string, ...args: unknown[]): void;
/**
* Logs an error message.
* @param message - The message to log
* @param args - Additional arguments to log
*/
error(message: string, ...args: unknown[]): void;
}
/**
* Configuration for logger initialization.
*/
export interface LogConfig {
/**
* Minimum log level to output.
* @default LogLevel.Info
*/
level?: LogLevel;
/**
* Logger implementation to use.
* @default new ConsoleLogger()
*/
logger?: ILogger;
/**
* Whether logging should be silenced.
* @default true
*/
silent?: boolean;
}
/**
* Default console-based logger implementation.
*/
export class ConsoleLogger implements ILogger {
debug(message: string, ...args: unknown[]): void {
console.debug(message, ...args);
}
info(message: string, ...args: unknown[]): void {
console.info(message, ...args);
}
warn(message: string, ...args: unknown[]): void {
console.warn(message, ...args);
}
error(message: string, ...args: unknown[]): void {
console.error(message, ...args);
}
}
/**
* Logger class that provides level-based logging functionality.
*/
export class Logger {
private readonly level: number;
private readonly logger: ILogger;
private readonly silent: boolean;
/**
* Creates a new logger instance.
* @param config - Logger configuration
*/
constructor(config: Required<LogConfig>) {
this.level = logLevelMap[config.level];
this.logger = config.logger;
this.silent = config.silent;
}
/**
* Checks if a log level should be output based on configuration.
* @param level - The log level to check
* @returns True if the level should be logged
*/
public shouldLog(level: LogLevel): boolean {
return !this.silent && this.level <= logLevelMap[level];
}
/**
* Checks if debug logging is enabled.
* @returns True if debug logs should be output
*/
public isDebug(): boolean {
return this.shouldLog(LogLevel.Debug);
}
/**
* Logs a debug message if debug logging is enabled.
* @param message - The message to log
* @param args - Additional arguments to log
*/
public debug(message: string, ...args: unknown[]): void {
if (this.isDebug()) {
this.logger.debug(message, ...args);
}
}
/**
* Checks if info logging is enabled.
* @returns True if info logs should be output
*/
public isInfo(): boolean {
return this.shouldLog(LogLevel.Info);
}
/**
* Logs an info message if info logging is enabled.
* @param message - The message to log
* @param args - Additional arguments to log
*/
public info(message: string, ...args: unknown[]): void {
if (this.isInfo()) {
this.logger.info(message, ...args);
}
}
/**
* Checks if warning logging is enabled.
* @returns True if warning logs should be output
*/
public isWarn(): boolean {
return this.shouldLog(LogLevel.Warn);
}
/**
* Logs a warning message if warning logging is enabled.
* @param message - The message to log
* @param args - Additional arguments to log
*/
public warn(message: string, ...args: unknown[]): void {
if (this.isWarn()) {
this.logger.warn(message, ...args);
}
}
/**
* Checks if error logging is enabled.
* @returns True if error logs should be output
*/
public isError(): boolean {
return this.shouldLog(LogLevel.Error);
}
/**
* Logs an error message if error logging is enabled.
* @param message - The message to log
* @param args - Additional arguments to log
*/
public error(message: string, ...args: unknown[]): void {
if (this.isError()) {
this.logger.error(message, ...args);
}
}
}
export function createLogger(config?: LogConfig | Logger): Logger {
if (config == null) {
return defaultLogger;
}
if (config instanceof Logger) {
return config;
}
config = config ?? {};
config.level ??= LogLevel.Info;
config.logger ??= new ConsoleLogger();
config.silent ??= true;
return new Logger(config as Required<LogConfig>);
}
const defaultLogger: Logger = new Logger({
level: LogLevel.Info,
logger: new ConsoleLogger(),
silent: true,
});