@tinkoff/pubsub
Version:
Implementation of the publish/subscribe pattern
57 lines (50 loc) • 1.61 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var noop = require('@tinkoff/utils/function/noop');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
const mockLogger = {
debug: noop__default["default"],
info: noop__default["default"],
error: noop__default["default"],
};
const defaultOptions = {
logger: mockLogger,
resultTransform: (res) => {
if (res.length === 1) {
return res[0];
}
return res;
},
};
class PubSub {
constructor(options) {
this.subscribers = new Map();
const opts = { ...defaultOptions, ...options };
this.logger = opts.logger;
this.resultTransform = opts.resultTransform;
}
subscribe(event, fn) {
this.logger.debug('subscribe', event, fn);
let subs = this.subscribers.get(event);
if (subs) {
subs.add(fn);
}
else {
subs = new Set([fn]);
this.subscribers.set(event, subs);
}
return () => subs.delete(fn);
}
publish(event, ...args) {
this.logger.debug('publish', event, args);
const subs = this.subscribers.get(event);
if (subs && subs.size) {
const promises = [];
subs.forEach((sub) => promises.push(Promise.resolve(sub(...args))));
return Promise.all(promises).then(this.resultTransform);
}
return Promise.resolve();
}
}
exports.PubSub = PubSub;