/* Surveille la disponibilité du serveur et détecte les changements de version. * Pendant une mise à jour Docker (quelques secondes d'indisponibilité), affiche * un bandeau « Mise à jour en cours » puis recharge la page automatiquement * quand le service revient avec une nouvelle version. * Un serveur qui RÉPOND est considéré comme disponible (même 404 : instance * antérieure à l'endpoint /api/version) — seul un échec réseau (connexion * refusée, timeout) signifie « en cours de redémarrage ». */ (() => { const POLL_MS = 8000; const KEY_UPDATING = 'ohm-updating'; let initialVersion = null; let failures = 0; let banner = null; let done = false; const isUpdating = () => sessionStorage.getItem(KEY_UPDATING) === '1'; function showBanner() { if (banner) return; banner = document.createElement('div'); banner.className = 'update-banner'; banner.innerHTML = '⟳ Mise à jour en cours — reconnexion automatique…'; document.body.appendChild(banner); } function hideBanner() { if (banner) banner.remove(); banner = null; } async function poll() { if (document.hidden || done) return; let version = null; let up = false; try { const r = await fetch('/api/version', { cache: 'no-store' }); up = true; // le serveur a répondu : il est vivant if (r.ok) version = (await r.json()).version ?? null; } catch { up = false; // connexion refusée / réseau coupé : serveur injoignable } if (!up) { failures += 1; if (isUpdating() || failures >= 2) showBanner(); return; } failures = 0; hideBanner(); if (version !== null && initialVersion === null) initialVersion = version; if (isUpdating() || (version !== null && version !== initialVersion)) { done = true; sessionStorage.removeItem(KEY_UPDATING); setTimeout(() => location.reload(), 1000); // laisser le serveur finir de démarrer } } document.addEventListener('visibilitychange', () => { if (!document.hidden) poll(); }); if (isUpdating()) showBanner(); poll(); setInterval(poll, POLL_MS); })();