@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
51 lines • 6.75 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 {
toggle;
sources = {};
stream;
currentSourceId;
constructor(initalSource, defaultStream) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpdGNoYWJsZS1zdHJlYW0tbW9uaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL2V4dGVuc2lvbnMvc3dpdGNoYWJsZS1zdHJlYW0tbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcseUJBQXlCLENBQUM7QUFFdEMsc0hBQXNIO0FBQ3RILE1BQU0sT0FBTyx1QkFBdUI7SUFDMUIsTUFBTSxDQUEwQjtJQUN4QyxPQUFPLEdBQTRELEVBQUUsQ0FBQztJQUN0RSxNQUFNLENBQWtCO0lBQ2hCLGVBQWUsQ0FBUztJQUVoQyxZQUNFLFlBQXFFLEVBQ3JFLGFBQXFCO1FBRXJCLEtBQUssQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM1QixTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNyQixLQUFLLENBQUMsR0FBRyxFQUFFLHdCQUF3QixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxFQUFFLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBVSxFQUFFLEdBQW9CO1FBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUc7WUFDakIsRUFBRSxFQUFFLEVBQUU7WUFDTixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FDZCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDWixLQUFLLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQ0g7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFVO1FBQ2xCLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0I7UUFDeEIsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFlBQVk7UUFDVixLQUFLLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9sb2dnZXInO1xuXG5jb25zdCBUQUcgPSAnU3dpdGNoYWJsZVN0cmVhbU1vbml0b3InO1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTAzODc3Mi9yeGpzLWhvdy10by10b2dnbGUtdG8tc3dpdGNoLWJldHdlZW4tbXVsdGlwbGUtYmVoYXZpb3Itc3ViamVjdC1zb3VyY2VzXG5leHBvcnQgY2xhc3MgU3dpdGNoYWJsZVN0cmVhbU1vbml0b3I8RGF0YVR5cGU+IHtcbiAgcHJpdmF0ZSB0b2dnbGU6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+O1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCB7IGlkOiBzdHJpbmc7IHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+IH0+ID0ge307XG4gIHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+O1xuICBwcml2YXRlIGN1cnJlbnRTb3VyY2VJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluaXRhbFNvdXJjZTogUmVjb3JkPHN0cmluZywgeyBpZDogc3RyaW5nOyBzdHJlYW06IE9ic2VydmFibGU8YW55PiB9PixcbiAgICBkZWZhdWx0U3RyZWFtOiBzdHJpbmdcbiAgKSB7XG4gICAgZGVidWcoVEFHLCAnY29uc3RydWN0b3InKTtcbiAgICB0aGlzLnNvdXJjZXMgPSBpbml0YWxTb3VyY2U7XG4gICAgdGhpcy50b2dnbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGRlZmF1bHRTdHJlYW0pO1xuICAgIHRoaXMuY3VycmVudFNvdXJjZUlkID0gZGVmYXVsdFN0cmVhbTtcbiAgICB0aGlzLnN0cmVhbSA9IHRoaXMudG9nZ2xlLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHNvdXJjZUlkKSA9PiB7XG4gICAgICAgIGRlYnVnKFRBRywgYHN3aXRjaE1hcCB0byBzb3VyY2UgXCIke3NvdXJjZUlkfVwiYCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNbc291cmNlSWRdLnN0cmVhbTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG4gIH1cblxuICBnZXRDdXJyZW50U291cmNlSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFNvdXJjZUlkO1xuICB9XG5cbiAgYWRkU3RyZWFtKGlkOiBzdHJpbmcsIG9iczogT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgdGhpcy5zb3VyY2VzW2lkXSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHN0cmVhbTogb2JzLnBpcGUoXG4gICAgICAgIHRhcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBkZWJ1ZyhUQUcsIGBTdHJlYW0gWyR7aWR9XSBuZXh0IC0+IGAsIHZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIGdldFN0cmVhbShpZDogc3RyaW5nKSB7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5zb3VyY2VzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGRhdGEgc291cmNlIHdpdGggaWQ6ICR7aWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZXNbaWRdLnN0cmVhbTtcbiAgfVxuXG4gIHVzZVNvdXJjZShzb3VyY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKCEoc291cmNlSWQgaW4gdGhpcy5zb3VyY2VzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGRhdGEgc291cmNlIHdpdGggaWQ6ICR7c291cmNlSWR9YCk7XG4gICAgfVxuICAgIGRlYnVnKFRBRywgJ1VzaW5nIGRhdGEgc291cmNlOiAnLCBzb3VyY2VJZCk7XG4gICAgdGhpcy5jdXJyZW50U291cmNlSWQgPSBzb3VyY2VJZDtcbiAgICB0aGlzLnRvZ2dsZS5uZXh0KHNvdXJjZUlkKTtcbiAgfVxuXG4gIGFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGRlYnVnKFRBRywgJ2FzT2JzZXJ2YWJsZScpO1xuICAgIHJldHVybiB0aGlzLnN0cmVhbTtcbiAgfVxufVxuIl19