@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
229 lines (227 loc) • 24.3 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
var __runInitializers = (array, flags, self, value) => {
for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
return value;
};
var __decorateElement = (array, flags, name, decorators, target, extra) => {
var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
return __privateGet(this, extra);
}, set [name](x) {
return __privateSet(this, extra, x);
} }, name));
k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
for (var i = decorators.length - 1; i >= 0; i--) {
ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
if (k) {
ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
}
it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
else if (typeof it !== "object" || it === null) __typeError("Object expected");
else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
}
return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
};
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
// src/surreal/init-pool.ts
var init_pool_exports = {};
__export(init_pool_exports, {
default: () => initPool
});
module.exports = __toCommonJS(init_pool_exports);
var import_errors = require("../errors/index.cjs");
var import_utils = require("../utils/index.cjs");
var import_create_surql = __toESM(require("./surql/create-surql.cjs"), 1);
function initPool(init) {
var _closeAll_dec, _close_dec, _get_dec, _init;
const {
alias,
setup = /* @__PURE__ */ __name(async function(endpoint, options) {
if (this.state === "open") {
return;
}
await this.connect(endpoint, options);
}, "setup"),
Client,
formatter,
varPrefix,
...others
} = init;
const _Surreal = class _Surreal extends Client {
constructor(dispose) {
super({
formatter,
...others
});
this.dispose = dispose;
}
disconnect() {
this.dispose();
}
[Symbol.dispose || Symbol.for("Symbol.dispose")]() {
this.disconnect();
}
};
__name(_Surreal, "Surreal");
let Surreal = _Surreal;
const _Pool = class _Pool {
constructor(options = {}) {
__runInitializers(_init, 5, this);
this.map = /* @__PURE__ */ new Map();
this.closing = /* @__PURE__ */ new Set();
this.setup = void 0;
this.alias = void 0;
this.closeDelay = void 0;
this.setup = options.setup || setup;
this.alias = { ...alias, ...options.alias };
this.closeDelay = Math.max(0, options.closeDelay ?? 3e4);
}
getUrl(endpoint) {
if (typeof endpoint === "string") {
return this.alias[endpoint] === void 0 ? void 0 : new URL(this.alias[endpoint]);
}
return new URL(endpoint);
}
getKey(endpoint) {
return this.getUrl(endpoint)?.toString();
}
async get(endpoint, options = {}) {
const url = this.getUrl(endpoint);
const alias2 = typeof endpoint === "string" ? endpoint : void 0;
if (!url) {
throw new import_errors.SurrealValueError("predefined endpoint", url, {
cause: {
alias: alias2
}
});
}
const key = url.toString();
if (this.map.has(key)) {
const val = this.map.get(key);
clearTimeout(val[2]);
delete val[2];
const db2 = val[1];
await this.setup.call(db2, url, options, alias2);
val[0] += 1;
return db2;
}
const db = new Surreal(() => {
const val = this.map.get(key);
if (!val) {
return;
}
val[0] -= 1;
if (val[0] > 0 || 2 in val) {
return;
}
let promise;
const close = /* @__PURE__ */ __name(async (options2) => {
clearTimeout(val[2]);
this.map.delete(key);
promise ||= (async () => {
try {
await val[1].close(options2);
} catch (e) {
console.error(e);
} finally {
this.closing.delete(close);
}
})();
return promise;
}, "close");
val[2] = setTimeout(close, this.closeDelay);
this.closing.add(close);
});
await this.setup.call(db, url, options, alias2);
this.map.set(key, [1, db]);
return db;
}
async close(endpoint, options) {
const key = this.getKey(endpoint);
const val = this.map.get(key);
if (!val) {
return;
}
const [, db] = val;
if (db.state === "closed" || db.state === "closing") {
return;
}
await db.close(options);
}
async closeAll(options) {
for (const [, db] of this.map.values()) {
db.disconnect();
}
await Promise.all([...this.closing].map(async (close) => {
await close(options);
}));
}
async [(_get_dec = [import_utils.mutex], _close_dec = [import_utils.mutex], _closeAll_dec = [import_utils.mutex], Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose"))]() {
await this.closeAll();
}
};
_init = __decoratorStart(null);
__decorateElement(_init, 1, "get", _get_dec, _Pool);
__decorateElement(_init, 1, "close", _close_dec, _Pool);
__decorateElement(_init, 1, "closeAll", _closeAll_dec, _Pool);
__decoratorMetadata(_init, _Pool);
__name(_Pool, "Pool");
let Pool = _Pool;
return {
// @ts-expect-error
Pool,
surql: (0, import_create_surql.default)({
formatter,
varPrefix
})
};
}
__name(initPool, "initPool");
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3N1cnJlYWwvaW5pdC1wb29sLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSBDbGllbnRCYXNlIGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvYmFzaWMtY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudENsb3NlT3B0aW9ucyxcbiAgQ2xpZW50Q29uZmlnLFxufSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Jhc2ljLWNsaWVudFwiO1xuaW1wb3J0IHsgU3VycmVhbFZhbHVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBtdXRleCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IGNyZWF0ZVN1cnFsLCB7XG4gIHR5cGUgQ3JlYXRlU3VycWxDb25maWcsXG4gIHR5cGUgU3VycWwsXG59IGZyb20gXCIuL3N1cnFsL2NyZWF0ZS1zdXJxbFwiO1xuXG50eXBlIENsaWVudENvbnN0cnVjdG9yID0gbmV3KGNvbmZpZzogQ2xpZW50Q29uZmlnKSA9PiBDbGllbnRCYXNlO1xuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb29sU2V0dXBPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgQWxpYXMgPSB7IHJlYWRvbmx5IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBVUkwgfTtcblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9vbEluaXQ8XG4gIFRDbGllbnRDb25zdHJ1Y3RvciBleHRlbmRzIENsaWVudENvbnN0cnVjdG9yLFxuICBUQWxpYXMgZXh0ZW5kcyBBbGlhcyxcbj4gZXh0ZW5kcyBDbGllbnRDb25maWcsIENyZWF0ZVN1cnFsQ29uZmlnIHtcbiAgcmVhZG9ubHkgQ2xpZW50OiBUQ2xpZW50Q29uc3RydWN0b3I7XG4gIHJlYWRvbmx5IGFsaWFzPzogVEFsaWFzIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzZXR1cD86IChcbiAgICB0aGlzOiBJbnN0YW5jZVR5cGU8VENsaWVudENvbnN0cnVjdG9yPixcbiAgICBlbmRwb2ludDogVVJMLFxuICAgIG9wdGlvbnM6IFBvb2xTZXR1cE9wdGlvbnMsXG4gICAgYWxpYXM6IGtleW9mIFRBbGlhcyB8IHVuZGVmaW5lZCxcbiAgKSA9PiBQcm9taXNlTGlrZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFBvb2xTdXJyZWFsPFRDbGllbnRDb25zdHJ1Y3RvciBleHRlbmRzIENsaWVudENvbnN0cnVjdG9yPiA9XG4gICYgSW5zdGFuY2VUeXBlPFRDbGllbnRDb25zdHJ1Y3Rvcj5cbiAgJiBEaXNwb3NhYmxlXG4gICYgeyBkaXNjb25uZWN0KG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIH07XG5cbnR5cGUgRW5kcG9pbnQ8VEFsaWFzIGV4dGVuZHMgQWxpYXM+ID0gRXh0cmFjdDxrZXlvZiBUQWxpYXMsIHN0cmluZz47XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xJbnN0YW5jZTxcbiAgVENsaWVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ2xpZW50Q29uc3RydWN0b3IsXG4gIFRBbGlhcyBleHRlbmRzIEFsaWFzLFxuPiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGdldChcbiAgICBlbmRwb2ludDogRW5kcG9pbnQ8VEFsaWFzPiB8IFVSTCxcbiAgICBvcHRpb25zPzogUG9vbFNldHVwT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxQb29sU3VycmVhbDxUQ2xpZW50Q29uc3RydWN0b3I+PjtcbiAgY2xvc2UoXG4gICAgZW5kcG9pbnQ6IEVuZHBvaW50PFRBbGlhcz4gfCBVUkwsXG4gICAgb3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcbiAgY2xvc2VBbGwob3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xPcHRpb25zPFxuICBUQ2xpZW50Q29uc3RydWN0b3IgZXh0ZW5kcyBDbGllbnRDb25zdHJ1Y3RvcixcbiAgVEFsaWFzIGV4dGVuZHMgQWxpYXMsXG4+IHtcbiAgcmVhZG9ubHkgYWxpYXM/OiBUQWxpYXMgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNldHVwPzogUG9vbEluaXQ8VENsaWVudENvbnN0cnVjdG9yLCBUQWxpYXM+W1wic2V0dXBcIl07XG4gIHJlYWRvbmx5IGNsb3NlRGVsYXk/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVkUG9vbDxcbiAgVENsaWVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ2xpZW50Q29uc3RydWN0b3IsXG4gIFRBbGlhcyBleHRlbmRzIEFsaWFzLFxuPiB7XG4gIFBvb2w6IG5ldzxjb25zdCBUUG9vbEFsaWFzIGV4dGVuZHMgQWxpYXMgPSB7fT4oXG4gICAgb3B0aW9ucz86IFBvb2xPcHRpb25zPFRDbGllbnRDb25zdHJ1Y3RvciwgVFBvb2xBbGlhcz4gfCB1bmRlZmluZWQsXG4gICkgPT4gUG9vbEluc3RhbmNlPFxuICAgIFRDbGllbnRDb25zdHJ1Y3RvcixcbiAgICBPbWl0PFRBbGlhcywga2V5b2YgVFBvb2xBbGlhcz4gJiBUUG9vbEFsaWFzXG4gID47XG4gIHN1cnFsOiBTdXJxbDtcbn1cblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRQb29sPFxuICBUQ2xpZW50Q29uc3RydWN0b3IgZXh0ZW5kcyBDbGllbnRDb25zdHJ1Y3RvcixcbiAgY29uc3QgVEFsaWFzIGV4dGVuZHMgQWxpYXMgPSB7fSxcbj4oXG4gIGluaXQ6IFBvb2xJbml0PFRDbGllbnRDb25zdHJ1Y3RvciwgVEFsaWFzPixcbik6IEluaXRpYWxpemVkUG9vbDxUQ2xpZW50Q29uc3RydWN0b3IsIFRBbGlhcz4ge1xuICBjb25zdCB7XG4gICAgYWxpYXMsXG4gICAgc2V0dXAgPSBhc3luYyBmdW5jdGlvbihlbmRwb2ludCwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0KGVuZHBvaW50LCBvcHRpb25zKTtcbiAgICB9LFxuICAgIENsaWVudCxcbiAgICBmb3JtYXR0ZXIsXG4gICAgdmFyUHJlZml4LFxuICAgIC4uLm90aGVyc1xuICB9ID0gaW5pdDtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNsYXNzIFN1cnJlYWwgZXh0ZW5kcyBDbGllbnQgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3Bvc2U6ICgpID0+IHZvaWQpIHtcbiAgICAgIHN1cGVyKHtcbiAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAuLi5vdGhlcnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5kaXNwb3NlIHx8IFN5bWJvbC5mb3IoXCJTeW1ib2wuZGlzcG9zZVwiKV0oKTogdm9pZCB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNsYXNzIFBvb2wgaW1wbGVtZW50cyBQb29sSW5zdGFuY2U8Q2xpZW50Q29uc3RydWN0b3IsIEFsaWFzPiB7XG4gICAgcHJpdmF0ZSBtYXAgPSBuZXcgTWFwPHN0cmluZywgW1xuICAgICAgbnVtYmVyLFxuICAgICAgUG9vbFN1cnJlYWw8Q2xpZW50Q29uc3RydWN0b3I+LFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4/LFxuICAgIF0+KCk7XG5cbiAgICBwcml2YXRlIGNsb3NpbmcgPSBuZXcgU2V0PFxuICAgICAgKG9wdGlvbnM6IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgID4oKTtcblxuICAgIHByaXZhdGUgc2V0dXA6IE5vbk51bGxhYmxlPFBvb2xJbml0PENsaWVudENvbnN0cnVjdG9yLCBBbGlhcz5bXCJzZXR1cFwiXT47XG5cbiAgICBwcml2YXRlIGFsaWFzOiBBbGlhcztcblxuICAgIHByaXZhdGUgY2xvc2VEZWxheTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICBvcHRpb25zOiBQb29sT3B0aW9uczxDbGllbnRDb25zdHJ1Y3RvciwgQWxpYXM+IHwgdW5kZWZpbmVkID0ge30sXG4gICAgKSB7XG4gICAgICB0aGlzLnNldHVwID0gKG9wdGlvbnMuc2V0dXAgfHwgc2V0dXApIGFzIE5vbk51bGxhYmxlPFxuICAgICAgICBQb29sSW5pdDxDbGllbnRDb25zdHJ1Y3RvciwgQWxpYXM+W1wic2V0dXBcIl1cbiAgICAgID47XG4gICAgICB0aGlzLmFsaWFzID0geyAuLi5hbGlhcywgLi4ub3B0aW9ucy5hbGlhcyB9O1xuICAgICAgdGhpcy5jbG9zZURlbGF5ID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5jbG9zZURlbGF5ID8/IDMwZTMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXJsKGVuZHBvaW50OiBFbmRwb2ludDxBbGlhcz4gfCBVUkwpOiBVUkwgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHR5cGVvZiBlbmRwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGlhc1tlbmRwb2ludF0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBuZXcgVVJMKHRoaXMuYWxpYXNbZW5kcG9pbnRdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBVUkwoZW5kcG9pbnQpOyAvLyBjb3B5XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkoZW5kcG9pbnQ6IEVuZHBvaW50PEFsaWFzPiB8IFVSTCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRVcmwoZW5kcG9pbnQpPy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIEBtdXRleFxuICAgIGFzeW5jIGdldChcbiAgICAgIGVuZHBvaW50OiBFbmRwb2ludDxBbGlhcz4gfCBVUkwsXG4gICAgICBvcHRpb25zOiBQb29sU2V0dXBPcHRpb25zIHwgdW5kZWZpbmVkID0ge30sXG4gICAgKTogUHJvbWlzZTxQb29sU3VycmVhbDxDbGllbnRDb25zdHJ1Y3Rvcj4+IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKGVuZHBvaW50KTtcbiAgICAgIGNvbnN0IGFsaWFzID0gdHlwZW9mIGVuZHBvaW50ID09PSBcInN0cmluZ1wiID8gZW5kcG9pbnQgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcInByZWRlZmluZWQgZW5kcG9pbnRcIiwgdXJsLCB7XG4gICAgICAgICAgY2F1c2U6IHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1cmwudG9TdHJpbmcoKTtcblxuICAgICAgaWYgKHRoaXMubWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWFwLmdldChrZXkpITtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHZhbFsyXSk7XG4gICAgICAgIGRlbGV0ZSB2YWxbMl07XG4gICAgICAgIGNvbnN0IGRiID0gdmFsWzFdO1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwLmNhbGwoZGIsIHVybCwgb3B0aW9ucywgYWxpYXMpO1xuICAgICAgICB2YWxbMF0gKz0gMTtcblxuICAgICAgICByZXR1cm4gZGI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRiID0gbmV3IFN1cnJlYWwoKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbFswXSAtPSAxO1xuXG4gICAgICAgIGlmICh2YWxbMF0gPiAwIHx8IDIgaW4gdmFsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gYXN5bmMgKG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodmFsWzJdKTtcbiAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICBwcm9taXNlIHx8PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdmFsWzFdLmNsb3NlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPKHRhaS1rdW4pOiBUYXNrRW1pdHRlciBcdTMwOTJcdTRGN0ZcdTMwNjNcdTMwNjZcdTUyMjlcdTc1MjhcdTgwMDVcdTMwNENcdTMwQThcdTMwRTlcdTMwRkNcdTMwOTJcdTUzRDdcdTMwNTFcdTUzRDZcdTMwOENcdTMwOEJcdTMwODhcdTMwNDZcdTMwNkJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2luZy5kZWxldGUoY2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFsWzJdID0gc2V0VGltZW91dChjbG9zZSwgdGhpcy5jbG9zZURlbGF5KTtcbiAgICAgICAgdGhpcy5jbG9zaW5nLmFkZChjbG9zZSk7XG4gICAgICB9KSBhcyB1bmtub3duIGFzIFBvb2xTdXJyZWFsPENsaWVudENvbnN0cnVjdG9yPjtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dXAuY2FsbChkYiwgdXJsLCBvcHRpb25zLCBhbGlhcyk7XG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCBbMSwgZGJdKTtcblxuICAgICAgcmV0dXJuIGRiO1xuICAgIH1cblxuICAgIEBtdXRleFxuICAgIGFzeW5jIGNsb3NlKFxuICAgICAgZW5kcG9pbnQ6IEVuZHBvaW50PEFsaWFzPiB8IFVSTCxcbiAgICAgIG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShlbmRwb2ludCk7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoa2V5ISk7XG5cbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywgZGJdID0gdmFsO1xuXG4gICAgICBpZiAoZGIuc3RhdGUgPT09IFwiY2xvc2VkXCIgfHwgZGIuc3RhdGUgPT09IFwiY2xvc2luZ1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIuY2xvc2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgQG11dGV4XG4gICAgYXN5bmMgY2xvc2VBbGwob3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgZm9yIChjb25zdCBbLCBkYl0gb2YgdGhpcy5tYXAudmFsdWVzKCkpIHtcbiAgICAgICAgZGIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5jbG9zaW5nXS5tYXAoYXN5bmMgY2xvc2UgPT4ge1xuICAgICAgICBhd2FpdCBjbG9zZShvcHRpb25zKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKV0oKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgUG9vbCxcbiAgICBzdXJxbDogY3JlYXRlU3VycWwoe1xuICAgICAgZm9ybWF0dGVyLFxuICAgICAgdmFyUHJlZml4LFxuICAgIH0pLFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0Esb0JBQWtDO0FBQ2xDLG1CQUFzQjtBQUN0QiwwQkFHTztBQXlGUSxTQUFSLFNBSUwsTUFDNkM7QUF4Ry9DO0FBeUdFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQSxRQUFRLHNDQUFlLFVBQVUsU0FBUztBQUN4QyxVQUFJLEtBQUssVUFBVSxRQUFRO0FBQ3pCO0FBQUEsTUFDRjtBQUVBLFlBQU0sS0FBSyxRQUFRLFVBQVUsT0FBTztBQUFBLElBQ3RDLEdBTlE7QUFBQSxJQU9SO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxFQUNMLElBQUk7QUFHSixRQUFNLFdBQU4sTUFBTSxpQkFBZ0IsT0FBNkI7QUFBQSxJQUNqRCxZQUFv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