From baf75eddbacd979dd798c58d9ac63fbb911bd2f0 Mon Sep 17 00:00:00 2001 From: yohlo Date: Mon, 29 Sep 2025 21:28:22 -0500 Subject: [PATCH] test sse fixes --- src/app/routes/api/events.$.ts | 16 ++++++++++++++-- src/hooks/use-server-events.ts | 11 ++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/app/routes/api/events.$.ts b/src/app/routes/api/events.$.ts index 0f5b8f7..d7f668a 100644 --- a/src/app/routes/api/events.$.ts +++ b/src/app/routes/api/events.$.ts @@ -37,13 +37,22 @@ export const Route = createFileRoute("/api/events/$")({ clearInterval(pingInterval); return; } - const pingMessage = `data: ${JSON.stringify({ type: "ping" })}\n\n`; + const pingMessage = `data: ${JSON.stringify({ type: "ping", timestamp: Date.now() })}\n\n`; controller.enqueue(new TextEncoder().encode(pingMessage)); } catch (e) { logger.error("ServerEvents | Ping interval error", e); clearInterval(pingInterval); } - }, 30000); + }, 15000); + + setTimeout(() => { + try { + const heartbeatMessage = `data: ${JSON.stringify({ type: "heartbeat", timestamp: Date.now() })}\n\n`; + controller.enqueue(new TextEncoder().encode(heartbeatMessage)); + } catch (e) { + logger.error("ServerEvents | Heartbeat error", e); + } + }, 1000); const cleanup = () => { serverEvents.off("test", handleEvent); @@ -63,6 +72,9 @@ export const Route = createFileRoute("/api/events/$")({ "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Cache-Control", "X-Accel-Buffering": "no", + "X-Proxy-Buffering": "no", + "Proxy-Buffering": "off", + "Transfer-Encoding": "chunked", }, }); }, diff --git a/src/hooks/use-server-events.ts b/src/hooks/use-server-events.ts index 7197385..8a98519 100644 --- a/src/hooks/use-server-events.ts +++ b/src/hooks/use-server-events.ts @@ -19,6 +19,7 @@ const eventHandlers: Record = { logger.info("New Connection"); }, "ping": () => {}, + "heartbeat": () => {}, "match": (event, queryClient) => { queryClient.invalidateQueries(tournamentQueries.details(event.tournamentId)) queryClient.invalidateQueries(tournamentQueries.current()) @@ -73,15 +74,15 @@ export function useServerEvents() { logger.error("SSE connection error", error); eventSource.close(); - if (shouldConnectRef.current && retryCountRef.current < 5) { + if (shouldConnectRef.current && retryCountRef.current < 10) { retryCountRef.current += 1; const delay = Math.min( - 1000 * Math.pow(2, retryCountRef.current - 1), - 30000 + 1000 * Math.pow(1.5, retryCountRef.current - 1), + 15000 ); logger.info( - `SSE reconnection attempt ${retryCountRef.current}/5 in ${delay}ms` + `SSE reconnection attempt ${retryCountRef.current}/10 in ${delay}ms` ); timeoutRef.current = setTimeout(() => { @@ -89,7 +90,7 @@ export function useServerEvents() { connectEventSource(); } }, delay); - } else if (retryCountRef.current >= 5) { + } else if (retryCountRef.current >= 10) { logger.error("SSE max reconnection attempts reached"); } };