The publisher-subscriber pattern with a broker, also known
as the pub-sub pattern, is a messaging pattern used in
distributed systems, where publishers publish messages to a topic,
and subscribers receive messages from the topic through a broker.
class Broker {
constructor() {
this.topics = new Map();
this.subscribers = new Map();
}
subscribe(topic, subscriber) {
if (!this.subscribers.has(subscriber)) {
this.subscribers.set(subscriber, new Set());
}
this.subscribers.get(subscriber).add(topic);
if (!this.topics.has(topic)) {
this.topics.set(topic, new Set());
}
this.topics.get(topic).add(subscriber);
}
debugMap() {
console.log('---------------Topics-------------')
for (var [key, value] of this.topics) {
var arr = new Array(...value)
console.log(key + ' = ' + JSON.stringify(arr));
}
console.log('---------------Subcriber-------------')
for (var [key, value] of this.subscribers) {
var arr = new Array(...value)
console.log(JSON.stringify(key) + ' = ' + JSON.stringify(arr));
}
}
unsubscribe(topic, subscriber) {
if (this.subscribers.has(subscriber)) {
this.subscribers.get(subscriber).delete(topic)
}
if (this.topics.has(topic)) {
this.topics.get(topic).delete(subscriber)
}
}
publish(topic, data) {
//this.debugMap()
if (this.topics.has(topic)) {
this.topics.get(topic).forEach(subscriber => {
subscriber.receive(topic, data)
});
} else {
console.log("Broker -->Topic is not available", topic, data)
}
}
}
class Subscriber {
constructor(name,broker) {
this.name = name;
this.broker = broker;
}
receive(topic, data) {
console.log(`${this.name} received event on topic "${topic}": ${data}`);
}
subscribe(topic) {
this.broker.subscribe(topic, this);
}
unsubscribe(topic) {
this.broker.unsubscribe(topic, this);
}
}
class Publisher {
constructor(broker) {
this.broker = broker;
}
publish(topic, data) {
this.broker.publish(topic, data);
}
}
// Example usage:
const broker = new Broker();
const subscriber1 = new Subscriber("Alice",broker);
const subscriber2 = new Subscriber("Bob",broker);
const subscriber3 = new Subscriber("Charlie",broker);
subscriber1.subscribe("topic1");
subscriber2.subscribe("topic1");
subscriber3.subscribe("topic2");
//broker.debugMap()
const publisher = new Publisher(broker);
publisher.publish("topic1", "Event 1");
// Alice received event on topic "topic1": Event 1, Bob
received event on topic "topic1": Event 1
console.log("Alice Unsubscribed to topic1")
subscriber1.unsubscribe("topic1", broker);
publisher.publish("topic1", "Event 2");
// Bob received event on topic "topic1": Event 2
publisher.publish("topic2", "Event 3");
// Charlie received event on topic "topic2": Event 3
No comments:
Post a Comment