Возврат объекта, который может только получать события, но не испускать

Извините, если это дубликат, я часами искал в Интернете и ничего не нашел, поэтому решил опубликовать здесь.

Я разрабатываю модуль для node.js, который должен иметь дело с соединениями сокетов. Я хочу создать функцию, которая возвращает объект пользователю, который затем будет получать события, на которые пользователь может установить прослушиватели. Однако я хочу сделать это так, чтобы пользователь не мог генерировать события для этого объекта. Вместо этого я хочу, чтобы функция emit в моем эмиттере событий была перезаписана моей собственной функцией.

По сути, я хочу вернуть объект, который получает события и имеет функцию под названием «испускать», которая действует как любая обычная функция.

Вот небольшой пример того, что я имею в виду:

var events = require('events');

var out = (function(){
  var obj = new events.EventEmitter();

  // I used nextTick to emulate the asyncrounes nature of the socket server
  process.nextTick(function(){

    obj.emit('Message', "Dummy socket message") // This will be triggered when a message is sent to the socket server
  })

  return obj;
})();


out.on('Message', function(msg){
  console.log(msg)
  out.emit("newWork", "New instructions")
  // Im trying to make it work so that this would not throw the event emitter into an infinite loop
});

Теперь, в части out.on("Message", function..., я хочу, чтобы пользователь мог писать out.emit("dummy", "dummy data") и мог вызывать мою собственную функцию emit, которая что-то делает с предоставленными входными данными.

Как мне это сделать?

Я знаю, что это должно быть как-то возможно, поскольку socket.io делает именно это. Вот небольшой фрагмент кода с socket.io

socket.on('test', function(){
  console.log("called!")
})

socket.emit("test")

Когда я запускаю это, оно не срабатывает само по себе. Кажется, что функция emit перезаписана чем-то другим, но объект сокета по-прежнему получает события, которые каким-то образом испускаются изнутри.

Надеюсь, что моего объяснения было достаточно. Заранее спасибо!

Редактировать: я знаю, что использование (function() { ... })() - это не способ создания модулей. Я использую здесь просто для того, чтобы упростить иллюстрацию, поскольку концепция остается неизменной с этим подходом.


person Taavi    schedule 14.12.2015    source источник


Ответы (1)


Думаю, я разобрался сам.

Я перезапишу функцию emit в новом экземпляре EventEmitter, который я создаю, используя свою собственную функцию, и вместо этого буду использовать функцию из EventEmitter.prototype. Таким образом, я могу отправить свой объект обратно пользователю с помощью пользовательской функции отправки, но при этом иметь возможность генерировать события для этого объекта из моего модуля.

Вот небольшая демонстрация, которую я написал, пытаясь понять это.

var events = require('events').EventEmitter;
obj = new events();

obj.emit = function(name, data){
  console.log("Received: name - " + name + "; data - " + data);
}

function emitOnObj(obj, name, msg){
  events.prototype.emit.call(obj, name, msg);
}

Это выглядит довольно хорошо для меня, но если есть лучший способ сделать это, то я весь внимание :)

person Taavi    schedule 14.12.2015