UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

48 lines 6.67 kB
import { BehaviorSubject } from 'rxjs'; import { share, switchMap, tap } from 'rxjs/operators'; import { debug } from '../logger'; const TAG = 'SwitchableStreamMonitor'; // https://stackoverflow.com/questions/49038772/rxjs-how-to-toggle-to-switch-between-multiple-behavior-subject-sources export class SwitchableStreamMonitor { constructor(initalSource, defaultStream) { this.sources = {}; debug(TAG, 'constructor'); this.sources = initalSource; this.toggle = new BehaviorSubject(defaultStream); this.currentSourceId = defaultStream; this.stream = this.toggle.pipe(switchMap((sourceId) => { debug(TAG, `switchMap to source "${sourceId}"`); return this.sources[sourceId].stream; }), share()); } getCurrentSourceId() { return this.currentSourceId; } addStream(id, obs) { this.sources[id] = { id: id, stream: obs.pipe(tap((value) => { debug(TAG, `Stream [${id}] next -> `, value); })), }; } getStream(id) { if (!(id in this.sources)) { throw new Error(`Missing data source with id: ${id}`); } return this.sources[id].stream; } useSource(sourceId) { if (!(sourceId in this.sources)) { throw new Error(`Missing data source with id: ${sourceId}`); } debug(TAG, 'Using data source: ', sourceId); this.currentSourceId = sourceId; this.toggle.next(sourceId); } asObservable() { debug(TAG, 'asObservable'); return this.stream; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoYWJsZS1zdHJlYW0tbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL2V4dGVuc2lvbnMvc3dpdGNoYWJsZS1zdHJlYW0tbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcseUJBQXlCLENBQUM7QUFFdEMsc0hBQXNIO0FBQ3RILE1BQU0sT0FBTyx1QkFBdUI7SUFNbEMsWUFDRSxZQUFxRSxFQUNyRSxhQUFxQjtRQU52QixZQUFPLEdBQTRELEVBQUUsQ0FBQztRQVFwRSxLQUFLLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDNUIsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDckIsS0FBSyxDQUFDLEdBQUcsRUFBRSx3QkFBd0IsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVUsRUFBRSxHQUFvQjtRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQ2pCLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQ2QsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ1osS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUNIO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBVTtRQUNsQixJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0I7UUFDeEIsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWTtRQUNWLEtBQUssQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uL2xvZ2dlcic7XG5cbmNvbnN0IFRBRyA9ICdTd2l0Y2hhYmxlU3RyZWFtTW9uaXRvcic7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5MDM4NzcyL3J4anMtaG93LXRvLXRvZ2dsZS10by1zd2l0Y2gtYmV0d2Vlbi1tdWx0aXBsZS1iZWhhdmlvci1zdWJqZWN0LXNvdXJjZXNcbmV4cG9ydCBjbGFzcyBTd2l0Y2hhYmxlU3RyZWFtTW9uaXRvcjxEYXRhVHlwZT4ge1xuICBwcml2YXRlIHRvZ2dsZTogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIHsgaWQ6IHN0cmluZzsgc3RyZWFtOiBPYnNlcnZhYmxlPGFueT4gfT4gPSB7fTtcbiAgc3RyZWFtOiBPYnNlcnZhYmxlPGFueT47XG4gIHByaXZhdGUgY3VycmVudFNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5pdGFsU291cmNlOiBSZWNvcmQ8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+IH0+LFxuICAgIGRlZmF1bHRTdHJlYW06IHN0cmluZ1xuICApIHtcbiAgICBkZWJ1ZyhUQUcsICdjb25zdHJ1Y3RvcicpO1xuICAgIHRoaXMuc291cmNlcyA9IGluaXRhbFNvdXJjZTtcbiAgICB0aGlzLnRvZ2dsZSA9IG5ldyBCZWhhdmlvclN1YmplY3QoZGVmYXVsdFN0cmVhbSk7XG4gICAgdGhpcy5jdXJyZW50U291cmNlSWQgPSBkZWZhdWx0U3RyZWFtO1xuICAgIHRoaXMuc3RyZWFtID0gdGhpcy50b2dnbGUucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoc291cmNlSWQpID0+IHtcbiAgICAgICAgZGVidWcoVEFHLCBgc3dpdGNoTWFwIHRvIHNvdXJjZSBcIiR7c291cmNlSWR9XCJgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc1tzb3VyY2VJZF0uc3RyZWFtO1xuICAgICAgfSksXG4gICAgICBzaGFyZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRTb3VyY2VJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U291cmNlSWQ7XG4gIH1cblxuICBhZGRTdHJlYW0oaWQ6IHN0cmluZywgb2JzOiBPYnNlcnZhYmxlPGFueT4pIHtcbiAgICB0aGlzLnNvdXJjZXNbaWRdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgc3RyZWFtOiBvYnMucGlwZShcbiAgICAgICAgdGFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGRlYnVnKFRBRywgYFN0cmVhbSBbJHtpZH1dIG5leHQgLT4gYCwgdmFsdWUpO1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U3RyZWFtKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIShpZCBpbiB0aGlzLnNvdXJjZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZGF0YSBzb3VyY2Ugd2l0aCBpZDogJHtpZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc1tpZF0uc3RyZWFtO1xuICB9XG5cbiAgdXNlU291cmNlKHNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIShzb3VyY2VJZCBpbiB0aGlzLnNvdXJjZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZGF0YSBzb3VyY2Ugd2l0aCBpZDogJHtzb3VyY2VJZH1gKTtcbiAgICB9XG4gICAgZGVidWcoVEFHLCAnVXNpbmcgZGF0YSBzb3VyY2U6ICcsIHNvdXJjZUlkKTtcbiAgICB0aGlzLmN1cnJlbnRTb3VyY2VJZCA9IHNvdXJjZUlkO1xuICAgIHRoaXMudG9nZ2xlLm5leHQoc291cmNlSWQpO1xuICB9XG5cbiAgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgZGVidWcoVEFHLCAnYXNPYnNlcnZhYmxlJyk7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xuICB9XG59XG4iXX0=