Итак, я только начал изучать / использовать сокеты.
Моя идея состояла в том, чтобы сделать класс из сокета, так как им легче (по крайней мере, мне) управлять ими через экземпляры этого класса.
Мой пример кода:
const io = require('socket.io')();
const redis = require('socket.io-redis');
const util = require('util');
const adapter = redis({ host: 'localhost', port: 6379 });
io.adapter(adapter);
const ioa = io.of('/').adapter;
ioa.clients = util.promisify(ioa.clients);
ioa.clientRooms = util.promisify(ioa.clientRooms);
ioa.remoteJoin = util.promisify(ioa.remoteJoin);
ioa.remoteLeave = util.promisify(ioa.remoteLeave);
ioa.customRequest = util.promisify(ioa.customRequest);
io.on('connect', (socket) => {
const s = new Socket(socket)
})
class Socket {
constructor(socket) {
this.socket = socket;
this.id = socket.id;
this.user = null;
this.connected();
this.listen();
}
listen() {
this.socket.on('send message', (data) => this.sendMessage(data));
this.socket.on('disconnect', () => this.disconnect());
this.socket.on('authenticate', (data) => this.authenticate(data));
this.socket.on('join room', (data) => this.joinRoom(data));
this.socket.on('get my rooms', () => this.getMyRooms());
}
async connected() {
const clients = await ioa.clients();
io.emit('currentUsersCount', clients.length);
io.emit('connectedUsers', clients);
}
authenticate(data) {
}
sendMessage(data) {
const message = {
sender: this.id,
message: data.message
};
this.socket.broadcast.emit('send message', message)
}
async getMyRooms() {
const rooms = await ioa.clientRooms(this.id);
this.socket.emit('get my rooms', rooms)
}
async joinRoom({ id }) {
await ioa.remoteJoin(this.id, id);
this.socket.emit('console', `You have joined room: ${id}`)
this.socket.to(id).emit('console', `${this.id} has joined ${id}`)
}
async leaveRoom(id) {
}
async disconnect() {
const clients = await ioa.clients();
io.emit('currentUsersCount', clients.length);
io.emit('connectedUsers', clients)
}
}
module.exports = io;
Также мне понадобился адаптер redis, так как приложение будет в кластерном режиме.
У меня также есть метод authenticate, где я буду аутентифицировать пользователей и помещать объект пользователя (который будет храниться в монго) внутри класса сокета, в переменную this.user.
Теперь мой вопрос: поскольку у меня есть все эти экземпляры класса Socket, и одному пользователю нужно отправить сообщение другому, мне нужно найти сокет, соответствующий этому пользователю.Как мне это сделать?