UNPKG

ngx-indexed-database

Version:

<div align="center"> <img src="https://w3c.github.io/IndexedDB/logo-db.svg" width="120"/> </div> <h1 align="center">ngx-indexed-database</h1>

179 lines 30.3 kB
import { __awaiter } from "tslib"; import { Injectable } from '@angular/core'; import { InvalidArgumentsException } from "../exceptions/InvalidArgumentsException"; import { HelperUtils } from "../utils/helper.utils"; import { isExcludeConfig } from "../types/stores-reset-options.type"; import * as i0 from "@angular/core"; export class NgxIndexedDatabaseStoreOperationsService { constructor() { } upsert(dbName, storeName, data) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName || !data) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const updateRequest = store.put(data); yield HelperUtils.promisifyIndexedDBRequest(updateRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return data; }); } delete(dbName, storeName, value) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName || !value) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const deleteRequest = store.delete(value); yield HelperUtils.promisifyIndexedDBRequest(deleteRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return { success: true }; }); } deleteBy(dbName, storeName, key, value) { var _a; return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName || !key || !value) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const primaryKeyIndex = store.index(key); const cursorOpenRequest = primaryKeyIndex.openCursor(IDBKeyRange.only(value)); yield HelperUtils.promisifyIndexedDBRequest(cursorOpenRequest, 'onsuccess', 'onerror'); const deleteRequest = (_a = cursorOpenRequest.result) === null || _a === void 0 ? void 0 : _a.delete(); yield HelperUtils.promisifyIndexedDBRequest(deleteRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return { success: true }; }); } clear(dbName, storeName) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const clearRequest = store.clear(); yield HelperUtils.promisifyIndexedDBRequest(clearRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return { success: true }; }); } find(dbName, storeName, value) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName || !value) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const readRequest = store.get(value); yield HelperUtils.promisifyIndexedDBRequest(readRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return (readRequest === null || readRequest === void 0 ? void 0 : readRequest.result) || null; }); } findBy(dbName, storeName, key, value) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName || !key || !value) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const keyIndex = store.index(key); const readRequest = keyIndex.get(value); yield HelperUtils.promisifyIndexedDBRequest(readRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return (readRequest === null || readRequest === void 0 ? void 0 : readRequest.result) || null; }); } findMany(dbName, storeName, values) { return __awaiter(this, void 0, void 0, function* () { const entriesMap = {}; for (const value of values) { const data = yield this.find(dbName, storeName, value); if (data) { entriesMap[value + ''] = data; } } return Object.values(entriesMap); }); } findManyBy(dbName, storeName, key, values) { return __awaiter(this, void 0, void 0, function* () { const entriesMap = {}; for (const value of values) { const data = yield this.findBy(dbName, storeName, key, value); if (data) { entriesMap[value + ''] = data; } } return Object.values(entriesMap); }); } fetchAll(dbName, storeName) { return __awaiter(this, void 0, void 0, function* () { if (!dbName || !storeName) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const transaction = database.transaction(storeName, "readwrite"); const store = transaction.objectStore(storeName); const readRequest = store.getAll(); yield HelperUtils.promisifyIndexedDBRequest(readRequest, 'onsuccess', 'onerror'); database === null || database === void 0 ? void 0 : database.close(); return (readRequest === null || readRequest === void 0 ? void 0 : readRequest.result) || []; }); } resetStores(dbName, options) { return __awaiter(this, void 0, void 0, function* () { if (!dbName) { throw new InvalidArgumentsException(); } const indexedDBOpenRequest = indexedDB.open(dbName); yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror'); const database = indexedDBOpenRequest.result; const allObjectStoreNames = Object.values(Object.assign({}, database.objectStoreNames)); const objectStoreNamesToBeCleared = allObjectStoreNames .filter((storeName) => options ? (isExcludeConfig(options) ? !(options.exclude || []).includes(storeName) : (options.only || allObjectStoreNames).includes(storeName)) : true); database === null || database === void 0 ? void 0 : database.close(); const objectStoreClearRequests = objectStoreNamesToBeCleared.map((storeName) => this.clear(dbName, storeName)); return Promise.all(objectStoreClearRequests); }); } } NgxIndexedDatabaseStoreOperationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseStoreOperationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); NgxIndexedDatabaseStoreOperationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseStoreOperationsService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseStoreOperationsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWluZGV4ZWQtZGF0YWJhc2Utc3RvcmUtb3BlcmF0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWluZGV4ZWQtZGF0YWJhc2Uvc3JjL2xpYi9uZ3gtaW5kZXhlZC1kYXRhYmFzZS1zdG9yZS1vcGVyYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxlQUFlLEVBQXFCLE1BQU0sb0NBQW9DLENBQUM7O0FBS3ZGLE1BQU0sT0FBTyx3Q0FBd0M7SUFFbkQsZ0JBQWdCLENBQUM7SUFFSixNQUFNLENBQUksTUFBYyxFQUFFLFNBQWlCLEVBQUUsSUFBTzs7WUFDL0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDbEMsTUFBTSxJQUFJLHlCQUF5QixFQUFFLENBQUM7YUFDdkM7WUFFRCxNQUFNLG9CQUFvQixHQUFxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXRFLE1BQU0sV0FBVyxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxRixNQUFNLFFBQVEsR0FBZ0Isb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQzFELE1BQU0sV0FBVyxHQUFtQixRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqRixNQUFNLEtBQUssR0FBbUIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRSxNQUFNLGFBQWEsR0FBZSxLQUFLLENB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RUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUYsTUFBTSxRQUFRLEdBQWdCLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztZQUMxRCxNQUFNLG1CQUFtQixHQUFjLE1BQU0sQ0FBQyxNQUFNLG1CQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBZSxDQUFDO1lBQ2xHLE1BQU0sMkJBQTJCLEdBQWEsbUJBQW1CO2lCQUM5RCxNQUFNLENBQ0wsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDdEIsT0FBTyxDQUFDLENBQUM7Z0JBQ1AsQ0FDRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzlDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FDMUQsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FDUCxDQUFBO1lBQ0gsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLEtBQUssRUFBRSxDQUFDO1lBRWxCLE1BQU0sd0JBQXdCLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN2SCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMvQyxDQUFDO0tBQUE7O3NJQWpMVSx3Q0FBd0M7MElBQXhDLHdDQUF3QyxjQUZ2QyxNQUFNOzRGQUVQLHdDQUF3QztrQkFIcEQsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNFeGNlcHRpb259IGZyb20gXCIuLi9leGNlcHRpb25zL0ludmFsaWRBcmd1bWVudHNFeGNlcHRpb25cIjtcbmltcG9ydCB7SGVscGVyVXRpbHN9IGZyb20gXCIuLi91dGlscy9oZWxwZXIudXRpbHNcIjtcbmltcG9ydCB7aXNFeGNsdWRlQ29uZmlnLCBTdG9yZXNSZXNldE9wdGlvbnN9IGZyb20gXCIuLi90eXBlcy9zdG9yZXMtcmVzZXQtb3B0aW9ucy50eXBlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5neEluZGV4ZWREYXRhYmFzZVN0b3JlT3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgcHVibGljIGFzeW5jIHVwc2VydDxUPihkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcsIGRhdGE6IFQpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIWRiTmFtZSB8fCAhc3RvcmVOYW1lIHx8ICFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ZWREQk9wZW5SZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lKTtcblxuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoaW5kZXhlZERCT3BlblJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGNvbnN0IGRhdGFiYXNlOiBJREJEYXRhYmFzZSA9IGluZGV4ZWREQk9wZW5SZXF1ZXN0LnJlc3VsdDtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogSURCVHJhbnNhY3Rpb24gPSBkYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgIGNvbnN0IHN0b3JlOiBJREJPYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgY29uc3QgdXBkYXRlUmVxdWVzdDogSURCUmVxdWVzdCA9IHN0b3JlLnB1dChkYXRhKTtcbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KHVwZGF0ZVJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGRhdGFiYXNlPy5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGRiTmFtZTogc3RyaW5nLCBzdG9yZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICBpZiAoIWRiTmFtZSB8fCAhc3RvcmVOYW1lIHx8ICF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZERCT3BlblJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUpO1xuXG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChpbmRleGVkREJPcGVuUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgY29uc3QgZGF0YWJhc2U6IElEQkRhdGFiYXNlID0gaW5kZXhlZERCT3BlblJlcXVlc3QucmVzdWx0O1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBJREJUcmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgY29uc3Qgc3RvcmU6IElEQk9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICBjb25zdCBkZWxldGVSZXF1ZXN0OiBJREJSZXF1ZXN0ID0gc3RvcmUuZGVsZXRlKHZhbHVlKTtcbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KGRlbGV0ZVJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGRhdGFiYXNlPy5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUJ5KGRiTmFtZTogc3RyaW5nLCBzdG9yZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgaWYgKCFkYk5hbWUgfHwgIXN0b3JlTmFtZSB8fCAha2V5IHx8ICF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXhlZERCT3BlblJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUpO1xuXG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChpbmRleGVkREJPcGVuUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgY29uc3QgZGF0YWJhc2U6IElEQkRhdGFiYXNlID0gaW5kZXhlZERCT3BlblJlcXVlc3QucmVzdWx0O1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBJREJUcmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgY29uc3Qgc3RvcmU6IElEQk9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICBjb25zdCBwcmltYXJ5S2V5SW5kZXg6IElEQkluZGV4ID0gc3RvcmUuaW5kZXgoa2V5KVxuICAgIGNvbnN0IGN1cnNvck9wZW5SZXF1ZXN0OiBJREJSZXF1ZXN0ID0gcHJpbWFyeUtleUluZGV4Lm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seSh2YWx1ZSkpO1xuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoY3Vyc29yT3BlblJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGNvbnN0IGRlbGV0ZVJlcXVlc3Q6IElEQlJlcXVlc3QgPSBjdXJzb3JPcGVuUmVxdWVzdC5yZXN1bHQ/LmRlbGV0ZSgpO1xuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoZGVsZXRlUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgZGF0YWJhc2U/LmNsb3NlKCk7XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoZGJOYW1lOiBzdHJpbmcsIHN0b3JlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIGlmICghZGJOYW1lIHx8ICFzdG9yZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZWREQk9wZW5SZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lKTtcblxuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoaW5kZXhlZERCT3BlblJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGNvbnN0IGRhdGFiYXNlOiBJREJEYXRhYmFzZSA9IGluZGV4ZWREQk9wZW5SZXF1ZXN0LnJlc3VsdDtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogSURCVHJhbnNhY3Rpb24gPSBkYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgIGNvbnN0IHN0b3JlOiBJREJPYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgY29uc3QgY2xlYXJSZXF1ZXN0OiBJREJSZXF1ZXN0ID0gc3RvcmUuY2xlYXIoKTtcbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KGNsZWFyUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgZGF0YWJhc2U/LmNsb3NlKCk7XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmluZDxUPihkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgaWYgKCFkYk5hbWUgfHwgIXN0b3JlTmFtZSB8fCAhdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhlZERCT3BlblJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUpO1xuXG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChpbmRleGVkREJPcGVuUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgY29uc3QgZGF0YWJhc2U6IElEQkRhdGFiYXNlID0gaW5kZXhlZERCT3BlblJlcXVlc3QucmVzdWx0O1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBJREJUcmFuc2FjdGlvbiA9IGRhdGFiYXNlLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgXCJyZWFkd3JpdGVcIik7XG4gICAgY29uc3Qgc3RvcmU6IElEQk9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICBjb25zdCByZWFkUmVxdWVzdDogSURCUmVxdWVzdCA9IHN0b3JlLmdldCh2YWx1ZSk7XG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChyZWFkUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgZGF0YWJhc2U/LmNsb3NlKCk7XG5cbiAgICByZXR1cm4gcmVhZFJlcXVlc3Q/LnJlc3VsdCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRCeTxUPihkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGlmICghZGJOYW1lIHx8ICFzdG9yZU5hbWUgfHwgIWtleSB8fCAhdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZWREQk9wZW5SZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lKTtcblxuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoaW5kZXhlZERCT3BlblJlcXVlc3QsICdvbnN1Y2Nlc3MnLCAnb25lcnJvcicpO1xuICAgIGNvbnN0IGRhdGFiYXNlOiBJREJEYXRhYmFzZSA9IGluZGV4ZWREQk9wZW5SZXF1ZXN0LnJlc3VsdDtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogSURCVHJhbnNhY3Rpb24gPSBkYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xuICAgIGNvbnN0IHN0b3JlOiBJREJPYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgY29uc3Qga2V5SW5kZXggPSBzdG9yZS5pbmRleChrZXkpO1xuICAgIGNvbnN0IHJlYWRSZXF1ZXN0OiBJREJSZXF1ZXN0ID0ga2V5SW5kZXguZ2V0KHZhbHVlKTtcbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KHJlYWRSZXF1ZXN0LCAnb25zdWNjZXNzJywgJ29uZXJyb3InKTtcbiAgICBkYXRhYmFzZT8uY2xvc2UoKTtcblxuICAgIHJldHVybiByZWFkUmVxdWVzdD8ucmVzdWx0IHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmluZE1hbnk8VD4oZGJOYW1lOiBzdHJpbmcsIHN0b3JlTmFtZTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBlbnRyaWVzTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogVCB9ID0ge307XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRhdGE6IFQgfCBudWxsID0gYXdhaXQgdGhpcy5maW5kPFQ+KGRiTmFtZSwgc3RvcmVOYW1lLCB2YWx1ZSk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBlbnRyaWVzTWFwW3ZhbHVlICsgJyddID0gZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZW50cmllc01hcCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmluZE1hbnlCeTxUPihkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCBlbnRyaWVzTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogVCB9ID0ge307XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRhdGE6IFQgfCBudWxsID0gYXdhaXQgdGhpcy5maW5kQnk8VD4oZGJOYW1lLCBzdG9yZU5hbWUsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZW50cmllc01hcFt2YWx1ZSArICcnXSA9IGRhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGVudHJpZXNNYXApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZldGNoQWxsPFQ+KGRiTmFtZTogc3RyaW5nLCBzdG9yZU5hbWU6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gICAgaWYgKCFkYk5hbWUgfHwgIXN0b3JlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNFeGNlcHRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleGVkREJPcGVuUmVxdWVzdDogSURCT3BlbkRCUmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSk7XG5cbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KGluZGV4ZWREQk9wZW5SZXF1ZXN0LCAnb25zdWNjZXNzJywgJ29uZXJyb3InKTtcbiAgICBjb25zdCBkYXRhYmFzZTogSURCRGF0YWJhc2UgPSBpbmRleGVkREJPcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgY29uc3QgdHJhbnNhY3Rpb246IElEQlRyYW5zYWN0aW9uID0gZGF0YWJhc2UudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcbiAgICBjb25zdCBzdG9yZTogSURCT2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgIGNvbnN0IHJlYWRSZXF1ZXN0OiBJREJSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChyZWFkUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgZGF0YWJhc2U/LmNsb3NlKCk7XG5cbiAgICByZXR1cm4gcmVhZFJlcXVlc3Q/LnJlc3VsdCB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXNldFN0b3JlcyhkYk5hbWU6IHN0cmluZywgb3B0aW9ucz86IFN0b3Jlc1Jlc2V0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFkYk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhlZERCT3BlblJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUpO1xuXG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChpbmRleGVkREJPcGVuUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgY29uc3QgZGF0YWJhc2U6IElEQkRhdGFiYXNlID0gaW5kZXhlZERCT3BlblJlcXVlc3QucmVzdWx0O1xuICAgIGNvbnN0IGFsbE9iamVjdFN0b3JlTmFtZXM6IHN0cmluZ1tdID0gKE9iamVjdC52YWx1ZXMoey4uLmRhdGFiYXNlLm9iamVjdFN0b3JlTmFtZXN9KSBhcyBzdHJpbmdbXSk7XG4gICAgY29uc3Qgb2JqZWN0U3RvcmVOYW1lc1RvQmVDbGVhcmVkOiBzdHJpbmdbXSA9IGFsbE9iamVjdFN0b3JlTmFtZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzdG9yZU5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgb3B0aW9ucyA/XG4gICAgICAgICAgKFxuICAgICAgICAgICAgaXNFeGNsdWRlQ29uZmlnKG9wdGlvbnMpID9cbiAgICAgICAgICAgICEob3B0aW9ucy5leGNsdWRlIHx8IFtdKS5pbmNsdWRlcyhzdG9yZU5hbWUpIDpcbiAgICAgICAgICAgIChvcHRpb25zLm9ubHkgfHwgYWxsT2JqZWN0U3RvcmVOYW1lcykuaW5jbHVkZXMoc3RvcmVOYW1lKVxuICAgICAgICAgICkgOlxuICAgICAgICAgIHRydWVcbiAgICAgIClcbiAgICBkYXRhYmFzZT8uY2xvc2UoKTtcblxuICAgIGNvbnN0IG9iamVjdFN0b3JlQ2xlYXJSZXF1ZXN0cyA9IG9iamVjdFN0b3JlTmFtZXNUb0JlQ2xlYXJlZC5tYXAoKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB0aGlzLmNsZWFyKGRiTmFtZSwgc3RvcmVOYW1lKSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKG9iamVjdFN0b3JlQ2xlYXJSZXF1ZXN0cyk7XG4gIH1cbn1cbiJdfQ==