您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

EventEmitterForwarder.js 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /**
  2. * Implements utility to forward events from one eventEmitter to another.
  3. * @param src {object} instance of EventEmitter or another class that implements
  4. * addListener method which will register listener to EventEmitter instance.
  5. * @param dest {object} instance of EventEmitter or another class that
  6. * implements emit method which will emit an event.
  7. */
  8. function EventEmitterForwarder(src, dest) {
  9. if (!src || !dest || typeof src.addListener !== 'function'
  10. || typeof dest.emit !== 'function') {
  11. throw new Error('Invalid arguments passed to EventEmitterForwarder');
  12. }
  13. this.src = src;
  14. this.dest = dest;
  15. this.listeners = new Map();
  16. }
  17. /**
  18. * Adds event to be forwarded from src to dest.
  19. * @param srcEvent {string} the event that EventEmitterForwarder is listening
  20. * for.
  21. * @param dstEvent {string} the event that will be fired from dest.
  22. * @param arguments all other passed arguments are going to be fired with
  23. * dstEvent.
  24. */
  25. EventEmitterForwarder.prototype.forward = function(...args) {
  26. const srcEvent = args[0];
  27. // This will be the "this" value for emit function.
  28. args[0] = this.dest;
  29. // Using bind.apply to pass the arguments as Array-like object ("arguments")
  30. const newListener = Function.prototype.bind.apply(this.dest.emit, args);
  31. this.src.addListener(srcEvent, newListener);
  32. this.listeners.set(srcEvent, newListener);
  33. };
  34. /**
  35. * Clears the listeners for the supplied events.
  36. *
  37. * @param args all the events which listeners to be cleaned.
  38. */
  39. EventEmitterForwarder.prototype.removeListeners = function(...args) {
  40. args.forEach(a => {
  41. const l = this.listeners.get(a);
  42. if (l) {
  43. this.src.removeListener(a, l);
  44. this.listeners.delete(a);
  45. }
  46. });
  47. };
  48. module.exports = EventEmitterForwarder;