feat: improve SSE broadcasting for weather sessions with enhanced error handling and connection management
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 5m49s

This commit is contained in:
Julien Froidefond
2026-02-04 13:18:10 +01:00
parent 057732f00e
commit 39910f559e

View File

@@ -98,25 +98,38 @@ export async function GET(request: Request, { params }: { params: Promise<{ id:
// Helper to broadcast to all connections (called from actions) // Helper to broadcast to all connections (called from actions)
export function broadcastToWeatherSession(sessionId: string, event: object) { export function broadcastToWeatherSession(sessionId: string, event: object) {
try {
const sessionConnections = connections.get(sessionId); const sessionConnections = connections.get(sessionId);
if (!sessionConnections || sessionConnections.size === 0) { if (!sessionConnections || sessionConnections.size === 0) {
// No active connections, event will be picked up by polling
console.log(`[SSE Broadcast] No connections for session ${sessionId}, will be picked up by polling`);
return; return;
} }
console.log(`[SSE Broadcast] Broadcasting to ${sessionConnections.size} connections for session ${sessionId}`);
const encoder = new TextEncoder(); const encoder = new TextEncoder();
const message = encoder.encode(`data: ${JSON.stringify(event)}\n\n`); const message = encoder.encode(`data: ${JSON.stringify(event)}\n\n`);
let sentCount = 0;
for (const controller of sessionConnections) { for (const controller of sessionConnections) {
try { try {
controller.enqueue(message); controller.enqueue(message);
} catch { sentCount++;
} catch (error) {
// Connection might be closed, remove it // Connection might be closed, remove it
console.log(`[SSE Broadcast] Failed to send, removing connection:`, error);
sessionConnections.delete(controller); sessionConnections.delete(controller);
} }
} }
console.log(`[SSE Broadcast] Sent to ${sentCount} connections`);
// Clean up empty sets // Clean up empty sets
if (sessionConnections.size === 0) { if (sessionConnections.size === 0) {
connections.delete(sessionId); connections.delete(sessionId);
} }
} catch (error) {
console.error('[SSE Broadcast] Error broadcasting:', error);
}
} }