let days = document.getElementById("days"); let hours = document.getElementById("hours"); let minutes = document.getElementById("minutes"); let seconds = document.getElementById("seconds"); let interval = document.getElementById("timeToRestart"); function timeNotTwoDigits(number) { if (number < 10 && number >= 0) { return "0" + number; } if (number < 0&& number > -10) { return "-0" + Math.abs(number); } return number; } const HEARTBEAT_INTERVAL = 1000; // Интервал heartbeat в миллисекундах const HEARTBEAT_VALUE = 1; // Значение heartbeat-сообщения const RECONNECT_INTERVAL = 1000; // Интервал переподключения в миллисекундах const WS_URL = "ws://pane2k-tiktokopen.hf.space:8001"; class WebSocketClient { constructor(url, reconnectInterval, heartbeatInterval) { this.url = url; this.reconnectInterval = reconnectInterval; this.heartbeatInterval = heartbeatInterval; this.websocket = null; this.isConnecting = false; this.heartbeatTimer = null; this.connect(); } connect() { if (this.isConnecting) { console.log("Подключение уже в процессе."); return; } this.isConnecting = true; console.log("Попытка подключения к:", this.url); this.websocket = new WebSocket(this.url); this.websocket.onopen = () => { console.log("Соединение WebSocket открыто"); this.isConnecting = false; this.startHeartbeat(); this.onOpen(); }; this.websocket.onmessage = (event) => { this.onMessage(event); }; this.websocket.onclose = (event) => { console.log("Соединение WebSocket закрыто:", event.code, event.reason); this.isConnecting = false; this.stopHeartbeat(); this.onClose(event); if (event.code !== 1000) { this.reconnect(); } }; this.websocket.onerror = (error) => { console.error("Ошибка WebSocket:", error); this.isConnecting = false; this.stopHeartbeat(); this.onError(error); this.reconnect(); }; } startHeartbeat() { if (this.heartbeatInterval <= 0) return this.heartbeatTimer = setInterval(() => { if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { this.websocket.send(HEARTBEAT_VALUE); } else { console.log("Не удалось отправить heartbeat, соединение не установлено"); this.stopHeartbeat(); } }, this.heartbeatInterval); } stopHeartbeat() { clearInterval(this.heartbeatTimer); } reconnect() { console.log(`Попытка переподключения через ${this.reconnectInterval / 1000} секунд.`); setTimeout(() => { this.connect(); }, this.reconnectInterval); } send(data) { if (this.websocket && this.websocket.readyState === WebSocket.OPEN) { this.websocket.send(data); } else { console.log("Соединение WebSocket не установлено, сообщение не отправлено:", data) } } onOpen() { console.log("Соединение открыто!"); } onMessage(event) { try { let data = JSON.parse(event.data); this.setTimerFromWSData(data.data.time); this.setReloadTimeFromWSData(data.data.timerToRestart); this.setTextUpdating(data.data.isUpdating); } catch (e) { console.log("Получено некорректное сообщение", event.data) } } onClose(event) { console.log("Соединение закрыто.", event) } onError(error) { console.log("Произошла ошибка:", error) } setTimerFromWSData(data) { let time = data; let days_ = Math.floor(time / (60 * 60 * 24)); let hours_ = Math.floor(time / (60 * 60)) % 24; let minutes_ = Math.floor(time / 60) % 60; let seconds_ = time % 60; days.innerHTML = timeNotTwoDigits(days_); hours.innerHTML = timeNotTwoDigits(hours_); minutes.innerHTML = timeNotTwoDigits(minutes_); seconds.innerHTML = timeNotTwoDigits(seconds_); } setReloadTimeFromWSData(data) { let time = data; interval.innerHTML = `Обновление через - ${time} секунд`; } setTextUpdating(data) { if (data) { interval.innerHTML = "Обновление данных..."; } } } const client = new WebSocketClient(WS_URL, RECONNECT_INTERVAL, HEARTBEAT_INTERVAL);