@jeruthadam
Я крут

Как изолировать ивент для определенного юзера?

Использую вебсокеты и ws.

В обычном случае, ws это отдельное конкретное соединение, т.е. этот код посылает ответ непосредственно отправителю

wss.on('connection', ws => {
  ws.on('message', message => {
    const { event, payload } = message;
    ws.send(payload);
  });
})


Пробую сделать систему подписок используя EventEmitter, и таким образом сообщенеи уходит вообще всем соединениям

const EventEmitter = require('events');
const pubsub = new EventEmitter();

wss.on('connection', ws => {
  pubsub.on('test', payload => {
    ws.send(payload);
  });
  ws.on('message', message => {
    const { event, payload } = message;
    pubsub.emit(event, payload);
  });
})


Соответвенно, как только отрабатывает ивент рассылается по всем ws.

А как ограничить в данном случае?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
spoiler
const EventEmitter = require('events');
const pubsub = new EventEmitter();

wss.on('connection', ws => {
  pubsub.on('test', (payload, _ws) => {
    if (_ws !== ws) {
      return;
    }
    ws.send(payload);
  });
  ws.on('message', message => {
    const { event, payload } = message;
    pubsub.emit(event, payload, ws);
  });
})


const EventEmitter = require('events');
const pubsub = new EventEmitter();

wss.on('connection', ws => {
  ws.on('message', message => {
    const { event, payload } = message;
    pubsub.emit(event, payload, ws);
  });
});

 pubsub.on('test', (payload, _ws) => {
   _ws.send(payload);
});


const EventEmitter = require('events');
const pubsub = new EventEmitter();

wss.on('connection', ws => {
  ws.on('message', message => {
    const { event, payload } = message;
    pubsub.emit(event, { payload, ws });
  });
});

 pubsub.on('test', ({ payload, ws }) => {
   ws.send(payload);
});


const EventEmitter = require('events');
const pubsub = new EventEmitter();

wss.on('connection', ws => {
  ws.on('message', message => {
    const { event, payload } = message;
    pubsub.emit(event, payload, outcome => ws.send(outcome));
  });
});

 pubsub.on('test', (payload, send) => {
   send(payload);
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы