fix(display): corregir turnos que no aparecen en pantalla TV
- sse_turno.php: sleep(2)→sleep(1) para detectar notificarSSE en máx 1s - display*.php: visibilitychange + focus → fetch inmediato al despertar pantalla - display*.php: Wake Lock API para evitar throttling del browser en TVs - display.php: SSE open → cargarSnapshot() inmediato al reconectar Causa raíz: browsers throttlean setInterval a >1min en tabs sin foco; las TVs inactivas dejaban de recibir actualizaciones aunque el servidor las enviara correctamente. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
8760b685ad
commit
d24b234e30
@@ -130,7 +130,7 @@ $stmt->execute([$sesionId]);
|
|||||||
$lastPing = $stmt->fetchColumn() ?: null;
|
$lastPing = $stmt->fetchColumn() ?: null;
|
||||||
|
|
||||||
while (!connection_aborted()) {
|
while (!connection_aborted()) {
|
||||||
sleep(2);
|
sleep(1);
|
||||||
|
|
||||||
// Leer el último sse_ping_at de la sesión
|
// Leer el último sse_ping_at de la sesión
|
||||||
$stmt = $pdo->prepare('SELECT sse_ping_at FROM turnero_sesiones WHERE id = ?');
|
$stmt = $pdo->prepare('SELECT sse_ping_at FROM turnero_sesiones WHERE id = ?');
|
||||||
|
|||||||
@@ -558,8 +558,8 @@ function conectarSSE() {
|
|||||||
esSource.addEventListener('open', () => {
|
esSource.addEventListener('open', () => {
|
||||||
reconnectDelay = 2000;
|
reconnectDelay = 2000;
|
||||||
sseViva = true;
|
sseViva = true;
|
||||||
// SSE conectado → ocultar chip (el polling garantiza actualización)
|
|
||||||
chipEstado.style.display = 'none';
|
chipEstado.style.display = 'none';
|
||||||
|
cargarSnapshot(); // re-fetch inmediato al reconectar (cubre gaps de SSE caído)
|
||||||
});
|
});
|
||||||
|
|
||||||
esSource.addEventListener('cola_update', (e) => {
|
esSource.addEventListener('cola_update', (e) => {
|
||||||
@@ -582,6 +582,24 @@ function conectarSSE() {
|
|||||||
// ── Inicio ────────────────────────────────────────────────────
|
// ── Inicio ────────────────────────────────────────────────────
|
||||||
iniciarPolling();
|
iniciarPolling();
|
||||||
conectarSSE();
|
conectarSSE();
|
||||||
|
|
||||||
|
// ── Resistir throttling de browser en TVs ────────────────────
|
||||||
|
// visibilitychange: pantalla vuelve de reposo o tab recupera foco
|
||||||
|
document.addEventListener('visibilitychange', () => {
|
||||||
|
if (!document.hidden) cargarSnapshot();
|
||||||
|
});
|
||||||
|
window.addEventListener('focus', cargarSnapshot);
|
||||||
|
|
||||||
|
// Wake Lock: evita que el browser suspenda el tab
|
||||||
|
if ('wakeLock' in navigator) {
|
||||||
|
async function pedirWakeLock() {
|
||||||
|
try { await navigator.wakeLock.request('screen'); } catch (_) {}
|
||||||
|
}
|
||||||
|
pedirWakeLock();
|
||||||
|
document.addEventListener('visibilitychange', () => {
|
||||||
|
if (!document.hidden) pedirWakeLock();
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -739,6 +739,17 @@ async function cargarSnapshot() {
|
|||||||
|
|
||||||
cargarSnapshot();
|
cargarSnapshot();
|
||||||
setInterval(cargarSnapshot, 2000);
|
setInterval(cargarSnapshot, 2000);
|
||||||
|
|
||||||
|
document.addEventListener('visibilitychange', () => { if (!document.hidden) cargarSnapshot(); });
|
||||||
|
window.addEventListener('focus', cargarSnapshot);
|
||||||
|
|
||||||
|
if ('wakeLock' in navigator) {
|
||||||
|
async function pedirWakeLock() {
|
||||||
|
try { await navigator.wakeLock.request('screen'); } catch (_) {}
|
||||||
|
}
|
||||||
|
pedirWakeLock();
|
||||||
|
document.addEventListener('visibilitychange', () => { if (!document.hidden) pedirWakeLock(); });
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -373,6 +373,17 @@ async function cargar() {
|
|||||||
|
|
||||||
cargar();
|
cargar();
|
||||||
setInterval(cargar, 2000);
|
setInterval(cargar, 2000);
|
||||||
|
|
||||||
|
document.addEventListener('visibilitychange', () => { if (!document.hidden) cargar(); });
|
||||||
|
window.addEventListener('focus', cargar);
|
||||||
|
|
||||||
|
if ('wakeLock' in navigator) {
|
||||||
|
async function pedirWakeLock() {
|
||||||
|
try { await navigator.wakeLock.request('screen'); } catch (_) {}
|
||||||
|
}
|
||||||
|
pedirWakeLock();
|
||||||
|
document.addEventListener('visibilitychange', () => { if (!document.hidden) pedirWakeLock(); });
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user