/** * Client-side logger that sends logs to server for debugging. * Falls back to console if server logging fails. */ let sessionId = null let userId = null /** * Initialize logger with session/user context. * @param {string} sessId * @param {string} uid */ export function initLogger(sessId, uid) { sessionId = sessId userId = uid } /** * Send log to server (non-blocking). * @param {string} level * @param {string} message * @param {object} data */ async function sendToServer(level, message, data) { // Use setTimeout to avoid blocking - fire and forget setTimeout(async () => { try { await $fetch('/api/log', { method: 'POST', body: { level, message, data, sessionId, userId, timestamp: new Date().toISOString(), }, credentials: 'include', }).catch(() => { // Silently fail - don't spam console if server is down }) } catch { // Ignore errors - logging shouldn't break the app } }, 0) } /** * Log at error level. * @param {string} message * @param {object} data */ export function logError(message, data) { console.error(`[${message}]`, data) sendToServer('error', message, data) } /** * Log at warn level. * @param {string} message * @param {object} data */ export function logWarn(message, data) { console.warn(`[${message}]`, data) sendToServer('warn', message, data) } /** * Log at info level. * @param {string} message * @param {object} data */ export function logInfo(message, data) { console.log(`[${message}]`, data) sendToServer('info', message, data) } /** * Log at debug level. * @param {string} message * @param {object} data */ export function logDebug(message, data) { console.log(`[${message}]`, data) sendToServer('debug', message, data) }