Здравствуйте. Разбираюсь с socket.io, пишу чат наподобие слака или дискорда. Где пользователь подключен к множеству комнат/каналов. Изучил доку и кучу туториалов, нашел много примеров с чатами но все они довольно примитивные. С помощью rooms не получается реализовать так как при подключении и join, socket.id у пользователя для всех комнат одинаковый и при emit сообщения с сервера оно попадает во все комнаты. В таком случае не совсем понятен смысл rooms.
Возможно мне надо использовать namespaces? Что я делаю не так?
UPD:
clientconst rooms = [{...}, {...}];
this.socket.on('connect', () => {
rooms.forEach((room) => {
this.socket.emit('join', {user, room});
});
});
serverio.on('connection', (socket) => {
console.log('New user connected');
// Join
socket.on('join', ({ user, room }) => {
socket.join(room.id);
users.removeUser(`${user.name}_${room.id}`);
users.addUser(`${user.name}_${room.id}`, user.name, room.id);
});
// Chatting
socket.on('message', async ({user, room, message}) => {
await db.query('INSERT INTO messages SET ?', { userId: user.id, roomId: room.id, text: message});
socket.broadcast.to(room.id).emit('message', { room, user, text: message });
});
socket.on('disconnect', () => {
users.removeUser(socket.id);
});
});
Вот список юзеров после коннекта:
[ { id: 'Pavel_1', name: 'Pavel', room: 1 },
{ id: 'Max_1', name: 'Max', room: 1 },
{ id: 'Max_2', name: 'Max', room: 2 },
{ id: 'Pavel_2', name: 'Pavel', room: 2 } ]
При отправке сообщение от Pavel в room 2, сообщение прилетает во все комнаты. Получается, мне надо на клиенте когда я слушаю новые сообщения, проверять если это прилетело из текущей комнаты то показывать сообщение? Тогда не понятно зачем нужны rooms.