From 83a24c3796f755421ca85eecbc5421c177e53927 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Mon, 23 Mar 2026 17:01:02 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F(frontend)=20add=20debounce?= =?UTF-8?q?=20WebSocket=20reconnect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We add a debounce mechanism to the WebSocket reconnect logic in the `useProviderStore` to prevent rapid reconnection attempts that can lead to performance issues and potential server overload. --- CHANGELOG.md | 1 + .../docs/doc-management/stores/useProviderStore.tsx | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 100b791b..f8689f58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to - ✨(frontend) add markdown copy icon for Copy as Markdown option #2096 - ♻️(backend) skip saving in database a document when payload is empty #2062 - ♻️(frontend) refacto Version modal to fit with the design system #2091 +- ⚡️(frontend) add debounce WebSocket reconnect #2104 ### Fixed diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx index 69616cfe..a90acb1e 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/stores/useProviderStore.tsx @@ -30,6 +30,8 @@ const defaultValues = { type ExtendedCloseEvent = CloseEvent & { wasClean: boolean }; +let reconnectTimeout: ReturnType | undefined; + export const useProviderStore = create((set, get) => ({ ...defaultValues, createProvider: (wsUrl, storeId, initialDoc) => { @@ -60,7 +62,8 @@ export const useProviderStore = create((set, get) => ({ return; } - void provider.connect(); + clearTimeout(reconnectTimeout); + reconnectTimeout = setTimeout(() => void provider.connect(), 1000); } }, onAuthenticationFailed() { @@ -119,6 +122,7 @@ export const useProviderStore = create((set, get) => ({ return provider; }, destroyProvider: () => { + clearTimeout(reconnectTimeout); const provider = get().provider; if (provider) { provider.destroy();