const WebSocket = require('ws'); const http = require('http'); const url = require('url');
const server = http.createServer(); const wss = new WebSocket.Server({ server });
const rooms = new Map(); const users = new Map();
wss.on('connection', (ws, req) => { const parsedUrl = url.parse(req.url, true); const userId = parsedUrl.query.userId; const roomId = parsedUrl.query.roomId;
if (userId && roomId) { users.set(userId, { ws, roomId }); if (!rooms.has(roomId)) { rooms.set(roomId, new Set()); } rooms.get(roomId).add(userId);
broadcastToRoom(roomId, { type: 'user_joined', userId, timestamp: new Date().toISOString() });
ws.send(JSON.stringify({ type: 'room_users', users: Array.from(rooms.get(roomId)) })); }
ws.on('message', (message) => { try { const data = JSON.parse(message); switch (data.type) { case 'chat_message': handleChatMessage(userId, roomId, data); break; case 'typing': handleTyping(userId, roomId, data); break; case 'stop_typing': handleStopTyping(userId, roomId, data); break; } } catch (error) { console.error('Error parsing message:', error); } });
ws.on('close', () => { if (userId) { const user = users.get(userId); if (user && user.roomId) { rooms.get(user.roomId).delete(userId); broadcastToRoom(user.roomId, { type: 'user_left', userId, timestamp: new Date().toISOString() }); } } }); });
function handleChatMessage(userId, roomId, data) { const message = { type: 'chat_message', userId, username: data.username, content: data.content, timestamp: new Date().toISOString() };
broadcastToRoom(roomId, message); }
function handleTyping(userId, roomId, data) { const typingMessage = { type: 'typing', userId, username: data.username, timestamp: new Date().toISOString() };
broadcastToRoom(roomId, typingMessage, userId); }
function handleStopTyping(userId, roomId, data) { const stopTypingMessage = { type: 'stop_typing', userId, timestamp: new Date().toISOString() };
broadcastToRoom(roomId, stopTypingMessage, userId); }
function broadcastToRoom(roomId, message, excludeUserId) { const roomUsers = rooms.get(roomId); if (roomUsers) { roomUsers.forEach(userId => { if (userId !== excludeUserId) { const user = users.get(userId); if (user && user.ws.readyState === WebSocket.OPEN) { user.ws.send(JSON.stringify(message)); } } }); } }
const PORT = process.env.PORT || 8080; server.listen(PORT, () => { console.log(`WebSocket server running on port ${PORT}`); });
|