| 22 | * Debug logger utility |
| 23 | */ |
| 24 | export class Logger { |
| 25 | private static instances: Map<LoggerRole, Logger> = new Map(); |
| 26 | private prefix: string; |
| 27 | private enabled: boolean = false; |
| 28 | |
| 29 | private constructor(role: LoggerRole) { |
| 30 | this.prefix = role === 'client' ? '[ClientComManager]' : '[ParentComManager]'; |
| 31 | if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') { |
| 32 | this.enabled = localStorage.getItem('vibe_debug') === 'true'; |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | static getInstance(role: LoggerRole): Logger { |
| 37 | if (!Logger.instances.has(role)) { |
| 38 | Logger.instances.set(role, new Logger(role)); |
| 39 | } |
| 40 | return Logger.instances.get(role)!; |
| 41 | } |
| 42 | |
| 43 | static setDebugEnabled(enabled: boolean): void { |
| 44 | Logger.instances.forEach((logger) => { |
| 45 | logger.enabled = enabled; |
| 46 | }); |
| 47 | if (typeof localStorage !== 'undefined') { |
| 48 | localStorage.setItem('vibe_debug', String(enabled)); |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | setEnabled(enabled: boolean): void { |
| 53 | this.enabled = enabled; |
| 54 | } |
| 55 | |
| 56 | isEnabled(): boolean { |
| 57 | return this.enabled; |
| 58 | } |
| 59 | |
| 60 | private log(level: string, message: string, data?: unknown): void { |
| 61 | if (!this.enabled) return; |
| 62 | const timestamp = new Date().toISOString().split('T')[1].slice(0, 12); |
| 63 | if (data !== undefined) { |
| 64 | console.log(`${this.prefix} ${timestamp} [${level}] ${message}`, data); |
| 65 | } else { |
| 66 | console.log(`${this.prefix} ${timestamp} [${level}] ${message}`); |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | send(type: string, messageId?: string, data?: unknown): void { |
| 71 | const idStr = messageId ? ` [${messageId.slice(-8)}]` : ''; |
| 72 | this.log('SEND', `${type}${idStr}`, data); |
| 73 | } |
| 74 | |
| 75 | receive(type: string, messageId?: string, data?: unknown): void { |
| 76 | const idStr = messageId ? ` [${messageId.slice(-8)}]` : ''; |
| 77 | this.log('RECV', `${type}${idStr}`, data); |
| 78 | } |
| 79 | |
| 80 | handshakeStart(appId?: number): void { |
| 81 | const idStr = appId ? ` (${appId})` : ''; |
nothing calls this directly
no outgoing calls
no test coverage detected