Spaces:
Running
Running
| // Ring buffer for frontend console messages. Settings "Logs > Frontend" tab | |
| // reads from here. Installed once in main.jsx so every console.* is captured | |
| // without breaking the DevTools output. | |
| const MAX = 500; | |
| const buf = []; | |
| function push(level, args) { | |
| const msg = Array.from(args).map((a) => { | |
| if (a instanceof Error) return `${a.name}: ${a.message}${a.stack ? '\n' + a.stack : ''}`; | |
| if (typeof a === 'object') { | |
| try { return JSON.stringify(a); } catch { return String(a); } | |
| } | |
| return String(a); | |
| }).join(' '); | |
| buf.push({ t: Date.now(), level, msg }); | |
| if (buf.length > MAX) buf.shift(); | |
| } | |
| let installed = false; | |
| export function installConsoleCapture() { | |
| if (installed || typeof window === 'undefined') return; | |
| installed = true; | |
| ['log', 'info', 'warn', 'error', 'debug'].forEach((level) => { | |
| const orig = console[level].bind(console); | |
| console[level] = (...args) => { try { push(level, args); } catch {} orig(...args); }; | |
| }); | |
| window.addEventListener('error', (e) => { | |
| push('error', [`[uncaught] ${e.message}`, e.filename ? `at ${e.filename}:${e.lineno}:${e.colno}` : '']); | |
| }); | |
| window.addEventListener('unhandledrejection', (e) => { | |
| push('error', ['[unhandledrejection]', e.reason]); | |
| }); | |
| } | |
| export function getFrontendLogs() { | |
| return buf.slice(); | |
| } | |
| export function clearFrontendLogs() { | |
| buf.length = 0; | |
| } | |