@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
48 lines • 6.67 kB
JavaScript
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=