@ngx-cache/fs-storage
Version:
Fs storage for ngx-cache (server platform)
185 lines • 23.9 kB
JavaScript
import { __extends } from "tslib";
import { Injectable } from '@angular/core';
import { Storage } from '@ngx-cache/core';
import { EventEmitter } from 'events';
import { mkdirSync, readdirSync, readFileSync, rmdirSync, statSync, unlinkSync, writeFileSync } from 'fs';
import { join, resolve } from 'path';
import { FsStorageLoader } from './fs-storage.loader';
import { FsEvent } from './models/fs-event';
import { FsItemMetadata } from './models/fs-item-metadata';
import * as i0 from "@angular/core";
import * as i1 from "./fs-storage.loader";
var FsStorageService = (function (_super) {
__extends(FsStorageService, _super);
function FsStorageService(loader) {
var _this = _super.call(this) || this;
_this.loader = loader;
_this.instances = {};
_this.path = resolve(_this.loader.path);
_this.quota = _this.loader.quota;
if (_this.instances[_this.path]) {
return _this.instances[_this.path];
}
_this.length = 0;
_this.keys = [];
_this.pid = "pid:" + process.pid;
_this.metadata = new Map();
_this.bytesUsed = 0;
try {
var stat_1 = statSync(_this.path);
if (!stat_1.hasOwnProperty('isDirectory')) {
throw new Error("A file exists at the location " + _this.path + " when trying to create/open localStorage");
}
_this.length = 0;
_this.keys = readdirSync(_this.path);
_this.bytesUsed = 0;
var decodedKeys_1 = [];
_this.keys.forEach(function (key, index) {
var decodedKey = decodeURIComponent(key);
decodedKeys_1.push(decodedKey);
var item = new FsItemMetadata(key, index);
_this.metadata[decodedKey] = item;
stat_1 = _this.getStats(key);
if (!stat_1.hasOwnProperty('size')) {
item.size = stat_1.size;
_this.metadata[decodedKey] = item;
_this.bytesUsed += stat_1.size;
}
});
_this.keys = decodedKeys_1;
_this.length = _this.keys.length;
}
catch (error) {
mkdirSync(_this.path);
}
_this.instances[_this.path] = _this;
return _this;
}
FsStorageService.prototype.setItem = function (key, value) {
var hasListeners = EventEmitter.listenerCount(this, 'fs-storage');
var oldValue = hasListeners ? this.getItem(key) : undefined;
var item = this.metadata[key];
var oldLength = item ? item.size : 0;
if (this.bytesUsed - oldLength + Number(value.toString().length) > this.quota) {
throw new Error("Disk quota (" + this.quota / 1024 + "KB) has been reached!");
}
var encodedKey = encodeURIComponent(key);
var filename = join(this.path, encodedKey);
writeFileSync(filename, value.toString(), 'utf8');
if (!item) {
item = new FsItemMetadata(encodedKey, this.keys.push(key) - 1);
item.size = value.toString().length;
this.length += 1;
this.metadata[key] = item;
this.bytesUsed += value.toString().length;
}
if (!hasListeners) {
return false;
}
var e = new FsEvent(key, oldValue, value, this.pid);
return this.emit('fs-storage', e);
};
FsStorageService.prototype.getItem = function (key) {
var item = this.metadata[key];
if (item) {
var filename = join(this.path, item.key);
try {
return readFileSync(filename, 'utf8');
}
catch (error) {
this.removeItem(key);
}
}
return undefined;
};
FsStorageService.prototype.removeItem = function (key) {
var _this = this;
var hasListeners = EventEmitter.listenerCount(this, 'fs-storage');
var oldValue = hasListeners ? this.getItem(key) : undefined;
var item = this.metadata[key];
if (item) {
delete this.metadata[key];
this.length -= 1;
this.bytesUsed -= item.size;
this.keys.splice(item.index, 1);
var metadataRef = this.metadata;
metadataRef.forEach(function (k) {
var i = _this.metadata[k];
if (i.index > item.index) {
i.index -= 1;
}
});
var itemPath = join(this.path, item.key);
try {
this.deletePath(itemPath);
}
catch (error) {
}
if (!hasListeners) {
return false;
}
var e = new FsEvent(key, oldValue, undefined, this.pid);
return this.emit('fs-storage', e);
}
return false;
};
FsStorageService.prototype.key = function (index) {
return this.keys[index];
};
FsStorageService.prototype.clear = function () {
this.deleteDirectory(this.path);
this.length = 0;
this.keys = [];
this.metadata = new Map();
this.bytesUsed = 0;
var hasListeners = EventEmitter.listenerCount(this, 'fs-storage');
if (!hasListeners) {
return false;
}
var e = new FsEvent(undefined, undefined, undefined, this.pid);
return this.emit('fs-storage', e);
};
FsStorageService.prototype.getStats = function (key) {
var filename = join(this.path, encodeURIComponent(key));
try {
return statSync(filename);
}
catch (error) {
return undefined;
}
};
FsStorageService.prototype.deleteDirectory = function (dirPath) {
var _this = this;
var contents = readdirSync(dirPath);
contents.forEach(function (path) {
var joined = join(dirPath, path);
_this.deletePath(joined);
});
};
FsStorageService.prototype.deletePath = function (path) {
var isDirectory = statSync(path).isDirectory();
if (isDirectory) {
this.deleteDirectory(path);
rmdirSync(path);
}
else {
unlinkSync(path);
}
};
FsStorageService.prototype.deleteInstance = function () {
delete this.instances[this.path];
this.deletePath(this.path);
this.length = 0;
this.keys = [];
this.metadata = new Map();
this.bytesUsed = 0;
};
FsStorageService.ɵfac = function FsStorageService_Factory(t) { return new (t || FsStorageService)(i0.ɵɵinject(i1.FsStorageLoader)); };
FsStorageService.ɵprov = i0.ɵɵdefineInjectable({ token: FsStorageService, factory: FsStorageService.ɵfac });
return FsStorageService;
}(Storage));
export { FsStorageService };
(function () { i0.ɵsetClassMetadata(FsStorageService, [{
type: Injectable
}], function () { return [{ type: i1.FsStorageLoader }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1jYWNoZS9mcy1zdG9yYWdlLyIsInNvdXJjZXMiOlsiZnMtc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDMUcsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQUUzRDtJQUNzQyxvQ0FBTztJQWEzQywwQkFBcUIsTUFBdUI7UUFBNUMsWUFDRSxpQkFBTyxTQW1EUjtRQXBEb0IsWUFBTSxHQUFOLE1BQU0sQ0FBaUI7UUFUM0IsZUFBUyxHQUFHLEVBQUUsQ0FBQztRQVk5QixLQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFFL0IsSUFBSSxLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixPQUFPLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsS0FBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsS0FBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixLQUFJLENBQUMsR0FBRyxHQUFHLFNBQU8sT0FBTyxDQUFDLEdBQUssQ0FBQztRQUNoQyxLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO1FBQ2xELEtBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLElBQUk7WUFDRixJQUFJLE1BQUksR0FBRyxRQUFRLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRS9CLElBQUksQ0FBQyxNQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFpQyxLQUFJLENBQUMsSUFBSSw2Q0FBMEMsQ0FBQyxDQUFDO2FBQ3ZHO1lBRUQsS0FBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDaEIsS0FBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLEtBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBRW5CLElBQU0sYUFBVyxHQUFrQixFQUFFLENBQUM7WUFFdEMsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFXLEVBQUUsS0FBYTtnQkFDM0MsSUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLGFBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRTdCLElBQU0sSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDNUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBRWpDLE1BQUksR0FBRyxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUxQixJQUFJLENBQUMsTUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFJLENBQUMsSUFBSSxDQUFDO29CQUN0QixLQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDakMsS0FBSSxDQUFDLFNBQVMsSUFBSSxNQUFJLENBQUMsSUFBSSxDQUFDO2lCQUM3QjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSSxDQUFDLElBQUksR0FBRyxhQUFXLENBQUM7WUFDeEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNoQztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsU0FBUyxDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QjtRQUVELEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUksQ0FBQzs7SUFDbkMsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxHQUFXLEVBQUUsS0FBVTtRQUM3QixJQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNwRSxJQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU5RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLDBCQUF1QixDQUFDLENBQUM7U0FDMUU7UUFFRCxJQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU3QyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFFcEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQzNDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGtDQUFPLEdBQVAsVUFBUSxHQUFXO1FBQ2pCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEMsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0MsSUFBSTtnQkFDRixPQUFPLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdkM7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQscUNBQVUsR0FBVixVQUFXLEdBQVc7UUFBdEIsaUJBd0NDO1FBdkNDLElBQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTlELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEMsSUFBSSxJQUFJLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUVsQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBTTtnQkFDekIsSUFBTSxDQUFDLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFM0IsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ3hCLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2lCQUNkO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFM0MsSUFBSTtnQkFDRixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzNCO1lBQUMsT0FBTyxLQUFLLEVBQUU7YUFFZjtZQUVELElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCxJQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDhCQUFHLEdBQUgsVUFBSSxLQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQ0FBSyxHQUFMO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO1FBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLElBQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXBFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxtQ0FBUSxHQUFoQixVQUFpQixHQUFXO1FBQzFCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFMUQsSUFBSTtZQUNGLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFTywwQ0FBZSxHQUF2QixVQUF3QixPQUFlO1FBQXZDLGlCQU9DO1FBTkMsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXRDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFZO1lBQzVCLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxxQ0FBVSxHQUFsQixVQUFtQixJQUFZO1FBQzdCLElBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqRCxJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pCO2FBQU07WUFDTCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRU8seUNBQWMsR0FBdEI7UUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztRQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO29GQTdOVSxnQkFBZ0I7NERBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0I7MkJBWDdCO0NBeU9DLEFBL05ELENBQ3NDLE9BQU8sR0E4TjVDO1NBOU5ZLGdCQUFnQjtvQ0FBaEIsZ0JBQWdCO2NBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQG5neC1jYWNoZS9jb3JlJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRkaXJTeW5jLCByZWFkRmlsZVN5bmMsIHJtZGlyU3luYywgc3RhdFN5bmMsIHVubGlua1N5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEZzU3RvcmFnZUxvYWRlciB9IGZyb20gJy4vZnMtc3RvcmFnZS5sb2FkZXInO1xuaW1wb3J0IHsgRnNFdmVudCB9IGZyb20gJy4vbW9kZWxzL2ZzLWV2ZW50JztcbmltcG9ydCB7IEZzSXRlbU1ldGFkYXRhIH0gZnJvbSAnLi9tb2RlbHMvZnMtaXRlbS1tZXRhZGF0YSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGc1N0b3JhZ2VTZXJ2aWNlIGV4dGVuZHMgU3RvcmFnZSB7XG4gIGxlbmd0aDogbnVtYmVyO1xuICBrZXlzOiBBcnJheTxzdHJpbmc+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VzID0ge307XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVvdGE6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBwaWQ6IHN0cmluZztcblxuICBwcml2YXRlIG1ldGFkYXRhOiBNYXA8c3RyaW5nLCBGc0l0ZW1NZXRhZGF0YT47XG4gIHByaXZhdGUgYnl0ZXNVc2VkOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbG9hZGVyOiBGc1N0b3JhZ2VMb2FkZXIpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5wYXRoID0gcmVzb2x2ZSh0aGlzLmxvYWRlci5wYXRoKTtcbiAgICB0aGlzLnF1b3RhID0gdGhpcy5sb2FkZXIucXVvdGE7XG5cbiAgICBpZiAodGhpcy5pbnN0YW5jZXNbdGhpcy5wYXRoXSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzW3RoaXMucGF0aF07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICAgIHRoaXMucGlkID0gYHBpZDoke3Byb2Nlc3MucGlkfWA7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBNYXA8c3RyaW5nLCBGc0l0ZW1NZXRhZGF0YT4oKTtcbiAgICB0aGlzLmJ5dGVzVXNlZCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHN0YXQgPSBzdGF0U3luYyh0aGlzLnBhdGgpO1xuXG4gICAgICBpZiAoIXN0YXQuaGFzT3duUHJvcGVydHkoJ2lzRGlyZWN0b3J5JykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGZpbGUgZXhpc3RzIGF0IHRoZSBsb2NhdGlvbiAke3RoaXMucGF0aH0gd2hlbiB0cnlpbmcgdG8gY3JlYXRlL29wZW4gbG9jYWxTdG9yYWdlYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMua2V5cyA9IHJlYWRkaXJTeW5jKHRoaXMucGF0aCk7XG4gICAgICB0aGlzLmJ5dGVzVXNlZCA9IDA7XG5cbiAgICAgIGNvbnN0IGRlY29kZWRLZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAgIHRoaXMua2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBkZWNvZGVkS2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgIGRlY29kZWRLZXlzLnB1c2goZGVjb2RlZEtleSk7XG5cbiAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBGc0l0ZW1NZXRhZGF0YShrZXksIGluZGV4KTtcbiAgICAgICAgdGhpcy5tZXRhZGF0YVtkZWNvZGVkS2V5XSA9IGl0ZW07XG5cbiAgICAgICAgc3RhdCA9IHRoaXMuZ2V0U3RhdHMoa2V5KTtcblxuICAgICAgICBpZiAoIXN0YXQuaGFzT3duUHJvcGVydHkoJ3NpemUnKSkge1xuICAgICAgICAgIGl0ZW0uc2l6ZSA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhW2RlY29kZWRLZXldID0gaXRlbTtcbiAgICAgICAgICB0aGlzLmJ5dGVzVXNlZCArPSBzdGF0LnNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmtleXMgPSBkZWNvZGVkS2V5cztcbiAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5rZXlzLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbWtkaXJTeW5jKHRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbnN0YW5jZXNbdGhpcy5wYXRoXSA9IHRoaXM7XG4gIH1cblxuICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQodGhpcywgJ2ZzLXN0b3JhZ2UnKTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IGhhc0xpc3RlbmVycyA/IHRoaXMuZ2V0SXRlbShrZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgbGV0IGl0ZW0gPSB0aGlzLm1ldGFkYXRhW2tleV07XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gaXRlbSA/IGl0ZW0uc2l6ZSA6IDA7XG5cbiAgICBpZiAodGhpcy5ieXRlc1VzZWQgLSBvbGRMZW5ndGggKyBOdW1iZXIodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgpID4gdGhpcy5xdW90YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXNrIHF1b3RhICgke3RoaXMucXVvdGEgLyAxMDI0fUtCKSBoYXMgYmVlbiByZWFjaGVkIWApO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY29kZWRLZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGpvaW4odGhpcy5wYXRoLCBlbmNvZGVkS2V5KTtcblxuICAgIHdyaXRlRmlsZVN5bmMoZmlsZW5hbWUsIHZhbHVlLnRvU3RyaW5nKCksICd1dGY4Jyk7XG5cbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIGl0ZW0gPSBuZXcgRnNJdGVtTWV0YWRhdGEoZW5jb2RlZEtleSwgdGhpcy5rZXlzLnB1c2goa2V5KSAtIDEpO1xuICAgICAgaXRlbS5zaXplID0gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGg7XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gICAgICB0aGlzLm1ldGFkYXRhW2tleV0gPSBpdGVtO1xuICAgICAgdGhpcy5ieXRlc1VzZWQgKz0gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlID0gbmV3IEZzRXZlbnQoa2V5LCBvbGRWYWx1ZSwgdmFsdWUsIHRoaXMucGlkKTtcblxuICAgIHJldHVybiB0aGlzLmVtaXQoJ2ZzLXN0b3JhZ2UnLCBlKTtcbiAgfVxuXG4gIGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1ldGFkYXRhW2tleV07XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBqb2luKHRoaXMucGF0aCwgaXRlbS5rZXkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGVuYW1lLCAndXRmOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSBFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCh0aGlzLCAnZnMtc3RvcmFnZScpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gaGFzTGlzdGVuZXJzID8gdGhpcy5nZXRJdGVtKGtleSkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpdGVtID0gdGhpcy5tZXRhZGF0YVtrZXldO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm1ldGFkYXRhW2tleV07XG4gICAgICB0aGlzLmxlbmd0aCAtPSAxO1xuICAgICAgdGhpcy5ieXRlc1VzZWQgLT0gaXRlbS5zaXplO1xuICAgICAgdGhpcy5rZXlzLnNwbGljZShpdGVtLmluZGV4LCAxKTtcblxuICAgICAgY29uc3QgbWV0YWRhdGFSZWYgPSB0aGlzLm1ldGFkYXRhO1xuXG4gICAgICBtZXRhZGF0YVJlZi5mb3JFYWNoKChrOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubWV0YWRhdGFba107XG5cbiAgICAgICAgaWYgKGkuaW5kZXggPiBpdGVtLmluZGV4KSB7XG4gICAgICAgICAgaS5pbmRleCAtPSAxO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaXRlbVBhdGggPSBqb2luKHRoaXMucGF0aCwgaXRlbS5rZXkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlbGV0ZVBhdGgoaXRlbVBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTk9URTogc2VlbXMgbGlrZSBwYXRoIGNhbid0IGJlIGRlbGV0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlID0gbmV3IEZzRXZlbnQoa2V5LCBvbGRWYWx1ZSwgdW5kZWZpbmVkLCB0aGlzLnBpZCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2ZzLXN0b3JhZ2UnLCBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBrZXkoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMua2V5c1tpbmRleF07XG4gIH1cblxuICBjbGVhcigpOiBib29sZWFuIHtcbiAgICB0aGlzLmRlbGV0ZURpcmVjdG9yeSh0aGlzLnBhdGgpO1xuXG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMua2V5cyA9IFtdO1xuICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgTWFwPHN0cmluZywgRnNJdGVtTWV0YWRhdGE+KCk7XG4gICAgdGhpcy5ieXRlc1VzZWQgPSAwO1xuXG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQodGhpcywgJ2ZzLXN0b3JhZ2UnKTtcblxuICAgIGlmICghaGFzTGlzdGVuZXJzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZSA9IG5ldyBGc0V2ZW50KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMucGlkKTtcblxuICAgIHJldHVybiB0aGlzLmVtaXQoJ2ZzLXN0b3JhZ2UnLCBlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhdHMoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gam9pbih0aGlzLnBhdGgsIGVuY29kZVVSSUNvbXBvbmVudChrZXkpKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZW5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gcmVhZGRpclN5bmMoZGlyUGF0aCk7XG5cbiAgICBjb250ZW50cy5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGpvaW5lZCA9IGpvaW4oZGlyUGF0aCwgcGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZVBhdGgoam9pbmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlUGF0aChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0RpcmVjdG9yeSA9IHN0YXRTeW5jKHBhdGgpLmlzRGlyZWN0b3J5KCk7XG5cbiAgICBpZiAoaXNEaXJlY3RvcnkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGlyZWN0b3J5KHBhdGgpO1xuXG4gICAgICBybWRpclN5bmMocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVubGlua1N5bmMocGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5pbnN0YW5jZXNbdGhpcy5wYXRoXTtcbiAgICB0aGlzLmRlbGV0ZVBhdGgodGhpcy5wYXRoKTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmtleXMgPSBbXTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbmV3IE1hcDxzdHJpbmcsIEZzSXRlbU1ldGFkYXRhPigpO1xuICAgIHRoaXMuYnl0ZXNVc2VkID0gMDtcbiAgfVxufVxuIl19