implemented timeoutManager, a more efficient solution for managing timeouts in RAM memory. this resolves the problem of lingering timeouts in the server, providing faster removal of old timeouts and improving overall performance.
58 lines
2.0 KiB
JavaScript
58 lines
2.0 KiB
JavaScript
const { getRoom, updateRoom } = require('../services/roomService');
|
|
const { COLORS } = require('../utils/constants');
|
|
|
|
module.exports = socket => {
|
|
const req = socket.request;
|
|
|
|
const handleLogin = async data => {
|
|
const room = await getRoom(data.roomId);
|
|
if (room.isFull()) return socket.emit('error:changeRoom');
|
|
if (room.started) return socket.emit('error:changeRoom');
|
|
if (room.private && room.password !== data.password) return socket.emit('error:wrongPassword');
|
|
addPlayerToExistingRoom(room, data);
|
|
};
|
|
|
|
const handleExit = async () => {
|
|
req.session.reload(err => {
|
|
if (err) return socket.disconnect();
|
|
req.session.destroy();
|
|
socket.emit('redirect');
|
|
});
|
|
};
|
|
|
|
const handleReady = async () => {
|
|
const room = await getRoom(req.session.roomId);
|
|
room.getPlayer(req.session.playerId).changeReadyStatus();
|
|
if (room.canStartGame()) {
|
|
room.startGame();
|
|
}
|
|
await updateRoom(room);
|
|
};
|
|
|
|
const addPlayerToExistingRoom = async (room, data) => {
|
|
room.addPlayer(data.name);
|
|
if (room.isFull()) {
|
|
room.startGame();
|
|
}
|
|
await updateRoom(room);
|
|
reloadSession(room);
|
|
};
|
|
|
|
// Since it is not bound to an HTTP request, the session must be manually reloaded and saved
|
|
const reloadSession = room => {
|
|
req.session.reload(err => {
|
|
if (err) return socket.disconnect();
|
|
req.session.roomId = room._id.toString();
|
|
req.session.playerId = room.players[room.players.length - 1]._id.toString();
|
|
req.session.color = COLORS[room.players.length - 1];
|
|
req.session.save();
|
|
socket.join(room._id.toString());
|
|
socket.emit('player:data', JSON.stringify(req.session));
|
|
});
|
|
};
|
|
|
|
socket.on('player:login', handleLogin);
|
|
socket.on('player:ready', handleReady);
|
|
socket.on('player:exit', handleExit);
|
|
};
|