UNPKG

@tinkoff/pubsub

Version:

Implementation of the publish/subscribe pattern

60 lines (53 loc) 1.66 kB
'use strict'; 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 { subscribers; logger; resultTransform; 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;