UNPKG

browserfs

Version:

A filesystem in your browser!

191 lines 23.9 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var kvfs = require('../generic/key_value_filesystem'); var api_error_1 = require('../core/api_error'); var global = require('../core/global'); var util_1 = require('../core/util'); var indexedDB = global.indexedDB || global.mozIndexedDB || global.webkitIndexedDB || global.msIndexedDB; function convertError(e, message) { if (message === void 0) { message = e.toString(); } switch (e.name) { case "NotFoundError": return new api_error_1.ApiError(api_error_1.ErrorCode.ENOENT, message); case "QuotaExceededError": return new api_error_1.ApiError(api_error_1.ErrorCode.ENOSPC, message); default: return new api_error_1.ApiError(api_error_1.ErrorCode.EIO, message); } } function onErrorHandler(cb, code, message) { if (code === void 0) { code = api_error_1.ErrorCode.EIO; } if (message === void 0) { message = null; } return function (e) { e.preventDefault(); cb(new api_error_1.ApiError(code, message)); }; } var IndexedDBROTransaction = (function () { function IndexedDBROTransaction(tx, store) { this.tx = tx; this.store = store; } IndexedDBROTransaction.prototype.get = function (key, cb) { try { var r = this.store.get(key); r.onerror = onErrorHandler(cb); r.onsuccess = function (event) { var result = event.target.result; if (result === undefined) { cb(null, result); } else { cb(null, util_1.arrayBuffer2Buffer(result)); } }; } catch (e) { cb(convertError(e)); } }; return IndexedDBROTransaction; }()); exports.IndexedDBROTransaction = IndexedDBROTransaction; var IndexedDBRWTransaction = (function (_super) { __extends(IndexedDBRWTransaction, _super); function IndexedDBRWTransaction(tx, store) { _super.call(this, tx, store); } IndexedDBRWTransaction.prototype.put = function (key, data, overwrite, cb) { try { var arraybuffer = util_1.buffer2ArrayBuffer(data), r; if (overwrite) { r = this.store.put(arraybuffer, key); } else { r = this.store.add(arraybuffer, key); } r.onerror = onErrorHandler(cb); r.onsuccess = function (event) { cb(null, true); }; } catch (e) { cb(convertError(e)); } }; IndexedDBRWTransaction.prototype.del = function (key, cb) { try { var r = this.store['delete'](key); r.onerror = onErrorHandler(cb); r.onsuccess = function (event) { cb(); }; } catch (e) { cb(convertError(e)); } }; IndexedDBRWTransaction.prototype.commit = function (cb) { setTimeout(cb, 0); }; IndexedDBRWTransaction.prototype.abort = function (cb) { var _e; try { this.tx.abort(); } catch (e) { _e = convertError(e); } finally { cb(_e); } }; return IndexedDBRWTransaction; }(IndexedDBROTransaction)); exports.IndexedDBRWTransaction = IndexedDBRWTransaction; var IndexedDBStore = (function () { function IndexedDBStore(cb, storeName) { var _this = this; if (storeName === void 0) { storeName = 'browserfs'; } this.storeName = storeName; var openReq = indexedDB.open(this.storeName, 1); openReq.onupgradeneeded = function (event) { var db = event.target.result; if (db.objectStoreNames.contains(_this.storeName)) { db.deleteObjectStore(_this.storeName); } db.createObjectStore(_this.storeName); }; openReq.onsuccess = function (event) { _this.db = event.target.result; cb(null, _this); }; openReq.onerror = onErrorHandler(cb, api_error_1.ErrorCode.EACCES); } IndexedDBStore.prototype.name = function () { return "IndexedDB - " + this.storeName; }; IndexedDBStore.prototype.clear = function (cb) { try { var tx = this.db.transaction(this.storeName, 'readwrite'), objectStore = tx.objectStore(this.storeName), r = objectStore.clear(); r.onsuccess = function (event) { setTimeout(cb, 0); }; r.onerror = onErrorHandler(cb); } catch (e) { cb(convertError(e)); } }; IndexedDBStore.prototype.beginTransaction = function (type) { if (type === void 0) { type = 'readonly'; } var tx = this.db.transaction(this.storeName, type), objectStore = tx.objectStore(this.storeName); if (type === 'readwrite') { return new IndexedDBRWTransaction(tx, objectStore); } else if (type === 'readonly') { return new IndexedDBROTransaction(tx, objectStore); } else { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid transaction type.'); } }; return IndexedDBStore; }()); exports.IndexedDBStore = IndexedDBStore; var IndexedDBFileSystem = (function (_super) { __extends(IndexedDBFileSystem, _super); function IndexedDBFileSystem(cb, storeName) { var _this = this; _super.call(this); new IndexedDBStore(function (e, store) { if (e) { cb(e); } else { _this.init(store, function (e) { cb(e, _this); }); } }, storeName); } IndexedDBFileSystem.isAvailable = function () { try { return typeof indexedDB !== 'undefined' && null !== indexedDB.open("__browserfs_test__"); } catch (e) { return false; } }; return IndexedDBFileSystem; }(kvfs.AsyncKeyValueFileSystem)); exports.__esModule = true; exports["default"] = IndexedDBFileSystem; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZXhlZERCLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmQvSW5kZXhlZERCLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQU8sSUFBSSxXQUFXLGlDQUFpQyxDQUFDLENBQUM7QUFDekQsMEJBQWtDLG1CQUFtQixDQUFDLENBQUE7QUFDdEQsSUFBTyxNQUFNLFdBQVcsZ0JBQWdCLENBQUMsQ0FBQztBQUMxQyxxQkFBcUQsY0FBYyxDQUFDLENBQUE7QUFJcEUsSUFBSSxTQUFTLEdBQWUsTUFBTSxDQUFDLFNBQVM7SUFDWixNQUFPLENBQUMsWUFBWTtJQUNwQixNQUFPLENBQUMsZUFBZTtJQUM3QixNQUFNLENBQUMsV0FBVyxDQUFDO0FBTTdDLHNCQUFzQixDQUFpQixFQUFFLE9BQThCO0lBQTlCLHVCQUE4QixHQUE5QixVQUFrQixDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3JFLE1BQU0sQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxlQUFlO1lBQ2xCLE1BQU0sQ0FBQyxJQUFJLG9CQUFRLENBQUMscUJBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsS0FBSyxvQkFBb0I7WUFDdkIsTUFBTSxDQUFDLElBQUksb0JBQVEsQ0FBQyxxQkFBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRDtZQUVFLE1BQU0sQ0FBQyxJQUFJLG9CQUFRLENBQUMscUJBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztBQUNILENBQUM7QUFPRCx3QkFBd0IsRUFBeUIsRUFDL0MsSUFBK0IsRUFBRSxPQUFzQjtJQUF2RCxvQkFBK0IsR0FBL0IsT0FBa0IscUJBQVMsQ0FBQyxHQUFHO0lBQUUsdUJBQXNCLEdBQXRCLGNBQXNCO0lBQ3ZELE1BQU0sQ0FBQyxVQUFVLENBQU87UUFFdEIsQ0FBQyxDQUFD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QyxDQUFDLEVBQUUsS0FBSSxDQUFDLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFYSwrQkFBVyxHQUF6QjtRQUtFLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMzRixDQUFFO1FBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxBQXpCRCxDQUFpRCxJQUFJLENBQUMsdUJBQXVCLEdBeUI1RTtBQXpCRDt3Q0F5QkMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBrdmZzID0gcmVxdWlyZSgnLi4vZ2VuZXJpYy9rZXlfdmFsdWVfZmlsZXN5c3RlbScpO1xuaW1wb3J0IHtBcGlFcnJvciwgRXJyb3JDb2RlfSBmcm9tICcuLi9jb3JlL2FwaV9lcnJvcic7XG5pbXBvcnQgZ2xvYmFsID0gcmVxdWlyZSgnLi4vY29yZS9nbG9iYWwnKTtcbmltcG9ydCB7YXJyYXlCdWZmZXIyQnVmZmVyLCBidWZmZXIyQXJyYXlCdWZmZXJ9IGZyb20gJy4uL2NvcmUvdXRpbCc7XG4vKipcbiAqIEdldCB0aGUgaW5kZXhlZERCIGNvbnN0cnVjdG9yIGZvciB0aGUgY3VycmVudCBicm93c2VyLlxuICovXG52YXIgaW5kZXhlZERCOiBJREJGYWN0b3J5ID0gZ2xvYmFsLmluZGV4ZWREQiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT5nbG9iYWwpLm1vekluZGV4ZWREQiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT5nbG9iYWwpLndlYmtpdEluZGV4ZWREQiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwubXNJbmRleGVkREI7XG5cbi8qKlxuICogQ29udmVydHMgYSBET01FeGNlcHRpb24gb3IgYSBET01FcnJvciBmcm9tIGFuIEluZGV4ZWREQiBldmVudCBpbnRvIGFcbiAqIHN0YW5kYXJkaXplZCBCcm93c2VyRlMgQVBJIGVycm9yLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0RXJyb3IoZToge25hbWU6IHN0cmluZ30sIG1lc3NhZ2U6IHN0cmluZyA9IGUudG9TdHJpbmcoKSk6IEFwaUVycm9yIHtcbiAgc3dpdGNoKGUubmFtZSkge1xuICAgIGNhc2UgXCJOb3RGb3VuZEVycm9yXCI6XG4gICAgICByZXR1cm4gbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FTk9FTlQsIG1lc3NhZ2UpO1xuICAgIGNhc2UgXCJRdW90YUV4Y2VlZGVkRXJyb3JcIjpcbiAgICAgIHJldHVybiBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVOT1NQQywgbWVzc2FnZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFRoZSByZXN0IGRvIG5vdCBzZWVtIHRvIG1hcCBjbGVhbmx5IHRvIHN0YW5kYXJkIGVycm9yIGNvZGVzLlxuICAgICAgcmV0dXJuIG5ldyBBcGlFcnJvcihFcnJvckNvZGUuRUlPLCBtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2R1Y2VzIGEgbmV3IG9uZXJyb3IgaGFuZGxlciBmb3IgSURCLiBPdXIgZXJyb3JzIGFyZSBhbHdheXMgZmF0YWwsIHNvIHdlXG4gKiBoYW5kbGUgdGhlbSBnZW5lcmljYWxseTogQ2FsbCB0aGUgdXNlci1zdXBwbGllZCBjYWxsYmFjayB3aXRoIGEgdHJhbnNsYXRlZFxuICogdmVyc2lvbiBvZiB0aGUgZXJyb3IsIGFuZCBsZXQgdGhlIGVycm9yIGJ1YmJsZSB1cC5cbiAqL1xuZnVuY3Rpb24gb25FcnJvckhhbmRsZXIoY2I6IChlOiBBcGlFcnJvcikgPT4gdm9pZCxcbiAgY29kZTogRXJyb3JDb2RlID0gRXJyb3JDb2RlLkVJTywgbWVzc2FnZTogc3RyaW5nID0gbnVsbCk6IChlPzogYW55KSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChlPzogYW55KTogdm9pZCB7XG4gICAgLy8gUHJldmVudCB0aGUgZXJyb3IgZnJvbSBjYW5jZWxpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjYihuZXcgQXBpRXJyb3IoY29kZSwgbWVzc2FnZSkpO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgSW5kZXhlZERCUk9UcmFuc2FjdGlvbiBpbXBsZW1lbnRzIGt2ZnMuQXN5bmNLZXlWYWx1ZVJPVHJhbnNhY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHg6IElEQlRyYW5zYWN0aW9uLCBwdWJsaWMgc3RvcmU6IElEQk9iamVjdFN0b3JlKSB7IH1cblxuICBnZXQoa2V5OiBzdHJpbmcsIGNiOiAoZTogQXBpRXJyb3IsIGRhdGE/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByOiBJREJSZXF1ZXN0ID0gdGhpcy5zdG9yZS5nZXQoa2V5KTtcbiAgICAgIHIub25lcnJvciA9IG9uRXJyb3JIYW5kbGVyKGNiKTtcbiAgICAgIHIub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIElEQiByZXR1cm5zIHRoZSB2YWx1ZSAndW5kZWZpbmVkJyB3aGVuIHlvdSB0cnkgdG8gZ2V0IGtleXMgdGhhdFxuICAgICAgICAvLyBkb24ndCBleGlzdC4gVGhlIGNhbGxlciBleHBlY3RzIHRoaXMgYmVoYXZpb3IuXG4gICAgICAgIHZhciByZXN1bHQ6IGFueSA9ICg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0O1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjYihudWxsLCByZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElEQiBkYXRhIGlzIHN0b3JlZCBhcyBhbiBBcnJheUJ1ZmZlclxuICAgICAgICAgIGNiKG51bGwsIGFycmF5QnVmZmVyMkJ1ZmZlcihyZXN1bHQpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihjb252ZXJ0RXJyb3IoZSkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5kZXhlZERCUldUcmFuc2FjdGlvbiBleHRlbmRzIEluZGV4ZWREQlJPVHJhbnNhY3Rpb24gaW1wbGVtZW50cyBrdmZzLkFzeW5jS2V5VmFsdWVSV1RyYW5zYWN0aW9uLCBrdmZzLkFzeW5jS2V5VmFsdWVST1RyYW5zYWN0aW9uIHtcbiAgY29uc3RydWN0b3IodHg6IElEQlRyYW5zYWN0aW9uLCBzdG9yZTogSURCT2JqZWN0U3RvcmUpIHtcbiAgICBzdXBlcih0eCwgc3RvcmUpO1xuICB9XG5cbiAgcHVibGljIHB1dChrZXk6IHN0cmluZywgZGF0YTogTm9kZUJ1ZmZlciwgb3ZlcndyaXRlOiBib29sZWFuLCBjYjogKGU6IEFwaUVycm9yLCBjb21taXR0ZWQ/OiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBhcnJheWJ1ZmZlciA9IGJ1ZmZlcjJBcnJheUJ1ZmZlcihkYXRhKSxcbiAgICAgICAgcjogSURCUmVxdWVzdDtcbiAgICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgICAgciA9IHRoaXMuc3RvcmUucHV0KGFycmF5YnVmZmVyLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gJ2FkZCcgd2lsbCBuZXZlciBvdmVyd3JpdGUgYW4gZXhpc3Rpbmcga2V5LlxuICAgICAgICByID0gdGhpcy5zdG9yZS5hZGQoYXJyYXlidWZmZXIsIGtleSk7XG4gICAgICB9XG4gICAgICAvLyBYWFg6IE5FRUQgVE8gUkVUVVJOIEZBTFNFIFdIRU4gQUREIEhBUyBBIEtFWSBDT05GTElDVC4gTk8gRVJST1IuXG4gICAgICByLm9uZXJyb3IgPSBvbkVycm9ySGFuZGxlcihjYik7XG4gICAgICByLm9uc3VjY2VzcyA9IChldmVudCkgPT4ge1xuICAgICAgICBjYihudWxsLCB0cnVlKTtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2IoY29udmVydEVycm9yKGUpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsKGtleTogc3RyaW5nLCBjYjogKGU/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBOT1RFOiBJRTggaGFzIGEgYnVnIHdpdGggaWRlbnRpZmllcnMgbmFtZWQgJ2RlbGV0ZScgdW5sZXNzIHVzZWQgYXMgYSBzdHJpbmdcbiAgICAgIC8vIGxpa2UgdGhpcy5cbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NDc5MTUyXG4gICAgICB2YXIgcjogSURCUmVxdWVzdCA9IHRoaXMuc3RvcmVbJ2RlbGV0ZSddKGtleSk7XG4gICAgICByLm9uZXJyb3IgPSBvbkVycm9ySGFuZGxlcihjYik7XG4gICAgICByLm9uc3VjY2VzcyA9IChldmVudCkgPT4ge1xuICAgICAgICBjYigpO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihjb252ZXJ0RXJyb3IoZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb21taXQoY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBSZXR1cm4gdG8gdGhlIGV2ZW50IGxvb3AgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbi5cbiAgICBzZXRUaW1lb3V0KGNiLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBhYm9ydChjYjogKGU/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHZhciBfZTogQXBpRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudHguYWJvcnQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBfZSA9IGNvbnZlcnRFcnJvcihlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2IoX2UpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5kZXhlZERCU3RvcmUgaW1wbGVtZW50cyBrdmZzLkFzeW5jS2V5VmFsdWVTdG9yZSB7XG4gIHByaXZhdGUgZGI6IElEQkRhdGFiYXNlO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGFuIEluZGV4ZWREQiBmaWxlIHN5c3RlbS5cbiAgICogQHBhcmFtIGNiIENhbGxlZCBvbmNlIHRoZSBkYXRhYmFzZSBpcyBpbnN0YW50aWF0ZWQgYW5kIHJlYWR5IGZvciB1c2UuXG4gICAqICAgUGFzc2VzIGFuIGVycm9yIGlmIHRoZXJlIHdhcyBhbiBpc3N1ZSBpbnN0YW50aWF0aW5nIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIG9iamVjdFN0b3JlTmFtZSBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgc3lzdGVtLiBZb3UgY2FuIGhhdmVcbiAgICogICBtdWx0aXBsZSBJbmRleGVkREIgZmlsZSBzeXN0ZW1zIG9wZXJhdGluZyBhdCBvbmNlLCBidXQgZWFjaCBtdXN0IGhhdmVcbiAgICogICBhIGRpZmZlcmVudCBuYW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2I6IChlOiBBcGlFcnJvciwgc3RvcmU/OiBJbmRleGVkREJTdG9yZSkgPT4gdm9pZCwgcHJpdmF0ZSBzdG9yZU5hbWU6IHN0cmluZyA9ICdicm93c2VyZnMnKSB7XG4gICAgdmFyIG9wZW5SZXE6IElEQk9wZW5EQlJlcXVlc3QgPSBpbmRleGVkREIub3Blbih0aGlzLnN0b3JlTmFtZSwgMSk7XG5cbiAgICBvcGVuUmVxLm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgdmFyIGRiOiBJREJEYXRhYmFzZSA9ICg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0O1xuICAgICAgLy8gSHVoLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IHdlJ3JlIGF0IHZlcnNpb24gMS4gV2h5IGRvZXMgYW5vdGhlclxuICAgICAgLy8gZGF0YWJhc2UgZXhpc3Q/XG4gICAgICBpZiAoZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLnN0b3JlTmFtZSkpIHtcbiAgICAgICAgZGIuZGVsZXRlT2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpO1xuICAgICAgfVxuICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpO1xuICAgIH07XG5cbiAgICBvcGVuUmVxLm9uc3VjY2VzcyA9IChldmVudCkgPT4ge1xuICAgICAgdGhpcy5kYiA9ICg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0O1xuICAgICAgY2IobnVsbCwgdGhpcyk7XG4gICAgfTtcblxuICAgIG9wZW5SZXEub25lcnJvciA9IG9uRXJyb3JIYW5kbGVyKGNiLCBFcnJvckNvZGUuRUFDQ0VTKTtcbiAgfVxuXG4gIHB1YmxpYyBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiSW5kZXhlZERCIC0gXCIgKyB0aGlzLnN0b3JlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihjYjogKGU/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB2YXIgdHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCAncmVhZHdyaXRlJyksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLFxuICAgICAgICByOiBJREJSZXF1ZXN0ID0gb2JqZWN0U3RvcmUuY2xlYXIoKTtcbiAgICAgIHIub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGNvbW1pdCB0cmFuc2FjdGlvbi5cbiAgICAgICAgc2V0VGltZW91dChjYiwgMCk7XG4gICAgICB9O1xuICAgICAgci5vbmVycm9yID0gb25FcnJvckhhbmRsZXIoY2IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGNvbnZlcnRFcnJvcihlKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJlZ2luVHJhbnNhY3Rpb24odHlwZTogc3RyaW5nID0gJ3JlYWRvbmx5Jyk6IGt2ZnMuQXN5bmNLZXlWYWx1ZVJPVHJhbnNhY3Rpb24ge1xuICAgIHZhciB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsIHR5cGUpLFxuICAgICAgb2JqZWN0U3RvcmUgPSB0eC5vYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7XG4gICAgaWYgKHR5cGUgPT09ICdyZWFkd3JpdGUnKSB7XG4gICAgICByZXR1cm4gbmV3IEluZGV4ZWREQlJXVHJhbnNhY3Rpb24odHgsIG9iamVjdFN0b3JlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZWFkb25seScpIHtcbiAgICAgIHJldHVybiBuZXcgSW5kZXhlZERCUk9UcmFuc2FjdGlvbih0eCwgb2JqZWN0U3RvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVJTlZBTCwgJ0ludmFsaWQgdHJhbnNhY3Rpb24gdHlwZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGZpbGUgc3lzdGVtIHRoYXQgdXNlcyB0aGUgSW5kZXhlZERCIGtleSB2YWx1ZSBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5kZXhlZERCRmlsZVN5c3RlbSBleHRlbmRzIGt2ZnMuQXN5bmNLZXlWYWx1ZUZpbGVTeXN0ZW0ge1xuICBjb25zdHJ1Y3RvcihjYjogKGU6IEFwaUVycm9yLCBmcz86IEluZGV4ZWREQkZpbGVTeXN0ZW0pID0+IHZvaWQsIHN0b3JlTmFtZT86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgbmV3IEluZGV4ZWREQlN0b3JlKChlLCBzdG9yZT8pOiB2b2lkID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNiKGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbml0KHN0b3JlLCAoZT8pID0+IHtcbiAgICAgICAgICBjYihlLCB0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgc3RvcmVOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgLy8gSW4gU2FmYXJpJ3MgcHJpdmF0ZSBicm93c2luZyBtb2RlLCBpbmRleGVkREIub3BlbiByZXR1cm5zIE5VTEwuXG4gICAgLy8gSW4gRmlyZWZveCwgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAvLyBJbiBDaHJvbWUsIGl0IFwianVzdCB3b3Jrc1wiLCBhbmQgY2xlYXJzIHRoZSBkYXRhYmFzZSB3aGVuIHlvdSBsZWF2ZSB0aGUgcGFnZS5cbiAgICAvLyBVbnRlc3RlZDogT3BlcmEsIElFLlxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcgJiYgbnVsbCAhPT0gaW5kZXhlZERCLm9wZW4oXCJfX2Jyb3dzZXJmc190ZXN0X19cIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIl19