Spaces:
Runtime error
Runtime error
File size: 5,243 Bytes
7e4b742 2f6e1fd 7e4b742 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
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); |