UNPKG

@iotize/ionic

Version:

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

171 lines 19.2 kB
import { Injectable } from '@angular/core'; import { isCodeError } from '@iotize/common/error'; import { TapError } from '@iotize/tap'; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged, filter, first, map } from 'rxjs/operators'; import { debug } from '../logger'; import { TapInfoConfigService } from './tap-info-config.service'; import { createCacheKey, toTapInfoKeyObject } from './utility'; import * as i0 from "@angular/core"; import * as i1 from "./tap-info-config.service"; const TAG = 'TapInfoCacheService'; /** * Will be renamed as TapConfigSyncService */ export class TapInfoCacheService { constructor(tapInfoConfigService) { this.tapInfoConfigService = tapInfoConfigService; /** * Observables of infos */ this._infoChange = {}; } /** * Subscribe to value change. Will be notified each time value for the given key changes * @param key * @returns */ valueChange(key) { return this.infoChange(key).pipe(filter((v) => !v.error && v.value !== undefined), map((v) => { return v.value; }), distinctUntilChanged()); } /** * If value has already been loaded, it will be returned otherwise it will wait for a value to be resolved * @param info * @returns */ value(info) { return this.valueChange(info).pipe(first()).toPromise(); // TODO fix type } infoChange(key) { return this._createInfoObservableIfRequired(toTapInfoKeyObject(key)); } clearKeys(keys) { keys.forEach((key) => { this.clearKey(key); }); } getInfoSnapshot(key) { return this._infoChange[createCacheKey(toTapInfoKeyObject(key))]?.value; } clearKey(key) { const objectKey = toTapInfoKeyObject(key); if (this.isInfoLoaded(objectKey)) { const cacheKey = createCacheKey(objectKey); debug(TAG, `clear key "${cacheKey}"`); // delete this._info[cacheKey]; this._infoChange[cacheKey]?.next({ loadDate: undefined, }); } } reset() { Object.keys(this._infoChange).forEach((key) => { this.clearKey(key); }); // this._info = {}; } /** * Return true if value has been loaded, even if it has errors */ isInfoLoaded(key) { const cacheKey = createCacheKey(toTapInfoKeyObject(key)); return this._infoChange[cacheKey]?.value.loadDate !== undefined; } /** * Returns true if value has been loaded. */ isValueLoaded(key) { const valueHolder = this.getInfoSnapshot(key); if (!valueHolder) { return; } return (valueHolder.value !== undefined || (valueHolder.error && isCodeError(TapError.Code.ResponseStatusError, valueHolder.error))); } setKeyError(key, error) { return this.setKeyInfo(key, { error: error, loadDate: new Date(), }); } setKeyValue(key, value) { return this.setKeyInfo(key, { value, loadDate: new Date(), }); } setKeyFromResponse(key, r) { try { this.setKeyValue(key, r.body()); } catch (err) { this.setKeyError(key, err); } } setKeyInfo(key, value) { key = toTapInfoKeyObject(key); const cacheKey = createCacheKey(key); debug(TAG, `setKeyValue "${cacheKey}": `, value); if (value.error) { this.notifyKeyError(key, value.error); } else { this.notifyNewValue(key, value.value); } return value; } /** * Notify new key value */ notifyNewValue(key, value) { const obs = this._createInfoObservableIfRequired(key); obs.next({ value: value, loadDate: new Date(), }); } /** * Notify new key error * @param key: TapInfo * @param err: Error * @param params?: any[] */ notifyKeyError(key, err) { debug(TAG, key, 'error with', err); const obs = this._createInfoObservableIfRequired(key); obs.next({ error: err, loadDate: new Date(), }); } /** * @deprecated use {@link isInfoLoaded()} instead * @param key * @returns */ isKeyInCache(key) { return this.isInfoLoaded(key); } _createInfoObservableIfRequired(key) { const cacheKey = createCacheKey(key); if (!this._infoChange[cacheKey]) { debug(TAG, `create new observable cache key "${cacheKey}"`); this._infoChange[cacheKey] = new BehaviorSubject({ loadDate: undefined, }); } return this._infoChange[cacheKey]; } } /** @nocollapse */ TapInfoCacheService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoCacheService, deps: [{ token: i1.TapInfoConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ TapInfoCacheService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoCacheService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapInfoCacheService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.TapInfoConfigService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tY2FjaGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL3RhcC1pbmZvL3RhcC1pbmZvLWNhY2hlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBdUMsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU9sQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFFL0QsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUM7QUFJbEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sbUJBQW1CO0lBTzlCLFlBQW9CLG9CQUEwQztRQUExQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBTjlEOztXQUVHO1FBQ0ssZ0JBQVcsR0FDakIsRUFBRSxDQUFDO0lBRTRELENBQUM7SUFFbEU7Ozs7T0FJRztJQUNILFdBQVcsQ0FBSSxHQUE2QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FB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O09BS0c7SUFDSCxjQUFjLENBQUMsR0FBZSxFQUFFLEdBQVU7UUFDeEMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1AsS0FBSyxFQUFFLEdBQUc7WUFDVixRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUU7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsR0FBNkI7UUFDeEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDTywrQkFBK0IsQ0FDckMsR0FBZTtRQUVmLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMvQixLQUFLLENBQUMsR0FBRyxFQUFFLG9DQUFvQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxlQUFlLENBQWdCO2dCQUM5RCxRQUFRLEVBQUUsU0FBUzthQUNwQixDQUFDLENBQUM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDOztvSUEvS1UsbUJBQW1CO3dJQUFuQixtQkFBbUIsY0FGbEIsTUFBTTs0RkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNDb2RlRXJyb3IgfSBmcm9tICdAaW90aXplL2NvbW1vbi9lcnJvcic7XG5pbXBvcnQgeyBUYXBFcnJvciwgVGFwUmVzcG9uc2UsIFRhcFJlc3BvbnNlU3RhdHVzRXJyb3IgfSBmcm9tICdAaW90aXplL3RhcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpcnN0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQge1xuICBHZXRSZXNwb25zZVR5cGUsXG4gIFRhcEluZm9Ib2xkZXIsXG4gIFRhcEluZm9LZXksXG4gIFRhcEluZm9LZXlPYmplY3RPclN0cmluZyxcbn0gZnJvbSAnLi9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBUYXBJbmZvQ29uZmlnU2VydmljZSB9IGZyb20gJy4vdGFwLWluZm8tY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlQ2FjaGVLZXksIHRvVGFwSW5mb0tleU9iamVjdCB9IGZyb20gJy4vdXRpbGl0eSc7XG5cbmNvbnN0IFRBRyA9ICdUYXBJbmZvQ2FjaGVTZXJ2aWNlJztcblxudHlwZSBUYXBJbmZvQ2FjaGVLZXkgPSBzdHJpbmc7XG5cbi8qKlxuICogV2lsbCBiZSByZW5hbWVkIGFzIFRhcENvbmZpZ1N5bmNTZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBJbmZvQ2FjaGVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIE9ic2VydmFibGVzIG9mIGluZm9zXG4gICAqL1xuICBwcml2YXRlIF9pbmZvQ2hhbmdlOiBSZWNvcmQ8VGFwSW5mb0NhY2hlS2V5LCBCZWhhdmlvclN1YmplY3Q8VGFwSW5mb0hvbGRlcj4+ID1cbiAgICB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcEluZm9Db25maWdTZXJ2aWNlOiBUYXBJbmZvQ29uZmlnU2VydmljZSkge31cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZS4gV2lsbCBiZSBub3RpZmllZCBlYWNoIHRpbWUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgY2hhbmdlc1xuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB2YWx1ZUNoYW5nZTxUPihrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmluZm9DaGFuZ2U8VD4oa2V5KS5waXBlKFxuICAgICAgZmlsdGVyKCh2KSA9PiAhdi5lcnJvciAmJiB2LnZhbHVlICE9PSB1bmRlZmluZWQpLFxuICAgICAgbWFwKCh2KSA9PiB7XG4gICAgICAgIHJldHVybiB2LnZhbHVlIGFzIFQ7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLCBpdCB3aWxsIGJlIHJldHVybmVkIG90aGVyd2lzZSBpdCB3aWxsIHdhaXQgZm9yIGEgdmFsdWUgdG8gYmUgcmVzb2x2ZWRcbiAgICogQHBhcmFtIGluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIHZhbHVlPFQgPSBHZXRSZXNwb25zZVR5cGU8VGFwSW5mb0tleU9iamVjdE9yU3RyaW5nPj4oXG4gICAgaW5mbzogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlQ2hhbmdlPFQ+KGluZm8pLnBpcGUoZmlyc3QoKSkudG9Qcm9taXNlKCkgYXMgUHJvbWlzZTxUPjsgLy8gVE9ETyBmaXggdHlwZVxuICB9XG5cbiAgaW5mb0NoYW5nZTxUPihrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZyk6IE9ic2VydmFibGU8VGFwSW5mb0hvbGRlcjxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVJbmZvT2JzZXJ2YWJsZUlmUmVxdWlyZWQodG9UYXBJbmZvS2V5T2JqZWN0KGtleSkpO1xuICB9XG5cbiAgY2xlYXJLZXlzKGtleXM6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1tdKSB7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJLZXkoa2V5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEluZm9TbmFwc2hvdDxUPihcbiAgICBrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1xuICApOiBUYXBJbmZvSG9sZGVyPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5mb0NoYW5nZVtjcmVhdGVDYWNoZUtleSh0b1RhcEluZm9LZXlPYmplY3Qoa2V5KSldPy52YWx1ZTtcbiAgfVxuXG4gIGNsZWFyS2V5KGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nKSB7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdG9UYXBJbmZvS2V5T2JqZWN0KGtleSk7XG4gICAgaWYgKHRoaXMuaXNJbmZvTG9hZGVkKG9iamVjdEtleSkpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY3JlYXRlQ2FjaGVLZXkob2JqZWN0S2V5KTtcbiAgICAgIGRlYnVnKFRBRywgYGNsZWFyIGtleSBcIiR7Y2FjaGVLZXl9XCJgKTtcbiAgICAgIC8vIGRlbGV0ZSB0aGlzLl9pbmZvW2NhY2hlS2V5XTtcbiAgICAgIHRoaXMuX2luZm9DaGFuZ2VbY2FjaGVLZXldPy5uZXh0KHtcbiAgICAgICAgbG9hZERhdGU6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuX2luZm9DaGFuZ2UpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGhpcy5jbGVhcktleShrZXkgYXMgYW55KTtcbiAgICB9KTtcbiAgICAvLyB0aGlzLl9pbmZvID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdmFsdWUgaGFzIGJlZW4gbG9hZGVkLCBldmVuIGlmIGl0IGhhcyBlcnJvcnNcbiAgICovXG4gIGlzSW5mb0xvYWRlZChrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gY3JlYXRlQ2FjaGVLZXkodG9UYXBJbmZvS2V5T2JqZWN0KGtleSkpO1xuICAgIHJldHVybiB0aGlzLl9pbmZvQ2hhbmdlW2NhY2hlS2V5XT8udmFsdWUubG9hZERhdGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaGFzIGJlZW4gbG9hZGVkLlxuICAgKi9cbiAgaXNWYWx1ZUxvYWRlZChrZXk6IFRhcEluZm9LZXkpIHtcbiAgICBjb25zdCB2YWx1ZUhvbGRlciA9IHRoaXMuZ2V0SW5mb1NuYXBzaG90KGtleSk7XG4gICAgaWYgKCF2YWx1ZUhvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWVIb2xkZXIudmFsdWUgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgKHZhbHVlSG9sZGVyLmVycm9yICYmXG4gICAgICAgIGlzQ29kZUVycm9yPFRhcFJlc3BvbnNlU3RhdHVzRXJyb3I+KFxuICAgICAgICAgIFRhcEVycm9yLkNvZGUuUmVzcG9uc2VTdGF0dXNFcnJvcixcbiAgICAgICAgICB2YWx1ZUhvbGRlci5lcnJvclxuICAgICAgICApKVxuICAgICk7XG4gIH1cblxuICBzZXRLZXlFcnJvcihrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZywgZXJyb3I6IEVycm9yKTogVGFwSW5mb0hvbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0S2V5SW5mbyhrZXksIHtcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgIGxvYWREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0S2V5VmFsdWU8VD4oa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsIHZhbHVlOiBUKTogVGFwSW5mb0hvbGRlciB7XG4gICAgcmV0dXJuIHRoaXMuc2V0S2V5SW5mbyhrZXksIHtcbiAgICAgIHZhbHVlLFxuICAgICAgbG9hZERhdGU6IG5ldyBEYXRlKCksXG4gICAgfSk7XG4gIH1cblxuICBzZXRLZXlGcm9tUmVzcG9uc2Uoa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsIHI6IFRhcFJlc3BvbnNlPGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRLZXlWYWx1ZShrZXksIHIuYm9keSgpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0S2V5RXJyb3Ioa2V5LCBlcnIgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHNldEtleUluZm8oa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsIHZhbHVlOiBUYXBJbmZvSG9sZGVyKSB7XG4gICAga2V5ID0gdG9UYXBJbmZvS2V5T2JqZWN0KGtleSk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBjcmVhdGVDYWNoZUtleShrZXkpO1xuICAgIGRlYnVnKFRBRywgYHNldEtleVZhbHVlIFwiJHtjYWNoZUtleX1cIjogYCwgdmFsdWUpO1xuICAgIGlmICh2YWx1ZS5lcnJvcikge1xuICAgICAgdGhpcy5ub3RpZnlLZXlFcnJvcihrZXksIHZhbHVlLmVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZnlOZXdWYWx1ZShrZXksIHZhbHVlLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSBuZXcga2V5IHZhbHVlXG4gICAqL1xuICBub3RpZnlOZXdWYWx1ZShrZXk6IFRhcEluZm9LZXksIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBvYnMgPSB0aGlzLl9jcmVhdGVJbmZvT2JzZXJ2YWJsZUlmUmVxdWlyZWQoa2V5KTtcbiAgICBvYnMubmV4dCh7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBsb2FkRGF0ZTogbmV3IERhdGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgbmV3IGtleSBlcnJvclxuICAgKiBAcGFyYW0ga2V5OiBUYXBJbmZvXG4gICAqIEBwYXJhbSBlcnI6IEVycm9yXG4gICAqIEBwYXJhbSBwYXJhbXM/OiBhbnlbXVxuICAgKi9cbiAgbm90aWZ5S2V5RXJyb3Ioa2V5OiBUYXBJbmZvS2V5LCBlcnI6IEVycm9yKSB7XG4gICAgZGVidWcoVEFHLCBrZXksICdlcnJvciB3aXRoJywgZXJyKTtcbiAgICBjb25zdCBvYnMgPSB0aGlzLl9jcmVhdGVJbmZvT2JzZXJ2YWJsZUlmUmVxdWlyZWQoa2V5KTtcbiAgICBvYnMubmV4dCh7XG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgbG9hZERhdGU6IG5ldyBEYXRlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBpc0luZm9Mb2FkZWQoKX0gaW5zdGVhZFxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpc0tleUluQ2FjaGUoa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZm9Mb2FkZWQoa2V5KTtcbiAgfVxuICBwcml2YXRlIF9jcmVhdGVJbmZvT2JzZXJ2YWJsZUlmUmVxdWlyZWQoXG4gICAga2V5OiBUYXBJbmZvS2V5XG4gICk6IFN1YmplY3Q8VGFwSW5mb0hvbGRlcj4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gY3JlYXRlQ2FjaGVLZXkoa2V5KTtcbiAgICBpZiAoIXRoaXMuX2luZm9DaGFuZ2VbY2FjaGVLZXldKSB7XG4gICAgICBkZWJ1ZyhUQUcsIGBjcmVhdGUgbmV3IG9ic2VydmFibGUgY2FjaGUga2V5IFwiJHtjYWNoZUtleX1cImApO1xuICAgICAgdGhpcy5faW5mb0NoYW5nZVtjYWNoZUtleV0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhcEluZm9Ib2xkZXI+KHtcbiAgICAgICAgbG9hZERhdGU6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faW5mb0NoYW5nZVtjYWNoZUtleV07XG4gIH1cbn1cbiJdfQ==