From 6b52795ae13a7101d9767a95ac9abf1a7271763e Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Fri, 3 Jul 2026 12:09:39 +0800 Subject: [PATCH] stream: auto-reconnect to the live stream with exponential backoff If the stream drops (server restart, network loss), the player now retries goLive() on error/ended/stalled with a delay that doubles each failure, capped at 30s, and resets once audio flows again. Co-Authored-By: Claude Opus 4.8 --- stream/index.html | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/stream/index.html b/stream/index.html index 01dea5e..85858e8 100644 --- a/stream/index.html +++ b/stream/index.html @@ -113,6 +113,29 @@ } goLive(); + // Reconnexion automatique : si le flux se coupe (serveur redémarré, réseau + // perdu…), on retente avec un délai qui double à chaque échec, plafonné à + // 30 s, pour ne pas marteler un serveur encore indisponible. Le compteur + // repart à zéro dès qu'on rejoue effectivement du son. + const RECONNECT_MIN = 1000, RECONNECT_MAX = 30000; + let reconnectDelay = RECONNECT_MIN; + let reconnectTimer = null; + function scheduleReconnect() { + if (reconnectTimer || player.paused) return; + reconnectTimer = setTimeout(() => { + reconnectTimer = null; + goLive(); + reconnectDelay = Math.min(reconnectDelay * 2, RECONNECT_MAX); + }, reconnectDelay); + } + player.addEventListener("error", scheduleReconnect); + player.addEventListener("ended", scheduleReconnect); + player.addEventListener("stalled", scheduleReconnect); + player.addEventListener("playing", () => { + if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; } + reconnectDelay = RECONNECT_MIN; + }); + // Volume persistant : on restaure le dernier réglage de l'utilisateur, // avec 40% comme valeur par défaut au tout premier lancement. const VOLUME_KEY = "radieo-volume";