/
Gabryelf
/
Pixel-Orb
Обзор
Документация
Войти
/
Gabryelf
/
Pixel-Orb
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/client/services/websocketService.js
121 строка
4 KB
Valeev Serj
restruct_v0.0.1
07 авг 2026, 22:50
07 авг 2026, 22:50
41f78a4
Код
Авторство
О чём код?
class WebSocketService { constructor() { this.socket = null; this.listeners = new Map(); this.reconnectAttempts = 0; this.maxReconnectAttempts = 5; this.reconnectDelay = 2000; } connect() { if (this.socket && this.socket.readyState === WebSocket.OPEN) { return; } const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const url = `${protocol}//${window.location.host}`; try { this.socket = new WebSocket(url); this.socket.onopen = () => { console.log('🔌 WebSocket connected'); this.reconnectAttempts = 0; this.emit('connected', { status: 'connected' }); }; this.socket.onmessage = (event) => { try { const data = JSON.parse(event.data); this.emit(data.type, data.payload); } catch (e) { console.error('Failed to parse WebSocket message:', e); } }; this.socket.onclose = () => { console.log('🔌 WebSocket disconnected'); this.handleReconnect(); }; this.socket.onerror = (error) => { console.error('WebSocket error:', error); this.socket.close(); }; } catch (error) { console.error('Failed to connect WebSocket:', error); this.handleReconnect(); } } handleReconnect() { if (this.reconnectAttempts < this.maxReconnectAttempts) { this.reconnectAttempts++; const delay = this.reconnectDelay * this.reconnectAttempts; console.log(`🔄 Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`); setTimeout(() => this.connect(), delay); } else { console.error('❌ Max reconnect attempts reached'); } } send(type, payload) { if (this.socket && this.socket.readyState === WebSocket.OPEN) { this.socket.send(JSON.stringify({ type, payload })); } else { console.warn('WebSocket is not connected'); } } on(event, callback) { if (!this.listeners.has(event)) { this.listeners.set(event, []); } this.listeners.get(event).push(callback); } off(event, callback) { if (this.listeners.has(event)) { const callbacks = this.listeners.get(event); const index = callbacks.indexOf(callback); if (index !== -1) { callbacks.splice(index, 1); } } } emit(event, data) { if (this.listeners.has(event)) { this.listeners.get(event).forEach(callback => { try { callback(data); } catch (error) { console.error(`Error in WebSocket event ${event}:`, error); } }); } } disconnect() { if (this.socket) { this.socket.close(); this.socket = null; } this.listeners.clear(); } joinProject(projectId) { this.send('join-project', projectId); } leaveProject(projectId) { this.send('leave-project', projectId); } sendPixelUpdate(projectId, x, y, color) { this.send('pixel-update', { projectId, x, y, color }); } } const webSocketService = new WebSocketService(); export default webSocketService;