@fsms/angular-pubsub
Version:
Angular 11.x implementation of the [publish subscribe](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) Pattern.
68 lines • 9.11 kB
JavaScript
import { Injectable } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { TracingService } from './tracing.service';
export class PubsubService {
constructor(tracingService) {
this.tracingService = tracingService;
this.map = new Map();
this.subscriptions = [];
}
subscribe({ messageType, callback, error, complete, }) {
if (!this.hasSubject(messageType)) {
this.setNewSubject(messageType);
}
const subject = this.getSubject(messageType);
const subscription = subject
.asObservable()
.subscribe(callback, error, complete);
this.tracingService.trace(`${messageType} is subscribed`);
this.addSubscription(subscription);
const unsubscribe = () => {
this.tracingService.trace(`${messageType} is unsubscribed`);
subscription.unsubscribe();
};
return { unsubscribe };
}
publish(message) {
if (!message) {
this.throwError('Publish method must get event name');
}
else if (!this.hasSubject(message.messageType)) {
return;
}
const context = this;
const subject = this.getSubject(message.messageType);
this.tracingService.trace(`Publishing: ${message.messageType}`);
this.tracingService.trace(`${subject.observers.length} subscribers found for: ${message.messageType}`);
subject.next({ message, context });
}
clearAllSubscriptions() {
this.subscriptions.forEach((s) => s && s.unsubscribe());
this.subscriptions.length = 0;
this.map.clear();
this.tracingService.trace(`All subscriptions are cleared`);
}
addSubscription(sub) {
this.subscriptions.push(sub);
}
getSubject(messageType) {
return this.map.get(messageType);
}
hasSubject(messageType) {
return this.map.has(messageType);
}
setNewSubject(messageType) {
this.map.set(messageType, new ReplaySubject());
}
throwError(msg) {
throw new Error(`[${PubsubService.ServiceName}] => ${msg}`);
}
}
PubsubService.ServiceName = 'PubSub Service';
PubsubService.decorators = [
{ type: Injectable }
];
PubsubService.ctorParameters = () => [
{ type: TracingService }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVic3ViLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdnN0cy93b3JrLzEvcy9wcm9qZWN0cy9mc21zLWFuZ3VsYXItcHVic3ViL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9wdWJzdWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBU25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUduRCxNQUFNLE9BQU8sYUFBYTtJQUN4QixZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFHMUMsUUFBRyxHQUFHLElBQUksR0FBRyxFQUFvRCxDQUFDO1FBQ2xFLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUpVLENBQUM7SUFNdEQsU0FBUyxDQUFDLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixLQUFLLEVBQ0wsUUFBUSxHQUNTO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDakM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sWUFBWSxHQUFHLE9BQU87YUFDekIsWUFBWSxFQUFFO2FBQ2QsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUFXLGdCQUFnQixDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVuQyxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUFXLGtCQUFrQixDQUFDLENBQUM7WUFDNUQsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUVGLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsT0FBTyxDQUFnQyxPQUFVO1FBQy9DLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdkQ7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEQsT0FBTztTQUNSO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBOEIsQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxlQUFlLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUN2QixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSwyQkFBMkIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUM1RSxDQUFDO1FBRUYsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFUyxlQUFlLENBQUMsR0FBaUI7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVTLFVBQVUsQ0FBQyxXQUFtQjtRQUN0QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxVQUFVLENBQUMsV0FBbUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMsYUFBYSxDQUFDLFdBQW1CO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsRUFBNkIsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTyxVQUFVLENBQUMsR0FBVztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLFdBQVcsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7O0FBOUVNLHlCQUFXLEdBQUcsZ0JBQWdCLENBQUM7O1lBSnZDLFVBQVU7OztZQUZGLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENhbGxiYWNrT3B0aW9ucyxcbiAgSU1lc3NhZ2VIYW5kbGVyQ29udGV4dCxcbiAgTG9nZ2VyLFxuICBQdWJzdWJTdWJzY3JpcHRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL2RlZmluaXRpb25zJztcbmltcG9ydCB7IElNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IFN1YnNjcmliZU9wdGlvbnMgfSBmcm9tICcuL3N1YnNjcmliZS1vcHRpb25zJztcbmltcG9ydCB7IFRyYWNpbmdTZXJ2aWNlIH0gZnJvbSAnLi90cmFjaW5nLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHVic3ViU2VydmljZSBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlckNvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRyYWNpbmdTZXJ2aWNlOiBUcmFjaW5nU2VydmljZSkge31cblxuICBzdGF0aWMgU2VydmljZU5hbWUgPSAnUHViU3ViIFNlcnZpY2UnO1xuICBwcml2YXRlIG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZXBsYXlTdWJqZWN0PENhbGxiYWNrT3B0aW9uczxJTWVzc2FnZT4+PigpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgc3Vic2NyaWJlKHtcbiAgICBtZXNzYWdlVHlwZSxcbiAgICBjYWxsYmFjayxcbiAgICBlcnJvcixcbiAgICBjb21wbGV0ZSxcbiAgfTogU3Vic2NyaWJlT3B0aW9ucyk6IFB1YnN1YlN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKCF0aGlzLmhhc1N1YmplY3QobWVzc2FnZVR5cGUpKSB7XG4gICAgICB0aGlzLnNldE5ld1N1YmplY3QobWVzc2FnZVR5cGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmdldFN1YmplY3QobWVzc2FnZVR5cGUpO1xuXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAuc3Vic2NyaWJlKGNhbGxiYWNrLCBlcnJvciwgY29tcGxldGUpO1xuXG4gICAgdGhpcy50cmFjaW5nU2VydmljZS50cmFjZShgJHttZXNzYWdlVHlwZX0gaXMgc3Vic2NyaWJlZGApO1xuXG4gICAgdGhpcy5hZGRTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgdGhpcy50cmFjaW5nU2VydmljZS50cmFjZShgJHttZXNzYWdlVHlwZX0gaXMgdW5zdWJzY3JpYmVkYCk7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgdW5zdWJzY3JpYmUgfTtcbiAgfVxuXG4gIHB1Ymxpc2g8ViBleHRlbmRzIElNZXNzYWdlID0gSU1lc3NhZ2U+KG1lc3NhZ2U6IFYpOiB2b2lkIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHRoaXMudGhyb3dFcnJvcignUHVibGlzaCBtZXRob2QgbXVzdCBnZXQgZXZlbnQgbmFtZScpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzU3ViamVjdChtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzIGFzIElNZXNzYWdlSGFuZGxlckNvbnRleHQ7XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5nZXRTdWJqZWN0KG1lc3NhZ2UubWVzc2FnZVR5cGUpO1xuXG4gICAgdGhpcy50cmFjaW5nU2VydmljZS50cmFjZShgUHVibGlzaGluZzogJHttZXNzYWdlLm1lc3NhZ2VUeXBlfWApO1xuXG4gICAgdGhpcy50cmFjaW5nU2VydmljZS50cmFjZShcbiAgICAgIGAke3N1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aH0gc3Vic2NyaWJlcnMgZm91bmQgZm9yOiAke21lc3NhZ2UubWVzc2FnZVR5cGV9YFxuICAgICk7XG5cbiAgICBzdWJqZWN0Lm5leHQoeyBtZXNzYWdlLCBjb250ZXh0IH0pO1xuICB9XG5cbiAgY2xlYXJBbGxTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzICYmIHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5tYXAuY2xlYXIoKTtcblxuICAgIHRoaXMudHJhY2luZ1NlcnZpY2UudHJhY2UoYEFsbCBzdWJzY3JpcHRpb25zIGFyZSBjbGVhcmVkYCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTdWJqZWN0KG1lc3NhZ2VUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG1lc3NhZ2VUeXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNTdWJqZWN0KG1lc3NhZ2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuaGFzKG1lc3NhZ2VUeXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXROZXdTdWJqZWN0KG1lc3NhZ2VUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQobWVzc2FnZVR5cGUsIG5ldyBSZXBsYXlTdWJqZWN0PENhbGxiYWNrT3B0aW9uczxJTWVzc2FnZT4+KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0Vycm9yKG1zZzogc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbJHtQdWJzdWJTZXJ2aWNlLlNlcnZpY2VOYW1lfV0gPT4gJHttc2d9YCk7XG4gIH1cbn1cbiJdfQ==