@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
77 lines • 11.9 kB
JavaScript
import { Injectable } from '@angular/core';
import { MeasurementService } from '@c8y/client';
import { from, merge } from 'rxjs';
import { filter, map, switchMap } from 'rxjs/operators';
import { RealtimeSubjectService } from './realtime-subject.service';
import { RealtimeService } from './realtime.service';
import * as i0 from "@angular/core";
import * as i1 from "./realtime-subject.service";
import * as i2 from "@c8y/client";
export class MeasurementRealtimeService extends RealtimeService {
constructor(realtimeSubject, measurementService) {
super(realtimeSubject);
this.realtimeSubject = realtimeSubject;
this.measurementService = measurementService;
}
/**
* Get an Observable of all measurements filtered by fragment and series.
*
* @param {string} fragment Measurement fragment
*
* @param {string} series Measurement series
*
* @param {string | number | IIdentified} entityOrId Entity object or id
*
* @returns An [[Observable]] of newly created entity objects.
*/
onCreateOfSpecificMeasurement$(fragment, series, entityOrId) {
return this.onCreate$(entityOrId).pipe(filter(msg => msg[fragment] && msg[fragment][series]));
}
/**
* Get an Observable of all measurements filtered by fragment and series.
* Combines the latest value from measurement API and future values via realtime API.
*
* @param {string} fragment Measurement fragment
*
* @param {string} series Measurement series
*
* @param {string | number | IIdentified} entityOrId Entity object or id
*
* @param {number} pageSize Number of measurements to initially retrieve from backend
*
* @param {boolean} emitNullIfInitialValuesWereNotFound Flag that if set to true will initially emit value of null in case no measurement could have been retrieved from backend
*
* @returns An [[Observable]] of newly created entity objects.
*/
latestValueOfSpecificMeasurement$(fragment, series, entityOrId, pageSize = 1, emitNullIfInitialValuesWereNotFound = false) {
const realtime$ = this.onCreateOfSpecificMeasurement$(fragment, series, entityOrId);
const lastMeasurement$ = this.lastMeasurement$(fragment, series, entityOrId, pageSize, emitNullIfInitialValuesWereNotFound);
return merge(lastMeasurement$, realtime$);
}
lastMeasurement$(fragment, series, entityOrId, pageSize, emitNullIfInitialValuesWereNotFound = false) {
return from(this.measurementService.list({
valueFragmentSeries: series,
valueFragmentType: fragment,
source: this.getIdString(entityOrId),
dateFrom: '1970-01-01',
revert: true,
pageSize
})).pipe(
// emit null in case no value could have been retrieved so we are able to note that in certain cases.
map(result => !emitNullIfInitialValuesWereNotFound || result.data.length ? result.data : [null]),
// reverse required, so that measurements are received ordered by time (ascending).
// from ensures values are sent as single measurements and not a measurement array.
// TODO: replace `[...result].reverse()` with `result.toReversed()` once es2023 is available.
// Had to clone the result array as otherwise reverse may alternate the array multiple times if the observable is subscribed multiple times.
switchMap(result => from([...result].reverse())));
}
channel() {
return '/measurements/*';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasurementRealtimeService, deps: [{ token: i1.RealtimeSubjectService }, { token: i2.MeasurementService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasurementRealtimeService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasurementRealtimeService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.RealtimeSubjectService }, { type: i2.MeasurementService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZW1lbnQtcmVhbHRpbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcmVhbHRpbWUvbWVhc3VyZW1lbnQtcmVhbHRpbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7O0FBR3JELE1BQU0sT0FBTywwQkFBMkIsU0FBUSxlQUE2QjtJQUMzRSxZQUNZLGVBQXVDLEVBQ3ZDLGtCQUFzQztRQUVoRCxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFIYixvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtJQUdsRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILDhCQUE4QixDQUM1QixRQUFnQixFQUNoQixNQUFjLEVBQ2QsVUFBMEM7UUFFMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsaUNBQWlDLENBQy9CLFFBQWdCLEVBQ2hCLE1BQWMsRUFDZCxVQUF5QyxFQUN6QyxRQUFRLEdBQUcsQ0FBQyxFQUNaLG1DQUFtQyxHQUFHLEtBQUs7UUFFM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQzVDLFFBQVEsRUFDUixNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixtQ0FBbUMsQ0FDcEMsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFUyxnQkFBZ0IsQ0FDeEIsUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFVBQXlDLEVBQ3pDLFFBQWdCLEVBQ2hCLG1DQUFtQyxHQUFHLEtBQUs7UUFFM0MsT0FBTyxJQUFJLENBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUMzQixtQkFBbUIsRUFBRSxNQUFNO1lBQzNCLGlCQUFpQixFQUFFLFFBQVE7WUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUTtTQUNULENBQUMsQ0FDSCxDQUFDLElBQUk7UUFDSixxR0FBcUc7UUFDckcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ1gsQ0FBQyxtQ0FBbUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDbEY7UUFDRCxtRkFBbUY7UUFDbkYsbUZBQW1GO1FBQ25GLDZGQUE2RjtRQUM3Riw0SUFBNEk7UUFDNUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBRVMsT0FBTztRQUNmLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQzsrR0E1RlUsMEJBQTBCO21IQUExQiwwQkFBMEI7OzRGQUExQiwwQkFBMEI7a0JBRHRDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJSWRlbnRpZmllZCwgSU1lYXN1cmVtZW50LCBNZWFzdXJlbWVudFNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBmcm9tLCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlYWx0aW1lU3ViamVjdFNlcnZpY2UgfSBmcm9tICcuL3JlYWx0aW1lLXN1YmplY3Quc2VydmljZSc7XG5pbXBvcnQgeyBSZWFsdGltZVNlcnZpY2UgfSBmcm9tICcuL3JlYWx0aW1lLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UgZXh0ZW5kcyBSZWFsdGltZVNlcnZpY2U8SU1lYXN1cmVtZW50PiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFsdGltZVN1YmplY3Q6IFJlYWx0aW1lU3ViamVjdFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1lYXN1cmVtZW50U2VydmljZTogTWVhc3VyZW1lbnRTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKHJlYWx0aW1lU3ViamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIE9ic2VydmFibGUgb2YgYWxsIG1lYXN1cmVtZW50cyBmaWx0ZXJlZCBieSBmcmFnbWVudCBhbmQgc2VyaWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnJhZ21lbnQgTWVhc3VyZW1lbnQgZnJhZ21lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcmllcyBNZWFzdXJlbWVudCBzZXJpZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBJSWRlbnRpZmllZH0gZW50aXR5T3JJZCBFbnRpdHkgb2JqZWN0IG9yIGlkXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIFtbT2JzZXJ2YWJsZV1dIG9mIG5ld2x5IGNyZWF0ZWQgZW50aXR5IG9iamVjdHMuXG4gICAqL1xuICBvbkNyZWF0ZU9mU3BlY2lmaWNNZWFzdXJlbWVudCQoXG4gICAgZnJhZ21lbnQ6IHN0cmluZyxcbiAgICBzZXJpZXM6IHN0cmluZyxcbiAgICBlbnRpdHlPcklkPzogc3RyaW5nIHwgbnVtYmVyIHwgSUlkZW50aWZpZWRcbiAgKTogT2JzZXJ2YWJsZTxJTWVhc3VyZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5vbkNyZWF0ZSQoZW50aXR5T3JJZCkucGlwZShmaWx0ZXIobXNnID0+IG1zZ1tmcmFnbWVudF0gJiYgbXNnW2ZyYWdtZW50XVtzZXJpZXNdKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIE9ic2VydmFibGUgb2YgYWxsIG1lYXN1cmVtZW50cyBmaWx0ZXJlZCBieSBmcmFnbWVudCBhbmQgc2VyaWVzLlxuICAgKiBDb21iaW5lcyB0aGUgbGF0ZXN0IHZhbHVlIGZyb20gbWVhc3VyZW1lbnQgQVBJIGFuZCBmdXR1cmUgdmFsdWVzIHZpYSByZWFsdGltZSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcmFnbWVudCBNZWFzdXJlbWVudCBmcmFnbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VyaWVzIE1lYXN1cmVtZW50IHNlcmllc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IElJZGVudGlmaWVkfSBlbnRpdHlPcklkIEVudGl0eSBvYmplY3Qgb3IgaWRcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VTaXplIE51bWJlciBvZiBtZWFzdXJlbWVudHMgdG8gaW5pdGlhbGx5IHJldHJpZXZlIGZyb20gYmFja2VuZFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVtaXROdWxsSWZJbml0aWFsVmFsdWVzV2VyZU5vdEZvdW5kIEZsYWcgdGhhdCBpZiBzZXQgdG8gdHJ1ZSB3aWxsIGluaXRpYWxseSBlbWl0IHZhbHVlIG9mIG51bGwgaW4gY2FzZSBubyBtZWFzdXJlbWVudCBjb3VsZCBoYXZlIGJlZW4gcmV0cmlldmVkIGZyb20gYmFja2VuZFxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBbW09ic2VydmFibGVdXSBvZiBuZXdseSBjcmVhdGVkIGVudGl0eSBvYmplY3RzLlxuICAgKi9cbiAgbGF0ZXN0VmFsdWVPZlNwZWNpZmljTWVhc3VyZW1lbnQkKFxuICAgIGZyYWdtZW50OiBzdHJpbmcsXG4gICAgc2VyaWVzOiBzdHJpbmcsXG4gICAgZW50aXR5T3JJZDogc3RyaW5nIHwgbnVtYmVyIHwgSUlkZW50aWZpZWQsXG4gICAgcGFnZVNpemUgPSAxLFxuICAgIGVtaXROdWxsSWZJbml0aWFsVmFsdWVzV2VyZU5vdEZvdW5kID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgcmVhbHRpbWUkID0gdGhpcy5vbkNyZWF0ZU9mU3BlY2lmaWNNZWFzdXJlbWVudCQoZnJhZ21lbnQsIHNlcmllcywgZW50aXR5T3JJZCk7XG4gICAgY29uc3QgbGFzdE1lYXN1cmVtZW50JCA9IHRoaXMubGFzdE1lYXN1cmVtZW50JChcbiAgICAgIGZyYWdtZW50LFxuICAgICAgc2VyaWVzLFxuICAgICAgZW50aXR5T3JJZCxcbiAgICAgIHBhZ2VTaXplLFxuICAgICAgZW1pdE51bGxJZkluaXRpYWxWYWx1ZXNXZXJlTm90Rm91bmRcbiAgICApO1xuICAgIHJldHVybiBtZXJnZShsYXN0TWVhc3VyZW1lbnQkLCByZWFsdGltZSQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxhc3RNZWFzdXJlbWVudCQoXG4gICAgZnJhZ21lbnQ6IHN0cmluZyxcbiAgICBzZXJpZXM6IHN0cmluZyxcbiAgICBlbnRpdHlPcklkOiBzdHJpbmcgfCBudW1iZXIgfCBJSWRlbnRpZmllZCxcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxuICAgIGVtaXROdWxsSWZJbml0aWFsVmFsdWVzV2VyZU5vdEZvdW5kID0gZmFsc2VcbiAgKSB7XG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5saXN0KHtcbiAgICAgICAgdmFsdWVGcmFnbWVudFNlcmllczogc2VyaWVzLFxuICAgICAgICB2YWx1ZUZyYWdtZW50VHlwZTogZnJhZ21lbnQsXG4gICAgICAgIHNvdXJjZTogdGhpcy5nZXRJZFN0cmluZyhlbnRpdHlPcklkKSxcbiAgICAgICAgZGF0ZUZyb206ICcxOTcwLTAxLTAxJyxcbiAgICAgICAgcmV2ZXJ0OiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZVxuICAgICAgfSlcbiAgICApLnBpcGUoXG4gICAgICAvLyBlbWl0IG51bGwgaW4gY2FzZSBubyB2YWx1ZSBjb3VsZCBoYXZlIGJlZW4gcmV0cmlldmVkIHNvIHdlIGFyZSBhYmxlIHRvIG5vdGUgdGhhdCBpbiBjZXJ0YWluIGNhc2VzLlxuICAgICAgbWFwKHJlc3VsdCA9PlxuICAgICAgICAhZW1pdE51bGxJZkluaXRpYWxWYWx1ZXNXZXJlTm90Rm91bmQgfHwgcmVzdWx0LmRhdGEubGVuZ3RoID8gcmVzdWx0LmRhdGEgOiBbbnVsbF1cbiAgICAgICksXG4gICAgICAvLyByZXZlcnNlIHJlcXVpcmVkLCBzbyB0aGF0IG1lYXN1cmVtZW50cyBhcmUgcmVjZWl2ZWQgb3JkZXJlZCBieSB0aW1lIChhc2NlbmRpbmcpLlxuICAgICAgLy8gZnJvbSBlbnN1cmVzIHZhbHVlcyBhcmUgc2VudCBhcyBzaW5nbGUgbWVhc3VyZW1lbnRzIGFuZCBub3QgYSBtZWFzdXJlbWVudCBhcnJheS5cbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgYFsuLi5yZXN1bHRdLnJldmVyc2UoKWAgd2l0aCBgcmVzdWx0LnRvUmV2ZXJzZWQoKWAgb25jZSBlczIwMjMgaXMgYXZhaWxhYmxlLlxuICAgICAgLy8gSGFkIHRvIGNsb25lIHRoZSByZXN1bHQgYXJyYXkgYXMgb3RoZXJ3aXNlIHJldmVyc2UgbWF5IGFsdGVybmF0ZSB0aGUgYXJyYXkgbXVsdGlwbGUgdGltZXMgaWYgdGhlIG9ic2VydmFibGUgaXMgc3Vic2NyaWJlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4gZnJvbShbLi4ucmVzdWx0XS5yZXZlcnNlKCkpKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hhbm5lbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnL21lYXN1cmVtZW50cy8qJztcbiAgfVxufVxuIl19