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) {
const sessionConnections = connections.get(sessionId); try {
if (!sessionConnections || sessionConnections.size === 0) { const sessionConnections = connections.get(sessionId);
return; 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`);
const encoder = new TextEncoder(); return;
const message = encoder.encode(`data: ${JSON.stringify(event)}\n\n`);
for (const controller of sessionConnections) {
try {
controller.enqueue(message);
} catch {
// Connection might be closed, remove it
sessionConnections.delete(controller);
} }
}
// Clean up empty sets console.log(`[SSE Broadcast] Broadcasting to ${sessionConnections.size} connections for session ${sessionId}`);
if (sessionConnections.size === 0) {
connections.delete(sessionId); const encoder = new TextEncoder();
const message = encoder.encode(`data: ${JSON.stringify(event)}\n\n`);
let sentCount = 0;
for (const controller of sessionConnections) {
try {
controller.enqueue(message);
sentCount++;
} catch (error) {
// Connection might be closed, remove it
console.log(`[SSE Broadcast] Failed to send, removing connection:`, error);
sessionConnections.delete(controller);
}
}
console.log(`[SSE Broadcast] Sent to ${sentCount} connections`);
// Clean up empty sets
if (sessionConnections.size === 0) {
connections.delete(sessionId);
}
} catch (error) {
console.error('[SSE Broadcast] Error broadcasting:', error);
} }
} }