diff --git a/src/pubsub.js b/src/pubsub.js index 1a141101c..d86271f9c 100644 --- a/src/pubsub.js +++ b/src/pubsub.js @@ -1,36 +1,41 @@ -'use strict'; - -const EventEmitter = require('events'); -const nconf = require('nconf'); - +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reset = exports.removeAllListeners = exports.on = exports.publish = void 0; +const events_1 = require("events"); +const nconf_1 = __importDefault(require("nconf")); let real; let noCluster; let singleHost; - function get() { if (real) { return real; } - let pubsub; - - if (!nconf.get('isCluster')) { + if (!nconf_1.default.get('isCluster')) { if (noCluster) { real = noCluster; return real; } - noCluster = new EventEmitter(); + noCluster = new events_1.EventEmitter(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call noCluster.publish = noCluster.emit.bind(noCluster); pubsub = noCluster; - } else if (nconf.get('singleHostCluster')) { + } + else if (nconf_1.default.get('singleHostCluster')) { if (singleHost) { real = singleHost; return real; } - singleHost = new EventEmitter(); + singleHost = new events_1.EventEmitter(); if (!process.send) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call singleHost.publish = singleHost.emit.bind(singleHost); - } else { + } + else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call singleHost.publish = function (event, data) { process.send({ action: 'pubsub', @@ -40,32 +45,41 @@ function get() { }; process.on('message', (message) => { if (message && typeof message === 'object' && message.action === 'pubsub') { + // eslint-disable-next-line max-len + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call singleHost.emit(message.event, message.data); } }); } pubsub = singleHost; - } else if (nconf.get('redis')) { + } + else if (nconf_1.default.get('redis')) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment pubsub = require('./database/redis/pubsub'); - } else { + } + else { throw new Error('[[error:redis-required-for-pubsub]]'); } - real = pubsub; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return return pubsub; } - -module.exports = { - publish: function (event, data) { - get().publish(event, data); - }, - on: function (event, callback) { - get().on(event, callback); - }, - removeAllListeners: function (event) { - get().removeAllListeners(event); - }, - reset: function () { - real = null; - }, -}; +function publish(event, data) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().publish(event, data); +} +exports.publish = publish; +function on(event, callback) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().on(event, callback); +} +exports.on = on; +function removeAllListeners(event) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().removeAllListeners(event); +} +exports.removeAllListeners = removeAllListeners; +function reset() { + real = null; +} +exports.reset = reset; diff --git a/src/pubsub.ts b/src/pubsub.ts new file mode 100644 index 000000000..dfcb0c04c --- /dev/null +++ b/src/pubsub.ts @@ -0,0 +1,87 @@ +import { EventEmitter } from 'events'; + +import nconf from 'nconf'; + +let real; +let noCluster; +let singleHost; +interface PubSubMessage { + action: string; + event: string; + data: unknown; +} +function get() { + if (real) { + return real as string; + } + + let pubsub; + + if (!nconf.get('isCluster')) { + if (noCluster) { + real = noCluster as string; + return real as string; + } + noCluster = new EventEmitter(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + noCluster.publish = noCluster.emit.bind(noCluster) as string[]; + pubsub = noCluster as string[]; + } else if (nconf.get('singleHostCluster')) { + if (singleHost) { + real = singleHost as string; + return real as string; + } + singleHost = new EventEmitter(); + if (!process.send) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + singleHost.publish = singleHost.emit.bind(singleHost) as string[]; + } else { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + singleHost.publish = function (event, data) { + process.send({ + action: 'pubsub', + event: event as string, + data: data as string, + }); + }; + process.on('message', (message: PubSubMessage) => { + if (message && typeof message === 'object' && message.action === 'pubsub') { + // eslint-disable-next-line max-len + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + singleHost.emit(message.event, message.data); + } + }); + } + pubsub = singleHost as string; + } else if (nconf.get('redis')) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + pubsub = require('./database/redis/pubsub'); + } else { + throw new Error('[[error:redis-required-for-pubsub]]'); + } + + real = pubsub as string; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return pubsub; +} +function publish(event, data) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().publish(event, data) as string[]; +} +function on(event, callback) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().on(event, callback) as string[]; +} +function removeAllListeners(event: EventEmitter) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + get().removeAllListeners(event) as string[]; +} +function reset() { + real = null; +} +export { + publish, + on, + removeAllListeners, + reset, +};