redis-smq-common
Version:
RedisSMQ Common Library provides many components that are mainly used by RedisSMQ and RedisSMQ Monitor.
136 lines • 4.26 kB
JavaScript
import { async } from '../async/index.js';
import { EventEmitter } from '../event/index.js';
import { createRedisClient, } from '../redis-client/index.js';
import { EventBusNotConnectedError } from './errors/index.js';
export class EventBusRedis extends EventEmitter {
connected = false;
pubClient;
subClient;
constructor(pubClient, subClient) {
super();
this.pubClient = pubClient;
this.pubClient.on('error', (err) => {
this.eventEmitter.emit('error', err);
});
this.subClient = subClient;
this.subClient.on('message', (channel, message) => {
this.eventEmitter.emit(String(channel), ...JSON.parse(message));
});
this.subClient.on('error', (err) => {
this.eventEmitter.emit('error', err);
});
this.connected = true;
}
emit(event, ...args) {
if (!this.connected) {
this.eventEmitter.emit('error', new EventBusNotConnectedError());
return false;
}
this.pubClient.publish(String(event), JSON.stringify(args), () => void 0);
return true;
}
on(event, listener) {
if (event === 'error') {
super.on('error', listener);
return this;
}
if (!this.connected) {
this.eventEmitter.emit('error', new EventBusNotConnectedError());
return this;
}
this.subClient.subscribe(String(event));
super.on(event, listener);
return this;
}
once(event, listener) {
if (event === 'error') {
super.once('error', listener);
return this;
}
if (!this.connected) {
this.eventEmitter.emit('error', new EventBusNotConnectedError());
return this;
}
this.subClient.subscribe(String(event));
super.once(event, listener);
return this;
}
removeAllListeners(event) {
if (event === 'error') {
super.removeAllListeners('error');
return this;
}
if (!this.connected) {
this.eventEmitter.emit('error', new EventBusNotConnectedError());
return this;
}
if (event)
this.subClient.unsubscribe(String(event));
else
this.subClient.unsubscribe();
super.removeAllListeners(event);
return this;
}
removeListener(event, listener) {
if (event === 'error') {
super.removeListener('error', listener);
return this;
}
if (!this.connected) {
this.eventEmitter.emit('error', new EventBusNotConnectedError());
return this;
}
super.removeListener(event, listener);
return this;
}
shutdown(cb) {
if (this.connected) {
async.series([
(cb) => this.subClient.halt(() => cb()),
(cb) => this.pubClient.halt(() => cb()),
], () => {
this.connected = false;
cb();
});
}
else
cb();
}
static createInstance(config, cb) {
let pubClient = null;
let subClient = null;
async.series([
(cb) => createRedisClient(config, (err, client) => {
if (err)
cb(err);
else {
pubClient = client;
cb();
}
}),
(cb) => createRedisClient(config, (err, client) => {
if (err)
cb(err);
else {
subClient = client;
cb();
}
}),
], (err) => {
if (err) {
if (pubClient)
pubClient.halt(() => void 0);
if (subClient)
subClient.halt(() => void 0);
cb(err);
}
else if (!pubClient || !subClient)
cb(new Error());
else {
const instance = new EventBusRedis(pubClient, subClient);
cb(null, instance);
}
});
}
}
//# sourceMappingURL=event-bus-redis.js.map