Как найти пользовательский сокет в кластере процессов socketio, управляемых socketio-redis - PullRequest
0 голосов
/ 19 сентября 2019

Я новичок в адаптере socketio-redis.Первоначально у меня был один процесс socketio, но теперь я пробовал кластер socketio.

Когда это был один процесс, я поддерживал карту подключенных сокетов, чтобы найти сокет по идентификатору пользователя.Когда пользователь A выходит в комнату, если пользователь B был подключен, но еще не был в комнате, розетка B была найдена и присоединилась к этой комнате.Затем розетка А излучается в комнату.

Мой вопрос: как это сделать с помощью socketio-redis?

Ниже приведен упрощенный план.Можно ли добавить userId в сокет при подключении в одном процессе socketio, а затем найти этот сокет по userId в другом процессе?

chatio.on('connect', socket => {
  // add userId to socket obj
  socket.userId = userId
  . . .
  socket.on("message", async (data, ack) => {
    const userId  = data.otherUserId
    const roomId  = data.roomId
    const message = data.message
    const clients = await io.of('/').adapter.clients()

    // a message came in from user A
    // if user B socket is found, B joins same room
    const otherUserSocket = clients.find(socketId => {
      const s = io.of('/').adapter.connected[socketId]
      return (s.userId == userId)
    })

    if (otherUserSocket) {
      otherUserSocket.join(roomId)
      socket.to(roomId).emit("message", { message })
    }
  }
})

Кто-нибудь имеет опыт реализации чего-то подобного?

...