Source

event/AdmEventEmitter.js

  1. "use strict"
  2. /**
  3. * ----------------------------------------------------------------------------------------------
  4. * Class AdmEventEmitter - Handling app events
  5. * ----------------------------------------------------------------------------------------------
  6. */
  7. class AdmEventEmitter {
  8. /**
  9. * Create a EventEmitter instance.
  10. */
  11. constructor() {
  12. this._events = {};
  13. }
  14. /**
  15. * Add an event listener.
  16. * @param {string} name - Event name
  17. * @param {Function} listener - Event handler
  18. * @return {object} The emitter instance
  19. */
  20. addListener(name, listener) {
  21. if (!this._events[name]) {
  22. this._events[name] = [];
  23. }
  24. this._events[name].push(listener);
  25. return this;
  26. }
  27. /**
  28. * Remove a route.
  29. * @param {string} name - Event name
  30. * @param {Function} listener - Event handler
  31. * @return {object} The emitter instance
  32. */
  33. removeListener(name, listener) {
  34. if (!this._events[name]) {
  35. throw new Error(`EventEmitter:removeListener - Can't remove a listener. Event "${name}" doesn't exits.`);
  36. }
  37. const filterListeners = (item) => item !== listener;
  38. this._events[name] = this._events[name].filter(filterListeners);
  39. }
  40. /**
  41. * emit a route.
  42. * @param {string} name - Event name
  43. * @param {anonym} data - Event data
  44. */
  45. emit(name, data) {
  46. if (!this._events[name]) {
  47. throw new Error(`EventEmitter:emit - Can't emit an event. Event "${name}" doesn't exits.`);
  48. }
  49. const fireCallbacks = (callback) => {
  50. callback(data);
  51. };
  52. this._events[name].forEach(fireCallbacks);
  53. }
  54. }
  55. export { AdmEventEmitter };