redis-emitter.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // @ts-ignore
  2. const NRP = require('node-redis-pubsub')
  3. /**
  4. * This class simulates the builtin events.EventEmitter but with the use of redis.
  5. * This is useful for when companion is running on multiple instances and events need
  6. * to be distributed across.
  7. */
  8. class RedisEmitter extends NRP {
  9. /**
  10. *
  11. * @param {string} redisUrl redis URL
  12. */
  13. constructor (redisUrl) {
  14. // @ts-ignore
  15. super({ url: redisUrl })
  16. }
  17. /**
  18. * Add a one-off event listener
  19. * @param {string} eventName name of the event
  20. * @param {function} handler the handler of the event
  21. */
  22. once (eventName, handler) {
  23. let removeListener
  24. removeListener = this.on(eventName, (message) => {
  25. handler(message)
  26. removeListener()
  27. })
  28. }
  29. /**
  30. * Announce the occurence of an event
  31. * @param {string} eventName name of the event
  32. * @param {object} message the message to pass along with the event
  33. */
  34. emit (eventName, message) {
  35. return super.emit(eventName, message || {})
  36. }
  37. /**
  38. * Remove an event listener
  39. * @param {string} eventName name of the event
  40. * @param {function} handler the handler of the event to remove
  41. */
  42. removeListener (eventName, handler) {
  43. this.receiver.removeListener(eventName, handler)
  44. this.receiver.punsubscribe(this.prefix + eventName)
  45. }
  46. /**
  47. * Remove all listeners of an event
  48. * @param {string} eventName name of the event
  49. */
  50. removeAllListeners (eventName) {
  51. this.receiver.removeAllListeners(eventName)
  52. this.receiver.punsubscribe(this.prefix + eventName)
  53. }
  54. }
  55. module.exports = (redisUrl) => {
  56. return new RedisEmitter(redisUrl)
  57. }