journaly
Version:
A simple pub-sub library project
84 lines • 2.81 kB
JavaScript
"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