UNPKG

journaly

Version:

A simple pub-sub library project

84 lines 2.81 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Subject = void 0; const invalidTopic_1 = __importDefault(require("./invalidTopic")); class Subject { getTopics() { const topics = []; if (this.subscribers) { const newProps = Object.getOwnPropertyNames(this.subscribers); for (const prop of newProps) { if (!topics.includes(prop)) topics.push(prop); } } return topics; } subscribe(subscriber, topic) { if (topic) this.checkTopic(topic); if (this.checkSubscriber(subscriber, topic) !== -1) return new Promise((_resolve, reject) => { reject(new invalidTopic_1.default(topic)); }); if (topic) this.subscribers[topic].push(subscriber); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore else this.subscribers.push(subscriber); return new Promise((resolve) => { resolve([]); }); } unsubscribe(subscriber, topic) { if (topic) this.checkTopic(topic); const index = this.checkSubscriber(subscriber, topic); if (index === -1) { return false; } if (topic) this.subscribers[topic].splice(index, 1); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore else this.subscribers.splice(index, 1); return true; } // eslint-disable-next-line @typescript-eslint/no-explicit-any async publish(topic, ...params) { if (topic) { this.checkTopic(topic); return Promise.all(this.subscribers[topic].map((subscriber) => { return subscriber(...params); })); } else { return Promise.all( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore this.subscribers.map((subscriber) => { return subscriber(...params); })); } } checkSubscriber(subscriber, topic) { const index = topic ? this.subscribers[topic].indexOf(subscriber) : // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore this.subscribers.indexOf(subscriber); return index; } checkTopic(topic) { if (!this.subscribers[topic]) { this.subscribers[topic] = []; } } } exports.Subject = Subject; //# sourceMappingURL=subject.js.map