Files
ohm_streaming/app/static/js/update-watcher.js
T
Roman 9148b5fb6a Mise à jour automatique (Gitea + Watchtower) et conteneurisation Docker
- Détection de version via l'API Gitea, application via Watchtower
- Router système, UI admin (intégrations), bandeau de mise à jour
- Dockerfile multi-étapes, docker-compose, scripts/release.sh
- Version centralisée dans app/version.py (pyproject ou OHM_VERSION au build)
2026-09-22 11:58:03 +00:00

68 lines
2.1 KiB
JavaScript

/* 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 = '<span class="spin">⟳</span> 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);
})();