ngx-store
Version:
Angular decorators to automagically keep variables in HTML5 LocalStorage, SessionStorage, cookies; injectable services for managing and listening to data changes and a bit more.
118 lines • 16.5 kB
JavaScript
import { Config, debug } from '../config/config';
import { Cache } from '../decorator/cache';
import { delay, filter } from 'rxjs/operators';
import { NgxStorageEvent } from '../utility/storage/storage-event';
import { Resource } from './resource';
import merge from 'lodash.merge';
// const merge = require('lodash.merge');
export class WebStorageService {
constructor(utility) {
this.utility = utility;
}
/**
* Gets keys for stored variables created by ngx-store,
* ignores keys that have not been created by decorators and have no prefix at once
*/
get keys() {
// get prefixed key if prefix is defined
const prefixKeys = this.utility.keys.filter(key => {
if (this.utility.prefix && this.utility.prefix.length) {
return key.startsWith(this.utility.prefix);
}
return true;
});
const decoratorKeys = this.constructor.keys;
return prefixKeys.concat(decoratorKeys);
}
get config() {
return Config;
}
get(key) {
return this.utility.get(key);
}
/**
* Returns new data Resource for given key exposing builder design pattern
* designed for complex nested data structures
*/
load(key) {
return new Resource(this, key);
}
set(key, value) {
return this.utility.set(key, value);
}
update(key, changes) {
const value = this.get(key);
if (value !== undefined && typeof value !== 'object') {
debug.throw(new Error(`Value stored under "${key}" key is not an object and tried to be updated.`));
return value;
}
return this.set(key, merge({}, value, changes));
}
// TODO return true if item existed and false otherwise (?)
remove(key) {
return this.utility.remove(key);
}
observe(key, exactMatch) {
return this._changes.pipe(filter((event) => {
var _a;
if (!key) {
return true;
}
if (exactMatch) {
if (Config.prefix && key.startsWith(Config.prefix)) {
return event.key === key;
}
return event.key === Config.prefix + key;
}
else {
return ((_a = event.key) === null || _a === void 0 ? void 0 : _a.indexOf(key)) !== -1;
}
}), delay(30));
}
/**
* Clears chosen data from Storage
* @param clearType 'prefix' | 'decorators' | 'all'
* @param prefixOrClass defines the prefix or class (not its instance) whose decorators should be cleared
*/
clear(clearType, prefixOrClass) {
clearType = clearType || Config.clearType;
if (clearType === 'decorators') {
let keys = [];
if (typeof prefixOrClass === 'object') {
keys = this.keys.filter(key => Cache.get(key).targets.includes(prefixOrClass));
debug.log(this.utility.getStorageName() + ' > Removing decorated data from '
+ prefixOrClass.constructor.name + ':', keys);
}
else {
keys = this.keys;
debug.log(this.utility.getStorageName() + ' > Removing decorated data:', keys);
}
keys.forEach(key => this.remove(key));
}
else if (clearType === 'prefix') {
prefixOrClass = prefixOrClass || this.utility.prefix;
this.utility.forEach((value, key) => {
if (key.startsWith(prefixOrClass)) {
this.remove(this.utility.trimPrefix(key));
}
});
}
else if (clearType === 'all') {
this.utility.clear();
}
}
generateEvent(key, newValue, oldValue) {
const type = this.utility.getStorageName().charAt(0).toLowerCase() + this.utility.getStorageName().slice(1);
const event = new NgxStorageEvent(type, key, this.utility.getStorage());
event.oldValue = (oldValue !== undefined) ? oldValue : this.get(key);
event.newValue = newValue;
return event;
}
mapNativeEvent(ev) {
const event = this.generateEvent(ev.key, this.utility.getGettable(ev.newValue), this.utility.getGettable(ev.oldValue));
event.isInternal = false;
return event;
}
}
WebStorageService.keys = [];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b3JlL3NyYy9saWIvc2VydmljZS93ZWJzdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUlqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7QUFFakMseUNBQXlDO0FBRXpDLE1BQU0sT0FBZ0IsaUJBQWlCO0lBS3JDLFlBQTZCLE9BQTBCO1FBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLElBQUk7UUFDYix3Q0FBd0M7UUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dCQUNyRCxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGFBQWEsR0FBSSxJQUFJLENBQUMsV0FBMEMsQ0FBQyxJQUFJLENBQUM7UUFDNUUsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLEdBQVc7UUFDckIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLEdBQUcsQ0FBSSxHQUFXLEVBQUUsS0FBUTtRQUNqQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQU0sQ0FBQztJQUMzQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEdBQVcsRUFBRSxPQUFZO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUNwRCxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLGlEQUFpRCxDQUFDLENBQUMsQ0FBQztZQUNwRyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCwyREFBMkQ7SUFDcEQsTUFBTSxDQUFDLEdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sT0FBTyxDQUFDLEdBQVksRUFBRSxVQUFvQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUN2QixNQUFNLENBQUMsQ0FBQyxLQUFzQixFQUFFLEVBQUU7O1lBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1IsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELElBQUksVUFBVSxFQUFFO2dCQUNkLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbEQsT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQztpQkFDMUI7Z0JBQ0QsT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2FBQzFDO2lCQUFNO2dCQUNMLE9BQU8sT0FBQSxLQUFLLENBQUMsR0FBRywwQ0FBRSxPQUFPLENBQUMsR0FBRyxPQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxTQUFxQixFQUFFLGFBQStCO1FBQ2pFLFNBQVMsR0FBRyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxJQUFJLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFDOUIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7Z0JBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUF1QixDQUFDLENBQUMsQ0FBQztnQkFDekYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxHQUFHLGtDQUFrQztzQkFDeEUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pEO2lCQUFNO2dCQUNMLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNqQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEY7WUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQ2pDLGFBQWEsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUF1QixDQUFDLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDM0M7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRVMsYUFBYSxDQUFDLEdBQVcsRUFBRSxRQUFhLEVBQUUsUUFBYztRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RyxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsY0FBYyxDQUFDLEVBQWdCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQzlCLEVBQUUsQ0FBQyxHQUFhLEVBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFrQixDQUFDLEVBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFrQixDQUFDLENBQUMsQ0FBQztRQUNuRCxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBekhhLHNCQUFJLEdBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZywgZGVidWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcbmltcG9ydCB7IENsZWFyVHlwZSwgV2ViU3RvcmFnZUNvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdlYlN0b3JhZ2VVdGlsaXR5IH0gZnJvbSAnLi4vdXRpbGl0eS93ZWJzdG9yYWdlLnV0aWxpdHknO1xuaW1wb3J0IHsgV2ViU3RvcmFnZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL3dlYnN0b3JhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi4vZGVjb3JhdG9yL2NhY2hlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZ3hTdG9yYWdlRXZlbnQgfSBmcm9tICcuLi91dGlsaXR5L3N0b3JhZ2Uvc3RvcmFnZS1ldmVudCc7XG5pbXBvcnQgeyBSZXNvdXJjZSB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC5tZXJnZSc7XG5cbi8vIGNvbnN0IG1lcmdlID0gcmVxdWlyZSgnbG9kYXNoLm1lcmdlJyk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXZWJTdG9yYWdlU2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAvLyBAdHMtaWdub3JlXG4gIHByb3RlY3RlZCBfY2hhbmdlczogT2JzZXJ2YWJsZTxOZ3hTdG9yYWdlRXZlbnQ+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgdXRpbGl0eTogV2ViU3RvcmFnZVV0aWxpdHkpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGtleXMgZm9yIHN0b3JlZCB2YXJpYWJsZXMgY3JlYXRlZCBieSBuZ3gtc3RvcmUsXG4gICAqIGlnbm9yZXMga2V5cyB0aGF0IGhhdmUgbm90IGJlZW4gY3JlYXRlZCBieSBkZWNvcmF0b3JzIGFuZCBoYXZlIG5vIHByZWZpeCBhdCBvbmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gZ2V0IHByZWZpeGVkIGtleSBpZiBwcmVmaXggaXMgZGVmaW5lZFxuICAgIGNvbnN0IHByZWZpeEtleXMgPSB0aGlzLnV0aWxpdHkua2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgIGlmICh0aGlzLnV0aWxpdHkucHJlZml4ICYmIHRoaXMudXRpbGl0eS5wcmVmaXgubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBrZXkuc3RhcnRzV2l0aCh0aGlzLnV0aWxpdHkucHJlZml4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIGNvbnN0IGRlY29yYXRvcktleXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyBXZWJTdG9yYWdlU2VydmljZUludGVyZmFjZSkua2V5cztcbiAgICByZXR1cm4gcHJlZml4S2V5cy5jb25jYXQoZGVjb3JhdG9yS2V5cyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBXZWJTdG9yYWdlQ29uZmlnSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudXRpbGl0eS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG5ldyBkYXRhIFJlc291cmNlIGZvciBnaXZlbiBrZXkgZXhwb3NpbmcgYnVpbGRlciBkZXNpZ24gcGF0dGVyblxuICAgKiBkZXNpZ25lZCBmb3IgY29tcGxleCBuZXN0ZWQgZGF0YSBzdHJ1Y3R1cmVzXG4gICAqL1xuICBwdWJsaWMgbG9hZChrZXk6IHN0cmluZyk6IFJlc291cmNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywga2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQ8VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMudXRpbGl0eS5zZXQoa2V5LCB2YWx1ZSkgYXMgVDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoa2V5OiBzdHJpbmcsIGNoYW5nZXM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGRlYnVnLnRocm93KG5ldyBFcnJvcihgVmFsdWUgc3RvcmVkIHVuZGVyIFwiJHtrZXl9XCIga2V5IGlzIG5vdCBhbiBvYmplY3QgYW5kIHRyaWVkIHRvIGJlIHVwZGF0ZWQuYCkpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXQoa2V5LCBtZXJnZSh7fSwgdmFsdWUsIGNoYW5nZXMpKTtcbiAgfVxuXG4gIC8vIFRPRE8gcmV0dXJuIHRydWUgaWYgaXRlbSBleGlzdGVkIGFuZCBmYWxzZSBvdGhlcndpc2UgKD8pXG4gIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5LnJlbW92ZShrZXkpO1xuICB9XG5cbiAgcHVibGljIG9ic2VydmUoa2V5Pzogc3RyaW5nLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IE9ic2VydmFibGU8Tmd4U3RvcmFnZUV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZXMucGlwZShcbiAgICAgIGZpbHRlcigoZXZlbnQ6IE5neFN0b3JhZ2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleGFjdE1hdGNoKSB7XG4gICAgICAgICAgaWYgKENvbmZpZy5wcmVmaXggJiYga2V5LnN0YXJ0c1dpdGgoQ29uZmlnLnByZWZpeCkpIHtcbiAgICAgICAgICAgIHJldHVybiBldmVudC5rZXkgPT09IGtleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LmtleSA9PT0gQ29uZmlnLnByZWZpeCArIGtleTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQua2V5Py5pbmRleE9mKGtleSkgIT09IC0xO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGRlbGF5KDMwKSwgLy8gZXZlbnQgc2hvdWxkIGNvbWUgYWZ0ZXIgYWN0dWFsIGRhdGEgY2hhbmdlIGFuZCBwcm9wYWdhdGlvblxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGNob3NlbiBkYXRhIGZyb20gU3RvcmFnZVxuICAgKiBAcGFyYW0gY2xlYXJUeXBlICdwcmVmaXgnIHwgJ2RlY29yYXRvcnMnIHwgJ2FsbCdcbiAgICogQHBhcmFtIHByZWZpeE9yQ2xhc3MgZGVmaW5lcyB0aGUgcHJlZml4IG9yIGNsYXNzIChub3QgaXRzIGluc3RhbmNlKSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSBjbGVhcmVkXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY2xlYXJUeXBlPzogQ2xlYXJUeXBlLCBwcmVmaXhPckNsYXNzPzogc3RyaW5nIHwgb2JqZWN0KTogdm9pZCB7XG4gICAgY2xlYXJUeXBlID0gY2xlYXJUeXBlIHx8IENvbmZpZy5jbGVhclR5cGU7XG4gICAgaWYgKGNsZWFyVHlwZSA9PT0gJ2RlY29yYXRvcnMnKSB7XG4gICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgaWYgKHR5cGVvZiBwcmVmaXhPckNsYXNzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBrZXlzID0gdGhpcy5rZXlzLmZpbHRlcihrZXkgPT4gQ2FjaGUuZ2V0KGtleSkudGFyZ2V0cy5pbmNsdWRlcyhwcmVmaXhPckNsYXNzIGFzIG9iamVjdCkpO1xuICAgICAgICBkZWJ1Zy5sb2codGhpcy51dGlsaXR5LmdldFN0b3JhZ2VOYW1lKCkgKyAnID4gUmVtb3ZpbmcgZGVjb3JhdGVkIGRhdGEgZnJvbSAnXG4gICAgICAgICAgKyBwcmVmaXhPckNsYXNzLmNvbnN0cnVjdG9yLm5hbWUgKyAnOicsIGtleXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgZGVidWcubG9nKHRoaXMudXRpbGl0eS5nZXRTdG9yYWdlTmFtZSgpICsgJyA+IFJlbW92aW5nIGRlY29yYXRlZCBkYXRhOicsIGtleXMpO1xuICAgICAgfVxuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB0aGlzLnJlbW92ZShrZXkpKTtcbiAgICB9IGVsc2UgaWYgKGNsZWFyVHlwZSA9PT0gJ3ByZWZpeCcpIHtcbiAgICAgIHByZWZpeE9yQ2xhc3MgPSBwcmVmaXhPckNsYXNzIHx8IHRoaXMudXRpbGl0eS5wcmVmaXg7XG4gICAgICB0aGlzLnV0aWxpdHkuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgocHJlZml4T3JDbGFzcyBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy51dGlsaXR5LnRyaW1QcmVmaXgoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2xlYXJUeXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy51dGlsaXR5LmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRXZlbnQoa2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlPzogYW55KTogTmd4U3RvcmFnZUV2ZW50IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy51dGlsaXR5LmdldFN0b3JhZ2VOYW1lKCkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB0aGlzLnV0aWxpdHkuZ2V0U3RvcmFnZU5hbWUoKS5zbGljZSgxKTtcbiAgICBjb25zdCBldmVudCA9IG5ldyBOZ3hTdG9yYWdlRXZlbnQodHlwZSwga2V5LCB0aGlzLnV0aWxpdHkuZ2V0U3RvcmFnZSgpKTtcbiAgICBldmVudC5vbGRWYWx1ZSA9IChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSA/IG9sZFZhbHVlIDogdGhpcy5nZXQoa2V5KTtcbiAgICBldmVudC5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXBOYXRpdmVFdmVudChldjogU3RvcmFnZUV2ZW50KTogTmd4U3RvcmFnZUV2ZW50IHtcbiAgICBjb25zdCBldmVudCA9IHRoaXMuZ2VuZXJhdGVFdmVudChcbiAgICAgIGV2LmtleSBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnV0aWxpdHkuZ2V0R2V0dGFibGUoZXYubmV3VmFsdWUgYXMgc3RyaW5nKSxcbiAgICAgIHRoaXMudXRpbGl0eS5nZXRHZXR0YWJsZShldi5vbGRWYWx1ZSBhcyBzdHJpbmcpKTtcbiAgICBldmVudC5pc0ludGVybmFsID0gZmFsc2U7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG59XG4iXX0=