/** * Configurable logger for the iframe SDK. Respects logLevel so that when the * parent sets logLevel to 'none', no messages are written to the console. */ export type LogLevel = 'none' | 'error' | 'warn' | 'info' | 'debug' const LOG_LEVEL_PRIORITY: Record = { none: 0, error: 1, warn: 2, info: 3, debug: 4, } interface SdkLoggerInterface { debug(message: string, ...args: unknown[]): void warn(message: string, ...args: unknown[]): void error(message: string, ...args: unknown[]): void configure(logLevel: LogLevel): void getLogLevel(): LogLevel } class SdkLoggerImpl implements SdkLoggerInterface { private logLevel: LogLevel = 'none' configure(logLevel: LogLevel): void { this.logLevel = logLevel } getLogLevel(): LogLevel { return this.logLevel } private shouldLog(level: Exclude): boolean { return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.logLevel] } private log(level: 'debug' | 'warn' | 'error', message: string, ...args: unknown[]): void { if (!this.shouldLog(level)) return if (typeof console === 'undefined') return const prefix = `[PortalMpc] ${message}` try { if (level === 'debug' && console.debug) { console.debug(prefix, ...args) } else if (level === 'warn' && console.warn) { console.warn(prefix, ...args) } else if (level === 'error' && console.error) { console.error(prefix, ...args) } } catch { // no-op if console is unavailable or throws } } debug(message: string, ...args: unknown[]): void { this.log('debug', message, ...args) } warn(message: string, ...args: unknown[]): void { this.log('warn', message, ...args) } error(message: string, ...args: unknown[]): void { this.log('error', message, ...args) } } export const sdkLogger = new SdkLoggerImpl()