Добавить идентификатор в websocket

#websocket #socket.io #ws

#websocket #socket.io #ws

Вопрос:

Я использую Node.js ws библиотека, для прослушивания событий в учетных записях пользователей на стороннем API. Для каждого пользователя я открываю websocket для прослушивания событий в учетной записи пользователя.

Оказывается, сторонний API не предоставляет a userID для каждого события, поэтому, если у меня есть 10 подключений websocket к учетным записям пользователей, я не могу определить, с какой учетной записи пришло событие.

У меня есть доступ к уникальному userId идентификатору перед запуском каждого из моих подключений.

Есть ли способ добавить или обернуть соединение websocket userId идентификатором к каждому соединению, которое я создаю, чтобы при получении события я мог получить доступ к пользовательскому идентификатору и впоследствии узнать, из какой учетной записи пользователя пришло событие?

Приведенный ниже код представляет собой смесь реального кода и псевдокода (т.е. customSocket )

 const ws = new WebSocket('wss://thirdparty-api.com/accounts', {
  port: 8080,
});

ws.send(
    JSON.stringify({
      action: 'authenticate',
      data: {
        oauth_token: access_token,
      },
    })
  );
  // wrap and attach data here (pseudocode at top-level)
  customSocket.add({userId,
    ws.send(
      JSON.stringify({
        action: 'listen',
        data: {
          streams: ['action_updates'],
        },
      })
    )
  })

// listen for wrapper data here, pseudocode at top level
customSocket.emit((customData) {
  ws.on('message', function incoming(data) {
    console.log('incoming -> data', data.toString());
  })
    console.log('emit -> customData', customData);
})
  

Глядя на socket.io библиотеку, эта namespace функция может решить эту проблему, но я не могу определить, правда это или нет. Ниже приведен пример в их документации:

 // your application has multiple tenants so you want to dynamically create one namespace per tenant

const workspaces = io.of(/^/w $/);

workspaces.on('connection', socket => {
  const workspace = socket.nsp;

  workspace.emit('hello');
});

// this middleware will be assigned to each namespace
workspaces.use((socket, next) => {
  // ensure the user has access to the workspace
  next();
});
  

Ответ №1:

Я нашел решение этой проблемы, которое довольно простое. Сначала создайте функцию обработчика сообщений:

 const eventHandler = (uid, msg) => {
  console.log(`${uid} did ${msg}`);
};
  

Затем, когда вы создаете websocket для данного пользователя, оберните .on событие обработчиком:

 const createSocketForUser = (uid, eventHandler) => {
  const socket = new WebSocket(/* ... */);
  socket.onmessage = (msg) => {
    eventHandler(uid, msg)
  };
  return socket;
}