Guest User

Untitled

a guest
Oct 17th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. const redis = require('redis');
  2. const { EventEmitter } = require('events');
  3. const { promisify } = require('util');
  4.  
  5. class RedisEventEmitter extends EventEmitter {
  6. /**
  7. * @param {string} namespace
  8. * @param {boolean} isReceveMode
  9. * @param {{host: string, port: number}} redisOptions
  10. */
  11. constructor(namespace, isReceveMode, redisOptions = { host: 'localhost', port: 6379 }) {
  12. super();
  13. this.namespace = namespace;
  14. this._isReceveMode = isReceveMode;
  15. this._redis = redis.createClient(redisOptions);
  16. this._redis.on('error', (err) => {
  17. throw new Error(`[RedisEventEmitter] ${String(err)}`);
  18. });
  19. if (this._isReceveMode) {
  20. this._redis.on('message', (namespace, json) => {
  21. let event;
  22. try {
  23. event = JSON.parse(json);
  24. }
  25. catch (err) {
  26. console.warn('recieved redis event is not json format.');
  27. return;
  28. }
  29. if (event.event == null || event.data == null) {
  30. return;
  31. }
  32. super.emit(event.event, event.data);
  33. });
  34. this._redis.subscribe(this.namespace, (err) => {
  35. if (err) {
  36. throw new Error('[RedisEventEmitter] failed to subscribe');
  37. }
  38. });
  39. }
  40. }
  41. async emit(event, data) {
  42. if (this._isReceveMode) {
  43. throw new Error('emit is disable. this RedisEventEmitter is recieve mode.');
  44. }
  45. /** @type {(channel: string, value: string) => Promise<boolean>} */
  46. const publish = promisify(this._redis.publish).bind(this._redis);
  47. await publish(this.namespace, JSON.stringify({ event, data }));
  48. }
  49. async dispose() {
  50. const quit = promisify(this._redis.quit).bind(this._redis);
  51. const unsubscribe = promisify(this._redis.unsubscribe).bind(this._redis);
  52. if (this._isReceveMode) {
  53. await unsubscribe(this.namespace);
  54. this.removeAllListeners();
  55. }
  56. if (this._redis.connected) {
  57. await quit();
  58. }
  59. this._redis.removeAllListeners();
  60. }
  61. }
  62. module.exports = RedisEventEmitter;
Add Comment
Please, Sign In to add comment