From 3df66ff55dee80ce852f6f495acef466e9f066f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Wed, 20 Aug 2025 21:00:39 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=81=20WebSocket=20=D1=81=D0=BE=D0=B5=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена задержка между закрытием и открытием WebSocket соединений - Улучшена функция closeWs с проверкой состояния соединения - Добавлена проверка существующих соединений в openWs - Добавлено подробное логирование для отладки WebSocket Изменения: 1. refreshLogsAndCounters: добавлена задержка 100мс после closeWs 2. closeWs: добавлена проверка readyState и подробное логирование 3. openWs: добавлена проверка существующих соединений с автоматическим переподключением Это решает проблему 'WebSocket is closed before the connection is established' при нажатии горячей клавиши 'r' для обновления логов. Автор: Сергей Антропов Сайт: https://devops.org.ru --- app/static/js/index.js | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/app/static/js/index.js b/app/static/js/index.js index d369ddc..fc46986 100644 --- a/app/static/js/index.js +++ b/app/static/js/index.js @@ -2548,10 +2548,24 @@ function wsUrl(containerId, service, project){ */ function closeWs(id){ const o = state.open[id]; - if (!o) return; + if (!o) { + console.log(`closeWs: No connection found for container ${id}`); + return; + } + + console.log(`closeWs: Closing WebSocket connection for container ${id}`); + + try { + if (o.ws && o.ws.readyState !== WebSocket.CLOSED) { + o.ws.close(); + console.log(`closeWs: WebSocket connection closed for container ${id}`); + } + } catch(e){ + console.error(`closeWs: Error closing WebSocket for container ${id}:`, e); + } - try { o.ws.close(); } catch(e){} delete state.open[id]; + console.log(`closeWs: Connection state removed for container ${id}`); } /** @@ -2685,6 +2699,17 @@ function openWs(svc, panel){ console.log(`openWs: Called for ${svc.name} (${id}) in multiViewMode: ${state.multiViewMode}`); console.log(`openWs: Selected containers: ${state.selectedContainers.join(', ')}`); + // Проверяем, есть ли уже открытое соединение для этого контейнера + if (state.open[id]) { + console.log(`openWs: Connection already exists for container ${id}, closing it first`); + closeWs(id); + // Добавляем небольшую задержку для корректного закрытия + setTimeout(() => { + openWs(svc, panel); + }, 50); + return; + } + const logEl = panel.querySelector('.log'); const wrapEl = panel.querySelector('.logwrap'); @@ -4249,6 +4274,9 @@ async function refreshLogsAndCounters() { const currentId = state.current.id; closeWs(currentId); + // Добавляем небольшую задержку для корректного закрытия соединения + await new Promise(resolve => setTimeout(resolve, 100)); + // Находим обновленный контейнер в списке const updatedContainer = state.services.find(s => s.id === currentId); if (updatedContainer) {