websocket-chat / src /handlers /MessageHandler.ts
harsh-dev's picture
rename fix
3a72b90 unverified
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
}
}
}