Существует ли событие для socket /io ack / response? - PullRequest
0 голосов
/ 30 ноября 2018

Я использую socket.io и выражаю оба с пером.Для сбора метрик я пытаюсь захватить обходы для запросов, сделанных как через Express, так и через socket.io.

С экспресс-связью легко работать с промежуточным программным обеспечением Express.

Я могу пойматьsocket.io входящий запрос через socket.use:

const app = express(feathers());
... (set up feathers services etc.)

app.configure(socketio(function(io) {
  io.use(function(socket, next) {
    socket.use((packet, next) => {
      ... (extract the verb and pathing info from the packet)
      next();
    });
    next();
  });
});

Однако я не могу найти эквивалент socket.use на стороне исходящего / подтверждения.Внутри engine.io есть некоторые события, но я не могу получить к ним доступ.

Я действительно пытаюсь найти эквивалентный набор событий, генерируемых для каждого запроса / ответа (последний эквивалентен finish в экспресс).

Я не могу использовать здесь события подключения / отключения;Я хочу захватить каждый запрос, сделанный через сокет , и ответы, отправленные для них , независимо от службы и модуля перьев.

Перехватчики Feathers.js могут использоваться для этого, но это будеттребуется передать кучу контекста из промежуточного программного обеспечения socket.io в перья, чего я надеялся не делать.

Кто-нибудь знает способ сделать это?

1 Ответ

0 голосов
/ 04 декабря 2018

В случае, если кто-нибудь придет сюда в поисках способа сделать это, я не уверен, почему я не подумал об этом раньше.

Входящий пакет (доступный в socket.use) будет включатьфункция как его последний параметр, если он должен быть подтвержден.

Работает обертывание последней функции для введения моей собственной логики.

псевдокод

socket.use((packet, next) => {
  const id = uuidv4();

  console.log(`start of request: ${id}`);

  const cb = packet[packet.length - 1];
  if (typeof cb === 'function') {
    packet[packet.length - 1] = function() {
      const [err, data] = arguments;
      console.log(`end of request: ${id}`);
      if (err) {
        console.error(err);
      }
      cb(err, data);
    };
  };
  next();
});
...