UNPKG

@ngx-cache/fs-storage

Version:
185 lines 23.9 kB
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