import WebSocket from 'ws' import { RoomManager } from '../services/RoomManager.js' import { SocketAction } from '../types.js' export class MessageHandler { static handle( rawMessage: string, socket: WebSocket, roomManager: RoomManager ): void { let parsedData: any try { parsedData = JSON.parse(rawMessage) } catch (error) { console.error('Error parsing JSON:', error) socket.send(JSON.stringify({ error: 'Invalid JSON', status: 0 })) return } // Basic validation to ensure required fields exist if (!parsedData.room_id || !parsedData.username || !parsedData.action) { socket.send( JSON.stringify({ error: 'Missing fields: room_id, username, or action', status: 0, }) ) return } const { room_id, username, message } = parsedData let { new_username } = parsedData // Normalize action to ensure case-insensitivity matches logic const action = parsedData.action.toLowerCase() switch (action) { case SocketAction.JOIN: roomManager.joinRoom(room_id, username, socket) roomManager.broadcast( room_id, JSON.stringify({ message: `${username} has joined the ${room_id} chat!`, username: `${username}`, room_id: `${room_id}`, action: `join`, status: 1, }) ) break case SocketAction.LEAVE: const clientLeft = roomManager.leaveRoom(room_id, username) if (clientLeft) { roomManager.broadcast( room_id, JSON.stringify({ message: `${username} has left the ${room_id} chat!`, username: `${username}`, room_id: `${room_id}`, action: `leave`, status: 1, }) ) } break case SocketAction.RENAME: { if (!new_username) { socket.send( JSON.stringify({ message: `somebody tried to steal ${new_username}!`, username: username, room_id, action: 'rename', status: 0, }) ) return } const renamed = roomManager.renameUser( room_id, username, new_username, socket ) if (!renamed) { socket.send( JSON.stringify({ message: `somebody tried to steal ${new_username}!`, username: username, room_id, action: 'rename', status: 0, }) ) return } roomManager.broadcast( room_id, JSON.stringify({ message: `${username} is now known as ${new_username}`, username: new_username, old_username: username, room_id, action: 'rename', status: 1, }) ) break } case SocketAction.MESSAGE: roomManager.broadcast( room_id, JSON.stringify({ message: `${message}`, username: `${username}`, room_id: `${room_id}`, action: `message`, status: 1, }) ) break default: socket.send( JSON.stringify({ error: `Unknown action: ${action}`, status: 0, }) ) break } } }