# LLM Monitor - Architettura Web Worker ## πŸ“Š Architettura Moderna con Web Workers Questa versione della dashboard utilizza **Web Workers** per un'esperienza utente ottimale senza blocchi dell'UI. ## πŸ—οΈ Componenti ### 1. **data-sync.worker.js** (Web Worker) Thread separato che: - Effettua le richieste HTTP all'API (`/api/v1/health`, `/api/v1/models`) - Aggiorna **localStorage** periodicamente (ogni 30 secondi) - Invia messaggi al main thread con i dati aggiornati - **NON blocca mai l'interfaccia utente** ### 2. **app.js** (Main Thread) File principale che: - Inizializza il Web Worker - Carica dati da **localStorage** al boot - Riceve messaggi dal Worker e aggiorna il DOM - Aggiorna solo gli elementi DOM che sono effettivamente cambiati - Fornisce fallback se Web Workers non sono supportati ### 3. **index.html** Template HTML con struttura base e caricamento di app.js ## πŸ”„ Flusso Dati ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MAIN THREAD (UI Thread) β”‚ β”‚ - Renderizza il DOM β”‚ β”‚ - Interagisce con l'utente β”‚ β”‚ - Legge da localStorage β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ postMessage() / onmessage β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ WEB WORKER (Separate Thread) β”‚ β”‚ - Fetch /api/v1/health β”‚ β”‚ - Fetch /api/v1/models β”‚ β”‚ - localStorage.setItem() β”‚ β”‚ - Eseguito ogni 30 secondi β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ postMessage({ DATA_UPDATED }) β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ localStorage β”‚ β”‚ persistente β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ’Ύ LocalStorage ### Chiavi memorizzate: - `llm_monitor_health` - Dati health check (status, ollama_status, timestamp) - `llm_monitor_models` - Dati modelli (lista, total, totalSize, timestamp) ### Struttura dati: **Health:** ```json { "status": "healthy", "ollama_status": "online", "timestamp": "2024-01-15T10:30:00.000Z" } ``` **Models:** ```json { "models": [ { "name": "llama2", "digest": "abc123...", "size": 3825922048, "modified_at": "2024-01-15T10:30:00.000Z" } ], "total": 1, "totalSize": "3.56 GB", "timestamp": "2024-01-15T10:30:00.000Z" } ``` ## 🎯 Vantaggi ### βœ… Performance - **Main thread mai bloccato** - Le richieste HTTP avvengono nel Worker - **DOM updates ottimizzate** - Aggiorna solo elementi cambiati - **60 FPS garantito** - L'UI resta responsiva ### βœ… Offline Support - I dati rimangono in **localStorage** anche se il server Γ¨ offline - La dashboard mostra l'ultimo stato noto ### βœ… Efficienza di Rete - Una sola fetch ogni 30 secondi (dal Worker) - Compressione gzip della risposta - Ridotto uso di bandwidth ### βœ… ScalabilitΓ  - PiΓΉ tab della dashboard non sovraccaricare il server - LocalStorage condiviso tra tab (gli aggiornamenti si sincronizzano) ## πŸ”§ Configurazione ### Intervallo di aggiornamento Modifica in `data-sync.worker.js`: ```javascript const REFRESH_INTERVAL = 30000; // 30 secondi ``` ### Disabilitare Web Worker (debug) Nel browser console: ```javascript window.app.worker = null; window.app.syncDataInMainThread(); ``` ## πŸ› οΈ Sviluppo ### Debug del Worker ```javascript // In data-sync.worker.js console.log("Worker sync triggered", new Date()); ``` Console del browser (DevTools > Dedicated Worker) ### Ispezionare localStorage ```javascript // In console del browser JSON.parse(localStorage.getItem('llm_monitor_health')) JSON.parse(localStorage.getItem('llm_monitor_models')) ``` ## πŸ“± Browser Support - βœ… Chrome/Edge 4+ - βœ… Firefox 3.6+ - βœ… Safari 4+ - βœ… Opera 10.6+ - ⚠️ Fallback disponibile se non supportati ## πŸš€ Ottimizzazioni Future - [ ] IndexedDB per dati maggiori - [ ] Service Worker per offline mode completo - [ ] Sincronizzazione tra tab (BroadcastChannel API) - [ ] Caching intelligente con TTL - [ ] Compressione dati (Zstandard/Brotli) ## πŸ” Troubleshooting ### Worker non carica - Verificare CORS - Controllare DevTools > Application > Service Workers - Verificare console per errori ### localStorage non persiste - ModalitΓ  incognito/privato disabilita localStorage - Spazio esaurito: svuotare localStorage - Cookie di terze parti potrebbe essere disabilitato ### Aggiornamenti non visibili - Controllare DevTools > Application > LocalStorage - Verificare che il Worker sia attivo (DevTools > Dedicated Workers) - Forzare refresh manuale con pulsante πŸ”„ ## πŸ“š Riferimenti - [MDN Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) - [localStorage API](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) - [Performance Best Practices](https://web.dev/performance/) --- **Sviluppato per LLM Monitor v1.0.0** πŸ¦™