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
if (data.uids.length === 1 && parseInt(data.uids[0], 10) === caller.uid) {
await messaging.leaveRoom([caller.uid], data.roomId);
await socketHelpers.removeSocketsFromRoomByUids([caller.uid], data.roomId);
return [];
}
await messaging.removeUsersFromRoom(caller.uid, data.uids, data.roomId);
await socketHelpers.removeSocketsFromRoomByUids(data.uids, data.roomId);
delete data.uids;
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));
};
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);

Loading…
Cancel
Save