Spaces:
Running
Running
| 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 | |
| } | |
| } | |
| } | |