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) {