import * as plugins from './smartrx.plugins'; import * as rxjs from './smartrx.plugins.rxjs'; export interface IEventEmitter { on: (eventNameArg: string, eventHandlerArg: (eventPayload: T) => any) => void; } /** * bundles an observable with an emitter */ export interface IObservableEmitterBundle { observable: rxjs.Observable; emitter: IEventEmitter; event: string; } /** * manages observables by making sure that only one observable is regsitered per event */ export class Observablemap { public observableEmitterBundleArray = new Array(); /** * creates a new observable if not yet registered for the same event. * In case event has been registered before the same observable is returned. */ public getObservableForEmitterEvent(emitterArg: IEventEmitter, eventArg: string) { const existingBundle = this.observableEmitterBundleArray.find((bundleArg) => { return bundleArg.emitter === emitterArg && bundleArg.event === eventArg; }); if (existingBundle) { return existingBundle.observable; } else { const emitterObservable = rxjs.fromEvent(emitterArg as any, eventArg); this.observableEmitterBundleArray.push({ observable: emitterObservable, emitter: emitterArg, event: eventArg, }); return emitterObservable; } } }