module.exports = io => { io.on('connection', async socket => { console.log(`A socket connection to the server has been made: ${socket.id}`) socket.join('#chat', () => { sendAllRooms() sendAllUsers() send_rooms() send_user_rooms() }) socket.on('message', message => { console.log(`send a message to room ${message.room}: ${message}`) io.of(message.room).emit('message', message) }) socket.on('get all users', () => { console.log('get all users') sendAllUsers() }) socket.on('get my rooms', () => { console.log('get my rooms') sendAllRooms() }) socket.on('join', roomName => { console.log('join:', roomName) socket.join(roomName, () => { sendAllRooms() send_user_rooms() }) }) socket.on('part', () => { console.log('part') }) socket.on('get all rooms', () => sendAllRooms()) socket.on('join', payload => { console.log(payload.room) socket.join(payload.room, () => { socket.emit('got user rooms', Object.keys(socket.rooms)) send_rooms() send_user_rooms() }) }) const sendAllRooms = () => { console.log('get all rooms') const allRooms = Object.keys(io.sockets.adapter.rooms) .filter(r => r[0] === '#') .map(k => ({ roomName: k, sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), })) io.emit('got all rooms', allRooms) } const sendAllUsers = () => socket.emit('got all users', Object.keys(io.sockets.sockets)) socket.on('disconnect', async () => { io.emit('user disconnected', { socketId: socket.id }) console.log(`${socket.id} has disconnected.`) send_rooms() }) io.emit('received users', Object.keys(io.sockets.sockets)) function send_rooms() { io.emit( 'received rooms', Object.keys(io.sockets.adapter.rooms) .filter(r => r[0] === '#') .map(k => ({ roomName: k, sockets: Object.keys(io.sockets.adapter.rooms[k]['sockets']), })) ) } function send_user_rooms() { console.log(socket.rooms) socket.emit( 'received my rooms', Object.keys(io.sockets.adapter.rooms).map(k => ({ roomName: k, sockets: io.sockets.adapter.rooms[k]['sockets'], })) ) } }) }