Socket.IO: Найти сокет пользователя - PullRequest
0 голосов
/ 11 февраля 2019

Итак, я только начал изучать / использовать сокеты.

Моя идея состояла в том, чтобы сделать класс из сокета, так как им легче (по крайней мере, мне) управлять ими через экземпляры этого класса.

Мой пример кода:

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, и одному пользователю нужно отправить сообщение другому, мне нужно найти сокет, соответствующий этому пользователю.Как мне это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...