Проверяет умение реализовать устойчивое WebSocket-соединение с автоматическим переподключением при обрывах сети, что критично для чатов, трейдинга и real-time приложений.
WebSocket-соединение может разорваться по множеству причин: смена сети, сон устройства, падение сервера, таймаут прокси. Без логики переподключения клиент просто перестанет получать данные, и пользователь увидит «зависший» интерфейс. Задача — сделать так, чтобы клиент сам восстанавливал связь и продолжал работу.
class ReconnectingWS {
constructor(url) {
this.url = url;
this.attempts = 0;
this.maxDelay = 30000;
this.connect();
}
connect() {
this.ws = new WebSocket(this.url);
this.ws.onopen = () => {
this.attempts = 0;
this.startHeartbeat();
this.onReconnect && this.onReconnect();
};
this.ws.onmessage = (e) => this.onMessage && this.onMessage(e);
this.ws.onclose = () => this.scheduleReconnect();
this.ws.onerror = () => this.ws.close();
}
scheduleReconnect() {
this.stopHeartbeat();
const base = Math.min(1000 * 2 ** this.attempts, this.maxDelay);
const jitter = Math.random() * 1000;
this.attempts++;
setTimeout(() => this.connect(), base + jitter);
}
startHeartbeat() {
this.hb = setInterval(() => this.ws.send('ping'), 15000);
}
stopHeartbeat() { clearInterval(this.hb); }
}В чатах, биржевых терминалах, онлайн-играх, системах мониторинга и любых real-time дашбордах. На серверной стороне (Node.js, Go) часто используют библиотеки вроде reconnecting-websocket или собственные обёртки с аналогичной логикой.
Итог: автоматическое переподключение с backoff, jitter и heartbeat делает WebSocket-клиент устойчивым к сетевым сбоям и обязателен для любого production real-time приложения.