From fed47f07717468c26fde8f5d538ec37c07b53b9b Mon Sep 17 00:00:00 2001 From: denis0001-dev Date: Thu, 21 Aug 2025 17:59:14 +0300 Subject: [PATCH] Add websocket auto reconnect --- frontend/src/utils.ts | 4 ++++ frontend/src/websocket.ts | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts index cbc4a7a..84499f3 100644 --- a/frontend/src/utils.ts +++ b/frontend/src/utils.ts @@ -5,4 +5,8 @@ export function formatTime(dateString: string) { const hoursString = hours < 10 ? '0' + hours : hours; const minutesString = minutes < 10 ? '0' + minutes : minutes; return hoursString + ':' + minutesString; +} + +export function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); } \ No newline at end of file diff --git a/frontend/src/websocket.ts b/frontend/src/websocket.ts index 1ce731f..6cafd7e 100644 --- a/frontend/src/websocket.ts +++ b/frontend/src/websocket.ts @@ -2,9 +2,13 @@ import { currentUser } from "./auth"; import { addMessage } from "./chat"; import { API_FULL_BASE_URL } from "./config"; import type { WebSocketMessage, Message } from "./types"; +import { delay } from "./utils"; +function create() { + return new WebSocket(`ws://${API_FULL_BASE_URL}/chat/ws`); +} -export const websocket = new WebSocket(`ws://${API_FULL_BASE_URL}/chat/ws`); +export let websocket = create(); // -------------- // Initialization @@ -19,4 +23,18 @@ websocket.addEventListener("message", (e) => { break; } } +}); + +websocket.addEventListener("error", async () => { + console.warn("WebSocket disconnected, retrying in 3 seconds..."); + await delay(3000); + websocket = create(); + + let listener: () => void | null; + listener = () => { + console.log("WebSocket successfully reconnected!"); + websocket.removeEventListener("open", listener); + } + + websocket.addEventListener("open", listener); }); \ No newline at end of file