@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
171 lines • 19.2 kB
JavaScript
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==