From df8d924a89c5373855a3d78ec0a37711a1774d85 Mon Sep 17 00:00:00 2001 From: projectmoon Date: Thu, 1 Aug 2024 17:12:21 +0200 Subject: [PATCH] Exponential backoff with useRef --- ui/components/ChatWindow.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 0934e2b..767c9f6 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -47,6 +47,8 @@ const useSocket = ( hasError: boolean ) => { const [ws, setWs] = useState(null); + const reconnectTimeout = useRef(0); + const reconnectAttempts = useRef(0); useEffect(() => { if (!ws) { @@ -203,6 +205,8 @@ const useSocket = ( ws.onopen = () => { console.log('[DEBUG] open'); + reconnectTimeout.current = 0; + reconnectAttempts.current = 0; clearTimeout(timeoutId); setError(false); setIsWSReady(true); @@ -216,7 +220,7 @@ const useSocket = ( ws.onclose = () => { clearTimeout(timeoutId); - if (!hasError) { + if (!hasError && reconnectAttempts.current < 3) { setWs(null); // forces websocket to reopen when needed. } console.log('[DEBUG] closed'); @@ -232,7 +236,15 @@ const useSocket = ( setWs(ws); }; - connectWs(); + if (reconnectAttempts.current < 3) { + console.log(`[DEBUG] Attempting to reconnect (${reconnectAttempts.current + 1}/3)`); + setTimeout(connectWs, reconnectTimeout.current); + reconnectTimeout.current = reconnectTimeout.current > 0 ? reconnectTimeout.current * 2 : 1000; + reconnectAttempts.current += 1; + } else { + console.log('[DEBUG] WebSocket reconnect failure after 3 retries'); + setError(true); + } } return () => {