diff --git a/app/page.tsx b/app/page.tsx index 282e68b..9fe772f 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -236,37 +236,35 @@ export default function Home() { const loadHistory = async () => { setHistoryLoading(true); setHistoryItems([]); - console.log('[history] loadHistory start'); try { - console.log('[history] awaiting key...'); - await keyReadyRef.current; + // Race the key promise against a 5 s timeout so a stalled importKey + // (e.g. malformed JWK) never hangs the UI forever. + const keyTimeout = new Promise(resolve => setTimeout(resolve, 5000)); + await Promise.race([keyReadyRef.current, keyTimeout]); const key = cryptoKeyRef.current; - console.log('[history] key ready:', !!key); - if (!key) { console.error('[history] crypto key unavailable'); return; } - console.log('[history] fetching rows...'); - const res = await fetch('/api/history'); - console.log('[history] fetch status:', res.status); + if (!key) { + console.error('[history] key unavailable after wait — settings may have failed or JWK is corrupt'); + return; + } + const res = await fetch('/api/history'); if (!res.ok) { console.error('[history] fetch failed', res.status, await res.text()); return; } const rows = await res.json() as { id: string; iv: string; ciphertext: string; updated_at: string }[]; - console.log('[history] rows received:', rows.length); let failed = 0; for (let i = 0; i < rows.length; i++) { const row = rows[i]; try { const data = await decrypt<{ messages: Message[]; model: string; systemPrompt: string; title: string }>(key, row.iv, row.ciphertext); setHistoryItems(prev => [...prev, { id: row.id, updatedAt: row.updated_at, ...data }]); - console.log(`[history] decrypted ${i + 1}/${rows.length}:`, data.title); } catch (e) { failed++; console.warn(`[history] decrypt failed for row ${i + 1}/${rows.length} (${row.id}):`, e); } } - console.log('[history] done. decrypted:', rows.length - failed, 'failed:', failed); + if (failed) console.warn(`[history] ${failed}/${rows.length} rows failed to decrypt`); } catch (e) { console.error('[history] loadHistory error', e); setHistoryItems([]); } finally { - console.log('[history] setting historyLoading=false'); setHistoryLoading(false); } }; diff --git a/lib/log.ts b/lib/log.ts index cb4118e..c740289 100644 --- a/lib/log.ts +++ b/lib/log.ts @@ -1,7 +1,8 @@ import pino from 'pino'; -const logger = pino({ - level: process.env.LOG_LEVEL ?? 'info', -}); +const logger = pino( + { level: process.env.LOG_LEVEL ?? 'info' }, + pino.destination({ sync: true }), +); export default logger;