diff --git a/src/api/chats.js b/src/api/chats.js index 2d9c31a1fe..1df828075d 100644 --- a/src/api/chats.js +++ b/src/api/chats.js @@ -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); }; diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 4dd3a31dd4..36b3384d24 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -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);