UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

103 lines 12.2 kB
import { coerceNumberProperty } from '@angular/cdk/coercion'; import { BehaviorSubject, NEVER } from 'rxjs'; import { filter, map, switchMap } from 'rxjs/operators'; /** * A wrapper class for handling realtime notifications in RxJS fashion. */ export class RealtimeService { /** * A flag displaying if realtime notifications are currently active. */ get active() { return this.isActive.value; } /** * An observable emitting a value in case the realtime connection has been interrupted. * Can be used to reload data of e.g. a datapoint graph that wasn't received while realtime was interrupted. */ get reconnect$() { return this.realtimeSubject.reconnect$; } /** * An observable emitting either `connected` or `disconnected` depending on the state of the realtime connection. * Can be used to e.g. inform the user about the interrupted realtime connection. */ get connectionStatus$() { return this.realtimeSubject.connectionStatus$; } constructor(realtimeSubject) { this.realtimeSubject = realtimeSubject; this.isActive = new BehaviorSubject(true); } /** * Get an Observable of all realtime notifications. * * @param {string | number | IIdentified} entityOrId Entity object or id * * @returns An [[Observable]] of notifications wrapped as [[RealtimeMessage]] */ onAll$(entityOrId) { const subject$ = this.realtimeSubject.getObservableForChannel(this.getChannel(entityOrId)); return this.isActive.pipe(switchMap(active => (active ? subject$ : NEVER))); } /** * Subscribes again all realtime channels with active observers. */ start() { if (!this.active) { this.isActive.next(true); } } /** * Stops realtime notifications and unsubscribes all realtime channels. */ stop() { if (this.active) { this.isActive.next(false); } } /** * Get an Observable of all CREATE realtime notifications. * * @param {string | number | IIdentified} entityOrId Entity object or id * * @returns An [[Observable]] of newly created entity objects. */ onCreate$(entityOrId) { return this.onAll$(entityOrId).pipe(filter(msg => msg.realtimeAction === 'CREATE'), map(msg => msg.data)); } /** * Get an Observable of all UPDATE realtime notifications. * * @param {string | number | IIdentified} entityOrId Entity object or id * * @returns An [[Observable]] of updated entity objects. */ onUpdate$(entityOrId) { return this.onAll$(entityOrId).pipe(filter(msg => msg.realtimeAction === 'UPDATE'), map(msg => msg.data)); } /** * Get an Observable of all DELETE realtime notifications. * * @param {string | number | IIdentified} entityOrId Entity object or id * * @returns An [[Observable]] of deleted entity objects. */ onDelete$(entityOrId) { return this.onAll$(entityOrId).pipe(filter(msg => msg.realtimeAction === 'DELETE'), map(msg => coerceNumberProperty(msg.data))); } getIdString(reference) { let id; if (typeof reference === 'object') { id = reference.id; } else { id = reference; } return String(id); } getChannel(entityOrId) { return entityOrId ? this.channel().replace('*', this.getIdString(entityOrId)) : this.channel(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbHRpbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcmVhbHRpbWUvcmVhbHRpbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4RDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsZUFBZTtJQUNuQzs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQztJQUNoRCxDQUFDO0lBSUQsWUFBc0IsZUFBdUM7UUFBdkMsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBRnJELGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUVVLENBQUM7SUFFakU7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFVBQTBDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxTQUFTLENBQUMsVUFBMEM7UUFDbEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxRQUFRLENBQUMsRUFDOUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQVMsQ0FBQyxDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxVQUEwQztRQUNsRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQyxFQUM5QyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBUyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsU0FBUyxDQUFDLFVBQTBDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDLEVBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVTLFdBQVcsQ0FBQyxTQUF3QztRQUM1RCxJQUFJLEVBQW1CLENBQUM7UUFDeEIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNOLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFUyxVQUFVLENBQUMsVUFBMEM7UUFDN0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pHLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IElJZGVudGlmaWVkIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBORVZFUiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlYWx0aW1lU3ViamVjdFNlcnZpY2UgfSBmcm9tICcuL3JlYWx0aW1lLXN1YmplY3Quc2VydmljZSc7XG5pbXBvcnQgeyBSZWFsdGltZU1lc3NhZ2UgfSBmcm9tICcuL3JlYWx0aW1lLm1vZGVsJztcblxuLyoqXG4gKiBBIHdyYXBwZXIgY2xhc3MgZm9yIGhhbmRsaW5nIHJlYWx0aW1lIG5vdGlmaWNhdGlvbnMgaW4gUnhKUyBmYXNoaW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVhbHRpbWVTZXJ2aWNlPFQ+IHtcbiAgLyoqXG4gICAqIEEgZmxhZyBkaXNwbGF5aW5nIGlmIHJlYWx0aW1lIG5vdGlmaWNhdGlvbnMgYXJlIGN1cnJlbnRseSBhY3RpdmUuXG4gICAqL1xuICBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWN0aXZlLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG9ic2VydmFibGUgZW1pdHRpbmcgYSB2YWx1ZSBpbiBjYXNlIHRoZSByZWFsdGltZSBjb25uZWN0aW9uIGhhcyBiZWVuIGludGVycnVwdGVkLlxuICAgKiBDYW4gYmUgdXNlZCB0byByZWxvYWQgZGF0YSBvZiBlLmcuIGEgZGF0YXBvaW50IGdyYXBoIHRoYXQgd2Fzbid0IHJlY2VpdmVkIHdoaWxlIHJlYWx0aW1lIHdhcyBpbnRlcnJ1cHRlZC5cbiAgICovXG4gIGdldCByZWNvbm5lY3QkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lU3ViamVjdC5yZWNvbm5lY3QkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG9ic2VydmFibGUgZW1pdHRpbmcgZWl0aGVyIGBjb25uZWN0ZWRgIG9yIGBkaXNjb25uZWN0ZWRgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIHJlYWx0aW1lIGNvbm5lY3Rpb24uXG4gICAqIENhbiBiZSB1c2VkIHRvIGUuZy4gaW5mb3JtIHRoZSB1c2VyIGFib3V0IHRoZSBpbnRlcnJ1cHRlZCByZWFsdGltZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgZ2V0IGNvbm5lY3Rpb25TdGF0dXMkKCk6IE9ic2VydmFibGU8J2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJz4ge1xuICAgIHJldHVybiB0aGlzLnJlYWx0aW1lU3ViamVjdC5jb25uZWN0aW9uU3RhdHVzJDtcbiAgfVxuXG4gIHByaXZhdGUgaXNBY3RpdmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFsdGltZVN1YmplY3Q6IFJlYWx0aW1lU3ViamVjdFNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBPYnNlcnZhYmxlIG9mIGFsbCByZWFsdGltZSBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IElJZGVudGlmaWVkfSBlbnRpdHlPcklkIEVudGl0eSBvYmplY3Qgb3IgaWRcbiAgICpcbiAgICogQHJldHVybnMgQW4gW1tPYnNlcnZhYmxlXV0gb2Ygbm90aWZpY2F0aW9ucyB3cmFwcGVkIGFzIFtbUmVhbHRpbWVNZXNzYWdlXV1cbiAgICovXG4gIG9uQWxsJChlbnRpdHlPcklkPzogc3RyaW5nIHwgbnVtYmVyIHwgSUlkZW50aWZpZWQpOiBPYnNlcnZhYmxlPFJlYWx0aW1lTWVzc2FnZTxUPj4ge1xuICAgIGNvbnN0IHN1YmplY3QkID0gdGhpcy5yZWFsdGltZVN1YmplY3QuZ2V0T2JzZXJ2YWJsZUZvckNoYW5uZWw8VD4odGhpcy5nZXRDaGFubmVsKGVudGl0eU9ySWQpKTtcblxuICAgIHJldHVybiB0aGlzLmlzQWN0aXZlLnBpcGUoc3dpdGNoTWFwKGFjdGl2ZSA9PiAoYWN0aXZlID8gc3ViamVjdCQgOiBORVZFUikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGFnYWluIGFsbCByZWFsdGltZSBjaGFubmVscyB3aXRoIGFjdGl2ZSBvYnNlcnZlcnMuXG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICB0aGlzLmlzQWN0aXZlLm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHJlYWx0aW1lIG5vdGlmaWNhdGlvbnMgYW5kIHVuc3Vic2NyaWJlcyBhbGwgcmVhbHRpbWUgY2hhbm5lbHMuXG4gICAqL1xuICBzdG9wKCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgdGhpcy5pc0FjdGl2ZS5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIE9ic2VydmFibGUgb2YgYWxsIENSRUFURSByZWFsdGltZSBub3RpZmljYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IElJZGVudGlmaWVkfSBlbnRpdHlPcklkIEVudGl0eSBvYmplY3Qgb3IgaWRcbiAgICpcbiAgICogQHJldHVybnMgQW4gW1tPYnNlcnZhYmxlXV0gb2YgbmV3bHkgY3JlYXRlZCBlbnRpdHkgb2JqZWN0cy5cbiAgICovXG4gIG9uQ3JlYXRlJChlbnRpdHlPcklkPzogc3RyaW5nIHwgbnVtYmVyIHwgSUlkZW50aWZpZWQpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5vbkFsbCQoZW50aXR5T3JJZCkucGlwZShcbiAgICAgIGZpbHRlcihtc2cgPT4gbXNnLnJlYWx0aW1lQWN0aW9uID09PSAnQ1JFQVRFJyksXG4gICAgICBtYXAobXNnID0+IG1zZy5kYXRhIGFzIFQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gT2JzZXJ2YWJsZSBvZiBhbGwgVVBEQVRFIHJlYWx0aW1lIG5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgSUlkZW50aWZpZWR9IGVudGl0eU9ySWQgRW50aXR5IG9iamVjdCBvciBpZFxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBbW09ic2VydmFibGVdXSBvZiB1cGRhdGVkIGVudGl0eSBvYmplY3RzLlxuICAgKi9cbiAgb25VcGRhdGUkKGVudGl0eU9ySWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBJSWRlbnRpZmllZCk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLm9uQWxsJChlbnRpdHlPcklkKS5waXBlKFxuICAgICAgZmlsdGVyKG1zZyA9PiBtc2cucmVhbHRpbWVBY3Rpb24gPT09ICdVUERBVEUnKSxcbiAgICAgIG1hcChtc2cgPT4gbXNnLmRhdGEgYXMgVClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBPYnNlcnZhYmxlIG9mIGFsbCBERUxFVEUgcmVhbHRpbWUgbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBJSWRlbnRpZmllZH0gZW50aXR5T3JJZCBFbnRpdHkgb2JqZWN0IG9yIGlkXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIFtbT2JzZXJ2YWJsZV1dIG9mIGRlbGV0ZWQgZW50aXR5IG9iamVjdHMuXG4gICAqL1xuICBvbkRlbGV0ZSQoZW50aXR5T3JJZD86IHN0cmluZyB8IG51bWJlciB8IElJZGVudGlmaWVkKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5vbkFsbCQoZW50aXR5T3JJZCkucGlwZShcbiAgICAgIGZpbHRlcihtc2cgPT4gbXNnLnJlYWx0aW1lQWN0aW9uID09PSAnREVMRVRFJyksXG4gICAgICBtYXAobXNnID0+IGNvZXJjZU51bWJlclByb3BlcnR5KG1zZy5kYXRhKSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldElkU3RyaW5nKHJlZmVyZW5jZTogbnVtYmVyIHwgc3RyaW5nIHwgSUlkZW50aWZpZWQpOiBzdHJpbmcge1xuICAgIGxldCBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlkID0gcmVmZXJlbmNlO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDaGFubmVsKGVudGl0eU9ySWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBJSWRlbnRpZmllZCkge1xuICAgIHJldHVybiBlbnRpdHlPcklkID8gdGhpcy5jaGFubmVsKCkucmVwbGFjZSgnKicsIHRoaXMuZ2V0SWRTdHJpbmcoZW50aXR5T3JJZCkpIDogdGhpcy5jaGFubmVsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2hhbm5lbCgpOiBzdHJpbmc7XG59XG4iXX0=