Spaces:
Running
Running
| import { io } from 'socket.io-client'; | |
| let socket = null; | |
| const handlers = {}; | |
| export function connect(serverUrl) { | |
| socket = io(serverUrl, { | |
| transports: ['websocket', 'polling'], | |
| reconnectionAttempts: 5, | |
| }); | |
| socket.on('connect', () => { | |
| console.log('[net] connected', socket.id); | |
| emit('_connected'); | |
| }); | |
| socket.on('disconnect', () => { | |
| console.log('[net] disconnected'); | |
| emit('_disconnected'); | |
| }); | |
| // Forward all server events to local listeners | |
| const serverEvents = [ | |
| 'room_state', | |
| 'player_joined', | |
| 'player_left', | |
| 'car_update', | |
| 'race_countdown', | |
| 'race_start', | |
| 'race_standings', | |
| 'race_finish', | |
| 'checkpoint_ack', | |
| 'stats', | |
| ]; | |
| for (const evt of serverEvents) { | |
| socket.on(evt, data => emit(evt, data)); | |
| } | |
| } | |
| export function send(event, data) { | |
| if (socket) socket.emit(event, data); | |
| } | |
| export function on(event, fn) { | |
| if (!handlers[event]) handlers[event] = []; | |
| handlers[event].push(fn); | |
| } | |
| export function off(event, fn) { | |
| if (!handlers[event]) return; | |
| handlers[event] = handlers[event].filter(h => h !== fn); | |
| } | |
| export function getSocketId() { | |
| return socket?.id; | |
| } | |
| function emit(event, data) { | |
| const fns = handlers[event]; | |
| if (fns) fns.forEach(fn => fn(data)); | |
| } | |