fix: исправлена проблема с WebSocket соединениями при обновлении

- Добавлена задержка между закрытием и открытием 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
This commit is contained in:
Сергей Антропов 2025-08-20 21:00:39 +03:00
parent 18466d2cb0
commit 3df66ff55d

View File

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