import { Observable, Subject, Subscription } from 'rxjs'; import { getLogger, Logger } from './Logging'; export class PubSub extends Subscription { public static displayName = 'PubSub'; private readonly logger: Logger; private map: StringMap>; constructor() { super(); this.logger = getLogger(PubSub.displayName); this.map = {}; } private getSubject(key: string) { let subject: Subject = this.map[key]; if (subject == null) { subject = new Subject(); this.map[key] = subject; this.add(subject); } return subject; } public observe(key: string) { return this.getSubject(key).asObservable(); } public subscribe( key: string, onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void, ) { if (onError == null) { onError = e => { this.logger.error('PubSub Error', e); }; } return this.observe(key).subscribe(onNext, onError, onCompleted); } public publish(key: string, arg: T) { this.getSubject(key).next(arg); } } export const Default = new PubSub(); export function observe(key: string) { return Default.observe(key); } export function subscribe( key: string, onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void, ) { return Default.subscribe(key, onNext, onError, onCompleted); } export function publish(key: string, arg?: T) { Default.publish(key, arg); }