fix: on leave/kick remove matching sockets from rooms

isekai-main
Barış Soner Uşaklı 2 years ago
parent 640e32d49c
commit a766f74f0e

@ -228,10 +228,11 @@ chatsAPI.kick = async (caller, data) => {
// Additional checks if kicking vs leaving // Additional checks if kicking vs leaving
if (data.uids.length === 1 && parseInt(data.uids[0], 10) === caller.uid) { if (data.uids.length === 1 && parseInt(data.uids[0], 10) === caller.uid) {
await messaging.leaveRoom([caller.uid], data.roomId); await messaging.leaveRoom([caller.uid], data.roomId);
await socketHelpers.removeSocketsFromRoomByUids([caller.uid], data.roomId);
return []; return [];
} }
await messaging.removeUsersFromRoom(caller.uid, data.uids, data.roomId); await messaging.removeUsersFromRoom(caller.uid, data.uids, data.roomId);
await socketHelpers.removeSocketsFromRoomByUids(data.uids, data.roomId);
delete data.uids; delete data.uids;
return chatsAPI.users(caller, data); return chatsAPI.users(caller, data);
}; };

@ -196,4 +196,19 @@ SocketHelpers.emitToUids = async function (event, data, uids) {
uids.forEach(toUid => websockets.in(`uid_${toUid}`).emit(event, data)); uids.forEach(toUid => websockets.in(`uid_${toUid}`).emit(event, data));
}; };
SocketHelpers.removeSocketsFromRoomByUids = async function (uids, roomId) {
const sockets = _.flatten(
await Promise.all(uids.map(uid => websockets.in(`uid_${uid}`).fetchSockets()))
);
for (const s of sockets) {
if (s.rooms.has(`chat_room_${roomId}`)) {
websockets.in(s.id).socketsLeave(`chat_room_${roomId}`);
}
if (s.rooms.has(`chat_room_public_${roomId}`)) {
websockets.in(s.id).socketsLeave(`chat_room_public_${roomId}`);
}
}
};
require('../promisify')(SocketHelpers); require('../promisify')(SocketHelpers);

Loading…
Cancel
Save