UNPKG

@pscoped/ngx-pub-sub

Version:

Event publish - subscribe mechanism as Angular service using Observable. You can publish your event along with any data to all the subscribers of your event. This library also supports historical published values for the subscribers.

123 lines 17.5 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; import { ReplaySubject } from 'rxjs/internal/ReplaySubject'; import { Subject } from 'rxjs/internal/Subject'; import { SubjectType } from '../types/subject-type.enum'; import * as i0 from "@angular/core"; export class NgxPubSubService { constructor() { this.eventObservableMapping = {}; } publishEvent(eventName, data) { this.validateEventName(eventName); this.createSubjectIfNotExist(eventName); this.publishNext(eventName, SubjectType.Subject, data); } subscribe(eventName, next, error, complete) { this.validateEventName(eventName); // subject will be created if the provided eventName is not registered this.createSubjectIfNotExist(eventName); return this.eventObservableMapping[eventName].ref.subscribe(next, error, complete); } /** * Use this method to get the Observable associated with the event. * Useful when you would like to apply additional rxjs operators like debounceTime */ getEventObservable(eventName) { this.validateEventName(eventName); // subject will be created if the provided eventName is not registered this.createSubjectIfNotExist(eventName); return this.eventObservableMapping[eventName].ref.asObservable(); } registerEventWithLastValue(name, defaultValue) { this.validateEventName(name); // type and name check this.checkEventType(name, SubjectType.BehaviorSubject, true); // create one this.eventObservableMapping[name] = { type: SubjectType.BehaviorSubject, ref: new BehaviorSubject(defaultValue) }; } registerEventWithHistory(name, bufferSize, windowTime, scheduler) { this.validateEventName(name); // type and name check this.checkEventType(name, SubjectType.ReplaySubject, true); // create one this.eventObservableMapping[name] = { type: SubjectType.ReplaySubject, ref: new ReplaySubject(bufferSize, windowTime, scheduler) }; } publishWithLast(eventName, data) { this.validateEventName(eventName); this.publishNext(eventName, SubjectType.BehaviorSubject, data); } publishWithHistory(eventName, data) { this.validateEventName(eventName); this.publishNext(eventName, SubjectType.ReplaySubject, data); } completeEvent(eventName) { this.validateEventName(eventName); if (!this.eventObservableMapping[eventName]) { throw Error('Event not created yet'); } this.completeObservableAndDestroyMapping(eventName); } ngOnDestroy() { for (const eventName in this.eventObservableMapping) { // eslint-disable-next-line no-prototype-builtins if (this.eventObservableMapping.hasOwnProperty(eventName)) { this.completeObservableAndDestroyMapping(eventName); } } } publishNext(eventName, type = SubjectType.Subject, data) { this.checkEventType(eventName, type); this.eventObservableMapping[eventName].ref.next(data); } checkEventType(eventName, type = SubjectType.Subject, shouldNotExist = false) { const object = this.eventObservableMapping[eventName]; let errorMessage; if (!object && shouldNotExist) { return; } if (!object) { errorMessage = `Event doesn't exist of type: ${SubjectType[type]} or it has been completed`; } else if (object.type !== type) { errorMessage = `Event exists with other type: ${SubjectType[object.type]}. Expected type: ${SubjectType[type]}`; } if (shouldNotExist && object.type === type) { errorMessage = `Event already registerd with the same type. Don't register a second time`; } if (errorMessage) { throw Error(`Error (${eventName}): ${errorMessage}`); } } createSubjectIfNotExist(eventName) { const object = this.eventObservableMapping[eventName]; if (object) { return; } this.eventObservableMapping[eventName] = { type: SubjectType.Subject, ref: new Subject() }; } validateEventName(eventName) { if (!eventName) { throw Error('Event name not provided'); } } completeObservableAndDestroyMapping(eventName) { this.eventObservableMapping[eventName].ref.complete(); delete this.eventObservableMapping[eventName]; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPubSubService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPubSubService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPubSubService, decorators: [{ type: Injectable }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXB1Yi1zdWIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXB1Yi1zdWIvc3JjL2xpYi9zZXJ2aWNlcy9uZ3gtcHViLXN1Yi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUd6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCO1FBQ0UsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQWlCLEVBQUUsSUFBVTtRQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFNBQVMsQ0FBQyxTQUFpQixFQUFFLElBQTJCLEVBQUUsS0FBMkIsRUFBRSxRQUFxQjtRQUMxRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4QyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUs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RTtZQUNiLE1BQU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRU8sbUNBQW1DLENBQUMsU0FBaUI7UUFDM0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDOytHQTdIVSxnQkFBZ0I7bUhBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL2ludGVybmFsL0JlaGF2aW9yU3ViamVjdCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL09ic2VydmFibGUnO1xyXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0JztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMvaW50ZXJuYWwvU3ViamVjdCc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvaW50ZXJuYWwvU3Vic2NyaXB0aW9uJztcclxuaW1wb3J0IHsgU2NoZWR1bGVyTGlrZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvdHlwZXMnO1xyXG5cclxuaW1wb3J0IHsgSUhhc2ggfSBmcm9tICcuLi90eXBlcy9pLWhhc2gnO1xyXG5pbXBvcnQgeyBTdWJqZWN0VHlwZSB9IGZyb20gJy4uL3R5cGVzL3N1YmplY3QtdHlwZS5lbnVtJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5neFB1YlN1YlNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIGV2ZW50T2JzZXJ2YWJsZU1hcHBpbmc6IElIYXNoO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZyA9IHt9O1xyXG4gIH1cclxuICBcclxuICBwdWJsaXNoRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpIHtcclxuICAgIHRoaXMudmFsaWRhdGVFdmVudE5hbWUoZXZlbnROYW1lKTtcclxuICAgIHRoaXMuY3JlYXRlU3ViamVjdElmTm90RXhpc3QoZXZlbnROYW1lKTtcclxuXHJcbiAgICB0aGlzLnB1Ymxpc2hOZXh0KGV2ZW50TmFtZSwgU3ViamVjdFR5cGUuU3ViamVjdCwgZGF0YSk7XHJcbiAgfVxyXG4gIFxyXG4gIHN1YnNjcmliZShldmVudE5hbWU6IHN0cmluZywgbmV4dD86ICh2YWx1ZTogYW55KSA9PiB2b2lkLCBlcnJvcj86IChlcnJvcjogYW55KSA9PiBhbnksIGNvbXBsZXRlPzogKCkgPT4gdm9pZCk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICB0aGlzLnZhbGlkYXRlRXZlbnROYW1lKGV2ZW50TmFtZSk7XHJcbiAgICAvLyBzdWJqZWN0IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgcHJvdmlkZWQgZXZlbnROYW1lIGlzIG5vdCByZWdpc3RlcmVkXHJcbiAgICB0aGlzLmNyZWF0ZVN1YmplY3RJZk5vdEV4aXN0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tldmVudE5hbWVdLnJlZi5zdWJzY3JpYmUobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIE9ic2VydmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cclxuICAgKiBVc2VmdWwgd2hlbiB5b3Ugd291bGQgbGlrZSB0byBhcHBseSBhZGRpdGlvbmFsIHJ4anMgb3BlcmF0b3JzIGxpa2UgZGVib3VuY2VUaW1lXHJcbiAgICovXHJcbiAgZ2V0RXZlbnRPYnNlcnZhYmxlKGV2ZW50TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudmFsaWRhdGVFdmVudE5hbWUoZXZlbnROYW1lKTtcclxuICAgIC8vIHN1YmplY3Qgd2lsbCBiZSBjcmVhdGVkIGlmIHRoZSBwcm92aWRlZCBldmVudE5hbWUgaXMgbm90IHJlZ2lzdGVyZWRcclxuICAgIHRoaXMuY3JlYXRlU3ViamVjdElmTm90RXhpc3QoZXZlbnROYW1lKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tldmVudE5hbWVdLnJlZi5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyRXZlbnRXaXRoTGFzdFZhbHVlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMudmFsaWRhdGVFdmVudE5hbWUobmFtZSk7XHJcbiAgICAvLyB0eXBlIGFuZCBuYW1lIGNoZWNrXHJcbiAgICB0aGlzLmNoZWNrRXZlbnRUeXBlKG5hbWUsIFN1YmplY3RUeXBlLkJlaGF2aW9yU3ViamVjdCwgdHJ1ZSk7XHJcbiAgICAvLyBjcmVhdGUgb25lXHJcbiAgICB0aGlzLmV2ZW50T2JzZXJ2YWJsZU1hcHBpbmdbbmFtZV0gPSB7XHJcbiAgICAgIHR5cGU6IFN1YmplY3RUeXBlLkJlaGF2aW9yU3ViamVjdCxcclxuICAgICAgcmVmOiBuZXcgQmVoYXZpb3JTdWJqZWN0KGRlZmF1bHRWYWx1ZSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZWdpc3RlckV2ZW50V2l0aEhpc3RvcnkobmFtZTogc3RyaW5nLCBidWZmZXJTaXplPzogbnVtYmVyLCB3aW5kb3dUaW1lPzogbnVtYmVyLCBzY2hlZHVsZXI/OiBTY2hlZHVsZXJMaWtlKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRlRXZlbnROYW1lKG5hbWUpO1xyXG4gICAgLy8gdHlwZSBhbmQgbmFtZSBjaGVja1xyXG4gICAgdGhpcy5jaGVja0V2ZW50VHlwZShuYW1lLCBTdWJqZWN0VHlwZS5SZXBsYXlTdWJqZWN0LCB0cnVlKTtcclxuICAgIC8vIGNyZWF0ZSBvbmVcclxuICAgIHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tuYW1lXSA9IHtcclxuICAgICAgdHlwZTogU3ViamVjdFR5cGUuUmVwbGF5U3ViamVjdCxcclxuICAgICAgcmVmOiBuZXcgUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lLCBzY2hlZHVsZXIpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGlzaFdpdGhMYXN0KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhPzogYW55KSB7XHJcbiAgICB0aGlzLnZhbGlkYXRlRXZlbnROYW1lKGV2ZW50TmFtZSk7XHJcbiAgICB0aGlzLnB1Ymxpc2hOZXh0KGV2ZW50TmFtZSwgU3ViamVjdFR5cGUuQmVoYXZpb3JTdWJqZWN0LCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1Ymxpc2hXaXRoSGlzdG9yeShldmVudE5hbWU6IHN0cmluZywgZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy52YWxpZGF0ZUV2ZW50TmFtZShldmVudE5hbWUpO1xyXG4gICAgdGhpcy5wdWJsaXNoTmV4dChldmVudE5hbWUsIFN1YmplY3RUeXBlLlJlcGxheVN1YmplY3QsIGRhdGEpO1xyXG4gIH1cclxuICBcclxuICBjb21wbGV0ZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRlRXZlbnROYW1lKGV2ZW50TmFtZSk7XHJcbiAgICBpZiAoIXRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tldmVudE5hbWVdKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdFdmVudCBub3QgY3JlYXRlZCB5ZXQnKTtcclxuICAgIH1cclxuICAgIHRoaXMuY29tcGxldGVPYnNlcnZhYmxlQW5kRGVzdHJveU1hcHBpbmcoZXZlbnROYW1lKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdGhpcy5ldmVudE9ic2VydmFibGVNYXBwaW5nKSB7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcclxuICAgICAgaWYgKHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5jb21wbGV0ZU9ic2VydmFibGVBbmREZXN0cm95TWFwcGluZyhldmVudE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgcHVibGlzaE5leHQoZXZlbnROYW1lOiBzdHJpbmcsIHR5cGU6IFN1YmplY3RUeXBlID0gU3ViamVjdFR5cGUuU3ViamVjdCwgZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5jaGVja0V2ZW50VHlwZShldmVudE5hbWUsIHR5cGUpO1xyXG4gICAgdGhpcy5ldmVudE9ic2VydmFibGVNYXBwaW5nW2V2ZW50TmFtZV0ucmVmLm5leHQoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrRXZlbnRUeXBlKGV2ZW50TmFtZTogc3RyaW5nLCB0eXBlOiBTdWJqZWN0VHlwZSA9IFN1YmplY3RUeXBlLlN1YmplY3QsIHNob3VsZE5vdEV4aXN0ID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tldmVudE5hbWVdO1xyXG4gICAgbGV0IGVycm9yTWVzc2FnZTtcclxuICAgIGlmKCFvYmplY3QgJiYgc2hvdWxkTm90RXhpc3QpIHsgcmV0dXJuOyB9XHJcbiAgICBpZighb2JqZWN0KSB7XHJcbiAgICAgIGVycm9yTWVzc2FnZSA9IGBFdmVudCBkb2Vzbid0IGV4aXN0IG9mIHR5cGU6ICR7U3ViamVjdFR5cGVbdHlwZV19IG9yIGl0IGhhcyBiZWVuIGNvbXBsZXRlZGA7XHJcbiAgICB9IGVsc2UgaWYob2JqZWN0LnR5cGUgIT09IHR5cGUpIHtcclxuICAgICAgZXJyb3JNZXNzYWdlID0gYEV2ZW50IGV4aXN0cyB3aXRoIG90aGVyIHR5cGU6ICR7U3ViamVjdFR5cGVbb2JqZWN0LnR5cGVdfS4gRXhwZWN0ZWQgdHlwZTogJHtTdWJqZWN0VHlwZVt0eXBlXX1gO1xyXG4gICAgfVxyXG4gICAgaWYoc2hvdWxkTm90RXhpc3QgJiYgb2JqZWN0LnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgZXJyb3JNZXNzYWdlID0gYEV2ZW50IGFscmVhZHkgcmVnaXN0ZXJkIHdpdGggdGhlIHNhbWUgdHlwZS4gRG9uJ3QgcmVnaXN0ZXIgYSBzZWNvbmQgdGltZWA7XHJcbiAgICB9XHJcbiAgICBpZihlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoYEVycm9yICgke2V2ZW50TmFtZX0pOiAke2Vycm9yTWVzc2FnZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3ViamVjdElmTm90RXhpc3QoZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG9iamVjdCA9IHRoaXMuZXZlbnRPYnNlcnZhYmxlTWFwcGluZ1tldmVudE5hbWVdO1xyXG4gICAgaWYob2JqZWN0KSB7IHJldHVybjsgfVxyXG4gIFxyXG4gICAgdGhpcy5ldmVudE9ic2VydmFibGVNYXBwaW5nW2V2ZW50TmFtZV0gPSB7XHJcbiAgICAgIHR5cGU6IFN1YmplY3RUeXBlLlN1YmplY3QsXHJcbiAgICAgIHJlZjogbmV3IFN1YmplY3QoKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVFdmVudE5hbWUoZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmKCFldmVudE5hbWUpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0V2ZW50IG5hbWUgbm90IHByb3ZpZGVkJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBsZXRlT2JzZXJ2YWJsZUFuZERlc3Ryb3lNYXBwaW5nKGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmV2ZW50T2JzZXJ2YWJsZU1hcHBpbmdbZXZlbnROYW1lXS5yZWYuY29tcGxldGUoKTtcclxuICAgIGRlbGV0ZSB0aGlzLmV2ZW50T2JzZXJ2YWJsZU1hcHBpbmdbZXZlbnROYW1lXTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==