UNPKG

@iotize/ionic

Version:

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

140 lines 17 kB
import { Injectable } from '@angular/core'; import { filter, first } from 'rxjs/operators'; import { UniqKeyQueue } from './uniq-key-queue'; import { toTapInfoKeyEquals, toTapInfoKeyObject } from './utility'; import { TapInfoCacheService } from './tap-info-cache.service'; import * as i0 from "@angular/core"; import * as i1 from "./tap-info-cache.service"; export class TapInfoRequestService { tapInfoCacheService; /** * Tap info keys to load queue */ queue = new UniqKeyQueue(toTapInfoKeyEquals); requestedTapInfoKeysChange = this.queue.queueChange; constructor(tapInfoCacheService) { this.tapInfoCacheService = tapInfoCacheService; } removeKeys(keys) { this.queue.remove(...keys); } getValue(key) { return this.getInfoValue(key); } getValues(values) { this.loadKeysIfNotInCache(values); return Promise.all(values.map((key) => this.tapInfoCacheService.value(key))); } reset() { this.queue.reset(); } getLoadedKeyInfoChange(info) { this.loadKeyIfNotInCache(info); return this.tapInfoCacheService.infoChange(info).pipe(filter((info) => { return info.error !== undefined || info.value !== undefined; })); } /** * Refresh all keys */ async refreshKeys(keysToRefresh) { return this._refreshKeys(keysToRefresh, true); } async _refreshKeys(keysToRefresh, clearCache) { // Append to refresh keys list. If we show dialog before nfc tap is done, it will // append keys to the refresh list if (clearCache) { const keys = keysToRefresh.map((key) => toTapInfoKeyObject(key)); this.tapInfoCacheService.clearKeys(keys); this.queue.add(...keys); } else { this.loadKeysIfNotInCache(keysToRefresh); } return await this.waitForKeySync(keysToRefresh); } /** * Refresh a single key * Resolve when refresh has been done (with error or success) */ async refreshKey(keyOrString) { let key = toTapInfoKeyObject(keyOrString); const nextValue = this.tapInfoCacheService .infoChange(key) .pipe(filter((v) => !!v.loadDate), first()) .toPromise(); this.queue.add(key); return await nextValue; } /** * @warning do not call this method inside executeTapAction or it will hang forever... * @param allKeys * @returns */ async refreshKeysIfNeeded(allKeys) { return this._refreshKeys(allKeys, false); } /** * Load key only if it's not already loaded * @param key key to load * @returns the info value */ async loadKeyIfNotInCache(key) { const snapshot = this.tapInfoCacheService.getInfoSnapshot(key); if (!snapshot?.loadDate) { return this.refreshKey(key); } return snapshot; } /** * Load key only if it's not already loaded * @param key keys to load */ loadKeysIfNotInCache(infos) { const notInCacheKeys = infos.map(toTapInfoKeyObject).filter((key) => { return !this.tapInfoCacheService.isValueLoaded(key); }); this.queue.add(...notInCacheKeys); } /** * Load key info * If key has not been loaded for the device yet, it will to loaded it * @param key * @param params * @returns */ loadKeyInfoChange(key) { key = toTapInfoKeyObject(key); const obs = this.tapInfoCacheService.infoChange(key); this.loadKeyIfNotInCache(key); return obs; } /** * * @param info: TapInfo */ async getInfoValue(info) { await this.loadKeyIfNotInCache(info); return this.tapInfoCacheService.value(info); } async waitForKeySync(keysToWait) { if (keysToWait.length === 0) { return; } await this.queue.queueChange .pipe(filter((currentKeysToRefresh) => { const remainingKeyToSync = currentKeysToRefresh.find((currentKey) => keysToWait.find((key) => toTapInfoKeyEquals(currentKey, toTapInfoKeyObject(key)))); return !remainingKeyToSync; }), first()) .toPromise(); } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoRequestService, deps: [{ token: i1.TapInfoCacheService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoRequestService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoRequestService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: () => [{ type: i1.TapInfoCacheService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tcmVxdWVzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL3NyYy9saWIvdGFwLWluZm8vdGFwLWluZm8tcmVxdWVzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0vQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFPL0QsTUFBTSxPQUFPLHFCQUFxQjtJQVFaO0lBUHBCOztPQUVHO0lBQ2MsS0FBSyxHQUFHLElBQUksWUFBWSxDQUFhLGtCQUFrQixDQUFDLENBQUM7SUFFakUsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFFN0QsWUFBb0IsbUJBQXdDO1FBQXhDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7SUFBRyxDQUFDO0lBRWhFLFVBQVUsQ0FBQyxJQUFrQjtRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRLENBQWEsR0FBNkI7UUFDaEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxTQUFTLENBQ1AsTUFBa0M7UUFFbEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsTUFBTSxDQUFDLEdBQUcs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QUFDLENBQ3hELENBQ0YsQ0FBQztZQUNGLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QixDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDUjthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7MkhBaEtVLHFCQUFxQjsrSEFBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1N0YXRlIH0gZnJvbSAnQGlvdGl6ZS9jb21tb24vcHJvZ3Jlc3MvYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBUYXBJbmZvSG9sZGVyLFxuICBUYXBJbmZvS2V5LFxuICBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsXG59IGZyb20gJy4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgVW5pcUtleVF1ZXVlIH0gZnJvbSAnLi91bmlxLWtleS1xdWV1ZSc7XG5pbXBvcnQgeyB0b1RhcEluZm9LZXlFcXVhbHMsIHRvVGFwSW5mb0tleU9iamVjdCB9IGZyb20gJy4vdXRpbGl0eSc7XG5cbmltcG9ydCB7IFRhcEluZm9DYWNoZVNlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNhY2hlLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBSZWZyZXNoS2V5c1Byb2dyZXNzU3RhdGUgPSBQcm9ncmVzc1N0YXRlICYge307XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBJbmZvUmVxdWVzdFNlcnZpY2Uge1xuICAvKipcbiAgICogVGFwIGluZm8ga2V5cyB0byBsb2FkIHF1ZXVlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlID0gbmV3IFVuaXFLZXlRdWV1ZTxUYXBJbmZvS2V5Pih0b1RhcEluZm9LZXlFcXVhbHMpO1xuXG4gIHJlYWRvbmx5IHJlcXVlc3RlZFRhcEluZm9LZXlzQ2hhbmdlID0gdGhpcy5xdWV1ZS5xdWV1ZUNoYW5nZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcEluZm9DYWNoZVNlcnZpY2U6IFRhcEluZm9DYWNoZVNlcnZpY2UpIHt9XG5cbiAgcmVtb3ZlS2V5cyhrZXlzOiBUYXBJbmZvS2V5W10pIHtcbiAgICB0aGlzLnF1ZXVlLnJlbW92ZSguLi5rZXlzKTtcbiAgfVxuXG4gIGdldFZhbHVlPFQgPSBzdHJpbmc+KGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5mb1ZhbHVlPFQ+KGtleSk7XG4gIH1cblxuICBnZXRWYWx1ZXM8VCBleHRlbmRzIGFueVtdID0gdW5rbm93bltdPihcbiAgICB2YWx1ZXM6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1tdXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRoaXMubG9hZEtleXNJZk5vdEluQ2FjaGUodmFsdWVzKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB2YWx1ZXMubWFwKChrZXkpID0+IHRoaXMudGFwSW5mb0NhY2hlU2VydmljZS52YWx1ZShrZXkpKVxuICAgICkgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMucXVldWUucmVzZXQoKTtcbiAgfVxuXG4gIGdldExvYWRlZEtleUluZm9DaGFuZ2U8VD4oXG4gICAgaW5mbzogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nXG4gICk6IE9ic2VydmFibGU8VGFwSW5mb0hvbGRlcjxUPj4ge1xuICAgIHRoaXMubG9hZEtleUlmTm90SW5DYWNoZShpbmZvKTtcbiAgICByZXR1cm4gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmluZm9DaGFuZ2U8VD4oaW5mbykucGlwZShcbiAgICAgIGZpbHRlcigoaW5mbykgPT4ge1xuICAgICAgICByZXR1cm4gaW5mby5lcnJvciAhPT0gdW5kZWZpbmVkIHx8IGluZm8udmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIGFsbCBrZXlzXG4gICAqL1xuICBhc3luYyByZWZyZXNoS2V5cyhrZXlzVG9SZWZyZXNoOiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLl9yZWZyZXNoS2V5cyhrZXlzVG9SZWZyZXNoLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlZnJlc2hLZXlzKFxuICAgIGtleXNUb1JlZnJlc2g6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1tdLFxuICAgIGNsZWFyQ2FjaGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgLy8gQXBwZW5kIHRvIHJlZnJlc2gga2V5cyBsaXN0LiBJZiB3ZSBzaG93IGRpYWxvZyBiZWZvcmUgbmZjIHRhcCBpcyBkb25lLCBpdCB3aWxsXG4gICAgLy8gYXBwZW5kIGtleXMgdG8gdGhlIHJlZnJlc2ggbGlzdFxuICAgIGlmIChjbGVhckNhY2hlKSB7XG4gICAgICBjb25zdCBrZXlzID0ga2V5c1RvUmVmcmVzaC5tYXAoKGtleSkgPT4gdG9UYXBJbmZvS2V5T2JqZWN0KGtleSkpO1xuICAgICAgdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmNsZWFyS2V5cyhrZXlzKTtcbiAgICAgIHRoaXMucXVldWUuYWRkKC4uLmtleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRLZXlzSWZOb3RJbkNhY2hlKGtleXNUb1JlZnJlc2gpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy53YWl0Rm9yS2V5U3luYyhrZXlzVG9SZWZyZXNoKTtcbiAgfVxuICAvKipcbiAgICogUmVmcmVzaCBhIHNpbmdsZSBrZXlcbiAgICogUmVzb2x2ZSB3aGVuIHJlZnJlc2ggaGFzIGJlZW4gZG9uZSAod2l0aCBlcnJvciBvciBzdWNjZXNzKVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaEtleTxUPihcbiAgICBrZXlPclN0cmluZzogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nXG4gICk6IFByb21pc2U8VGFwSW5mb0hvbGRlcjxUPj4ge1xuICAgIGxldCBrZXkgPSB0b1RhcEluZm9LZXlPYmplY3Qoa2V5T3JTdHJpbmcpO1xuICAgIGNvbnN0IG5leHRWYWx1ZSA9IHRoaXMudGFwSW5mb0NhY2hlU2VydmljZVxuICAgICAgLmluZm9DaGFuZ2U8VD4oa2V5KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigodikgPT4gISF2LmxvYWREYXRlKSxcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpIGFzIFByb21pc2U8VGFwSW5mb0hvbGRlcjxUPj47XG4gICAgdGhpcy5xdWV1ZS5hZGQoa2V5KTtcbiAgICByZXR1cm4gYXdhaXQgbmV4dFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB3YXJuaW5nIGRvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGluc2lkZSBleGVjdXRlVGFwQWN0aW9uIG9yIGl0IHdpbGwgaGFuZyBmb3JldmVyLi4uXG4gICAqIEBwYXJhbSBhbGxLZXlzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyByZWZyZXNoS2V5c0lmTmVlZGVkKGFsbEtleXM6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hLZXlzKGFsbEtleXMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGtleSBvbmx5IGlmIGl0J3Mgbm90IGFscmVhZHkgbG9hZGVkXG4gICAqIEBwYXJhbSBrZXkga2V5IHRvIGxvYWRcbiAgICogQHJldHVybnMgdGhlIGluZm8gdmFsdWVcbiAgICovXG4gIGFzeW5jIGxvYWRLZXlJZk5vdEluQ2FjaGU8VD4oXG4gICAga2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdcbiAgKTogUHJvbWlzZTxUYXBJbmZvSG9sZGVyPFQ+PiB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2UuZ2V0SW5mb1NuYXBzaG90PFQ+KGtleSk7XG4gICAgaWYgKCFzbmFwc2hvdD8ubG9hZERhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hLZXk8VD4oa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQga2V5IG9ubHkgaWYgaXQncyBub3QgYWxyZWFkeSBsb2FkZWRcbiAgICogQHBhcmFtIGtleSBrZXlzIHRvIGxvYWRcbiAgICovXG4gIGxvYWRLZXlzSWZOb3RJbkNhY2hlKGluZm9zOiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdbXSkge1xuICAgIGNvbnN0IG5vdEluQ2FjaGVLZXlzID0gaW5mb3MubWFwKHRvVGFwSW5mb0tleU9iamVjdCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgIHJldHVybiAhdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmlzVmFsdWVMb2FkZWQoa2V5KTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXVlLmFkZCguLi5ub3RJbkNhY2hlS2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBrZXkgaW5mb1xuICAgKiBJZiBrZXkgaGFzIG5vdCBiZWVuIGxvYWRlZCBmb3IgdGhlIGRldmljZSB5ZXQsIGl0IHdpbGwgdG8gbG9hZGVkIGl0XG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgbG9hZEtleUluZm9DaGFuZ2U8VD4oXG4gICAga2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxUYXBJbmZvSG9sZGVyPFQ+PiB7XG4gICAga2V5ID0gdG9UYXBJbmZvS2V5T2JqZWN0KGtleSk7XG4gICAgY29uc3Qgb2JzID0gdGhpcy50YXBJbmZvQ2FjaGVTZXJ2aWNlLmluZm9DaGFuZ2U8VD4oa2V5KTtcbiAgICB0aGlzLmxvYWRLZXlJZk5vdEluQ2FjaGUoa2V5KTtcbiAgICByZXR1cm4gb2JzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpbmZvOiBUYXBJbmZvXG4gICAqL1xuICBhc3luYyBnZXRJbmZvVmFsdWU8VCA9IHN0cmluZz4oaW5mbzogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkS2V5SWZOb3RJbkNhY2hlPFQ+KGluZm8pO1xuICAgIHJldHVybiB0aGlzLnRhcEluZm9DYWNoZVNlcnZpY2UudmFsdWUoaW5mbyk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yS2V5U3luYyhrZXlzVG9XYWl0OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdbXSkge1xuICAgIGlmIChrZXlzVG9XYWl0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnF1ZXVlLnF1ZXVlQ2hhbmdlXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChjdXJyZW50S2V5c1RvUmVmcmVzaCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0tleVRvU3luYyA9IGN1cnJlbnRLZXlzVG9SZWZyZXNoLmZpbmQoKGN1cnJlbnRLZXkpID0+XG4gICAgICAgICAgICBrZXlzVG9XYWl0LmZpbmQoKGtleSkgPT5cbiAgICAgICAgICAgICAgdG9UYXBJbmZvS2V5RXF1YWxzKGN1cnJlbnRLZXksIHRvVGFwSW5mb0tleU9iamVjdChrZXkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICFyZW1haW5pbmdLZXlUb1N5bmM7XG4gICAgICAgIH0pLFxuICAgICAgICBmaXJzdCgpXG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cbn1cbiJdfQ==