You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/hydro/service/bus.ts

48 lines
1.3 KiB
TypeScript

import { EventEmitter } from 'events';
import cluster from 'cluster';
5 years ago
const bus = new EventEmitter();
4 years ago
export function subscribe(events, handler, funcName) {
if (!funcName) {
5 years ago
for (const event of events) bus.on(event, handler);
} else {
handler.__bus = (...args) => {
handler[funcName].call(handler, ...args);
};
for (const event of events) bus.on(event, handler.__bus);
}
}
export function unsubscribe(events, handler, funcName) {
if (!funcName) {
5 years ago
for (const event of events) bus.off(event, handler);
} else {
handler.__bus = (...args) => {
handler[funcName].call(handler, ...args);
};
// FIXME doesn't work
for (const event of events) bus.off(event, handler.__bus);
delete handler.__bus;
}
}
export function publish(event, payload, isMaster = true) {
4 years ago
// Process forked by pm2 would also have process.send
if (isMaster && process.send && !cluster.isMaster) {
4 years ago
process.send({
event: 'bus',
eventName: event,
payload,
});
4 years ago
} else {
bus.emit(event, { value: payload, event });
}
}
global.Hydro.service.bus = {
4 years ago
subscribe, unsubscribe, publish,
};
export default global.Hydro.service.bus;