From e7da512a3129368a5c5a1830ac934aeeadb1e6a8 Mon Sep 17 00:00:00 2001 From: Marck64 Date: Wed, 9 Sep 2026 14:20:27 +0200 Subject: [PATCH] Enhance SSE support: adjust headers and message format for better compatibility --- src/controllers/syncController.js | 7 ++++++- src/services/sseManager.js | 12 +++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/controllers/syncController.js b/src/controllers/syncController.js index e1be6a7..bfdb626 100644 --- a/src/controllers/syncController.js +++ b/src/controllers/syncController.js @@ -48,6 +48,7 @@ const streamEvents = async (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); + res.setHeader('X-Accel-Buffering', 'no'); res.flushHeaders(); // Enviar cabeceras inmediatamente console.log(`Cliente SSE conectado para userId: ${userId}`); @@ -56,7 +57,11 @@ const streamEvents = async (req, res) => { sseManager.addClient(userId, res); // Latido (Heartbeat) para mantener la conexión viva a través de firewalls - const interval = setInterval(() => res.write(':keepalive\n\n'), 30000); + const interval = setInterval(() => { + res.write('event: ping\n'); + res.write('data: keepalive\n\n'); + if (typeof res.flush === 'function') res.flush(); + }, 30000); // Cuando el cliente (móvil/PC) cierre la app, limpiar la memoria req.on('close', () => { diff --git a/src/services/sseManager.js b/src/services/sseManager.js index 3419053..9153310 100644 --- a/src/services/sseManager.js +++ b/src/services/sseManager.js @@ -24,13 +24,19 @@ class SseManager { } } - // El "timbre": Avisar a todos los dispositivos de un usuario (excepto al que originó el cambio) notifyUser(userId) { if (this.clients.has(userId)) { const userClients = this.clients.get(userId); userClients.forEach(res => { - // Formato obligatorio de SSE: "data: {JSON}\n\n" - res.write(`data: ${JSON.stringify({ event: 'sync_needed' })}\n\n`); + + // 1. Formato estricto que espera el paquete flutter_client_sse + res.write('event: message\n'); + res.write('data: sync_needed\n\n'); + + // 2. Si hay algún middleware de compresión atrapando el mensaje, lo forzamos a salir + if (typeof res.flush === 'function') { + res.flush(); + } }); } }