50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import {
|
|
IncomingMessage,
|
|
Server,
|
|
ServerResponse
|
|
} from 'http';
|
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
import { connectedUsers } from './state';
|
|
import { broadcastToServer } from './broadcast';
|
|
import { handleWebSocketMessage } from './handler';
|
|
|
|
export function setupWebSocket(server: Server<typeof IncomingMessage, typeof ServerResponse>): void {
|
|
const wss = new WebSocketServer({ server });
|
|
|
|
wss.on('connection', (ws: WebSocket) => {
|
|
const connectionId = uuidv4();
|
|
|
|
connectedUsers.set(connectionId, { oderId: connectionId, ws, serverIds: new Set() });
|
|
|
|
ws.on('message', (data) => {
|
|
try {
|
|
const message = JSON.parse(data.toString());
|
|
|
|
handleWebSocketMessage(connectionId, message);
|
|
} catch (err) {
|
|
console.error('Invalid WebSocket message:', err);
|
|
}
|
|
});
|
|
|
|
ws.on('close', () => {
|
|
const user = connectedUsers.get(connectionId);
|
|
|
|
if (user) {
|
|
user.serverIds.forEach((sid) => {
|
|
broadcastToServer(sid, {
|
|
type: 'user_left',
|
|
oderId: user.oderId,
|
|
displayName: user.displayName,
|
|
serverId: sid
|
|
}, user.oderId);
|
|
});
|
|
}
|
|
|
|
connectedUsers.delete(connectionId);
|
|
});
|
|
|
|
ws.send(JSON.stringify({ type: 'connected', connectionId, serverTime: Date.now() }));
|
|
});
|
|
}
|