feat: crash recovery — global error handlers + toast + burst-reload

- lib/crashRecovery.ts: window.onerror + unhandledrejection handlers,
  dedupe identical messages within 10s, burst-reload after 8 distinct
  errors in 30s
- components/CrashToast.tsx: portal stack in bottom-right, max 3 visible,
  auto-dismiss after 7s, per-entry close button
- Wired in main.tsx before bootstrap so crypto/i18n errors are captured,
  rendered from App.tsx alongside UpdateToast

Covers the async layer ErrorBoundary misses (realtime handlers, stray
Promises, setTimeout callbacks, LiveKit listeners).
This commit is contained in:
2026-04-21 09:29:01 +02:00
parent 672c8738c7
commit 636565d552
4 changed files with 201 additions and 0 deletions
+3
View File
@@ -4,10 +4,13 @@ import ReactDOM from 'react-dom/client';
import { App } from './App';
import { createLibsodiumBackend } from './lib/cryptoBackend';
import { installCrashHandlers } from './lib/crashRecovery';
import { bootstrapI18n } from './lib/i18n';
import './styles/globals.css';
async function boot(): Promise<void> {
// Install first so bootstrap errors (crypto backend, i18n) are captured.
installCrashHandlers();
bootstrapI18n();
setCryptoBackend(await createLibsodiumBackend());