Spaces:
Runtime error
Runtime error
| 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); |