UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

202 lines (200 loc) 22.7 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 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 __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 import { SurrealValueError } from "../errors/index.mjs"; import { mutex } from "../utils/index.mjs"; import createSurql from "./surql/create-surql.mjs"; 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 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 = [mutex], _close_dec = [mutex], _closeAll_dec = [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: createSurql({ formatter, varPrefix }) }; } __name(initPool, "initPool"); export { initPool as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3N1cnJlYWwvaW5pdC1wb29sLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSBDbGllbnRCYXNlIGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvYmFzaWMtY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudENsb3NlT3B0aW9ucyxcbiAgQ2xpZW50Q29uZmlnLFxufSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Jhc2ljLWNsaWVudFwiO1xuaW1wb3J0IHsgU3VycmVhbFZhbHVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBtdXRleCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IGNyZWF0ZVN1cnFsLCB7XG4gIHR5cGUgQ3JlYXRlU3VycWxDb25maWcsXG4gIHR5cGUgU3VycWwsXG59IGZyb20gXCIuL3N1cnFsL2NyZWF0ZS1zdXJxbFwiO1xuXG50eXBlIENsaWVudENvbnN0cnVjdG9yID0gbmV3KGNvbmZpZzogQ2xpZW50Q29uZmlnKSA9PiBDbGllbnRCYXNlO1xuXG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb29sU2V0dXBPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgQWxpYXMgPSB7IHJlYWRvbmx5IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBVUkwgfTtcblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9vbEluaXQ8XG4gIFRDbGllbnRDb25zdHJ1Y3RvciBleHRlbmRzIENsaWVudENvbnN0cnVjdG9yLFxuICBUQWxpYXMgZXh0ZW5kcyBBbGlhcyxcbj4gZXh0ZW5kcyBDbGllbnRDb25maWcsIENyZWF0ZVN1cnFsQ29uZmlnIHtcbiAgcmVhZG9ubHkgQ2xpZW50OiBUQ2xpZW50Q29uc3RydWN0b3I7XG4gIHJlYWRvbmx5IGFsaWFzPzogVEFsaWFzIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzZXR1cD86IChcbiAgICB0aGlzOiBJbnN0YW5jZVR5cGU8VENsaWVudENvbnN0cnVjdG9yPixcbiAgICBlbmRwb2ludDogVVJMLFxuICAgIG9wdGlvbnM6IFBvb2xTZXR1cE9wdGlvbnMsXG4gICAgYWxpYXM6IGtleW9mIFRBbGlhcyB8IHVuZGVmaW5lZCxcbiAgKSA9PiBQcm9taXNlTGlrZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFBvb2xTdXJyZWFsPFRDbGllbnRDb25zdHJ1Y3RvciBleHRlbmRzIENsaWVudENvbnN0cnVjdG9yPiA9XG4gICYgSW5zdGFuY2VUeXBlPFRDbGllbnRDb25zdHJ1Y3Rvcj5cbiAgJiBEaXNwb3NhYmxlXG4gICYgeyBkaXNjb25uZWN0KG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIH07XG5cbnR5cGUgRW5kcG9pbnQ8VEFsaWFzIGV4dGVuZHMgQWxpYXM+ID0gRXh0cmFjdDxrZXlvZiBUQWxpYXMsIHN0cmluZz47XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xJbnN0YW5jZTxcbiAgVENsaWVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ2xpZW50Q29uc3RydWN0b3IsXG4gIFRBbGlhcyBleHRlbmRzIEFsaWFzLFxuPiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGdldChcbiAgICBlbmRwb2ludDogRW5kcG9pbnQ8VEFsaWFzPiB8IFVSTCxcbiAgICBvcHRpb25zPzogUG9vbFNldHVwT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxQb29sU3VycmVhbDxUQ2xpZW50Q29uc3RydWN0b3I+PjtcbiAgY2xvc2UoXG4gICAgZW5kcG9pbnQ6IEVuZHBvaW50PFRBbGlhcz4gfCBVUkwsXG4gICAgb3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcbiAgY2xvc2VBbGwob3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xPcHRpb25zPFxuICBUQ2xpZW50Q29uc3RydWN0b3IgZXh0ZW5kcyBDbGllbnRDb25zdHJ1Y3RvcixcbiAgVEFsaWFzIGV4dGVuZHMgQWxpYXMsXG4+IHtcbiAgcmVhZG9ubHkgYWxpYXM/OiBUQWxpYXMgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNldHVwPzogUG9vbEluaXQ8VENsaWVudENvbnN0cnVjdG9yLCBUQWxpYXM+W1wic2V0dXBcIl07XG4gIHJlYWRvbmx5IGNsb3NlRGVsYXk/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVkUG9vbDxcbiAgVENsaWVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ2xpZW50Q29uc3RydWN0b3IsXG4gIFRBbGlhcyBleHRlbmRzIEFsaWFzLFxuPiB7XG4gIFBvb2w6IG5ldzxjb25zdCBUUG9vbEFsaWFzIGV4dGVuZHMgQWxpYXMgPSB7fT4oXG4gICAgb3B0aW9ucz86IFBvb2xPcHRpb25zPFRDbGllbnRDb25zdHJ1Y3RvciwgVFBvb2xBbGlhcz4gfCB1bmRlZmluZWQsXG4gICkgPT4gUG9vbEluc3RhbmNlPFxuICAgIFRDbGllbnRDb25zdHJ1Y3RvcixcbiAgICBPbWl0PFRBbGlhcywga2V5b2YgVFBvb2xBbGlhcz4gJiBUUG9vbEFsaWFzXG4gID47XG4gIHN1cnFsOiBTdXJxbDtcbn1cblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRQb29sPFxuICBUQ2xpZW50Q29uc3RydWN0b3IgZXh0ZW5kcyBDbGllbnRDb25zdHJ1Y3RvcixcbiAgY29uc3QgVEFsaWFzIGV4dGVuZHMgQWxpYXMgPSB7fSxcbj4oXG4gIGluaXQ6IFBvb2xJbml0PFRDbGllbnRDb25zdHJ1Y3RvciwgVEFsaWFzPixcbik6IEluaXRpYWxpemVkUG9vbDxUQ2xpZW50Q29uc3RydWN0b3IsIFRBbGlhcz4ge1xuICBjb25zdCB7XG4gICAgYWxpYXMsXG4gICAgc2V0dXAgPSBhc3luYyBmdW5jdGlvbihlbmRwb2ludCwgb3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0KGVuZHBvaW50LCBvcHRpb25zKTtcbiAgICB9LFxuICAgIENsaWVudCxcbiAgICBmb3JtYXR0ZXIsXG4gICAgdmFyUHJlZml4LFxuICAgIC4uLm90aGVyc1xuICB9ID0gaW5pdDtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNsYXNzIFN1cnJlYWwgZXh0ZW5kcyBDbGllbnQgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3Bvc2U6ICgpID0+IHZvaWQpIHtcbiAgICAgIHN1cGVyKHtcbiAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAuLi5vdGhlcnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5kaXNwb3NlIHx8IFN5bWJvbC5mb3IoXCJTeW1ib2wuZGlzcG9zZVwiKV0oKTogdm9pZCB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNsYXNzIFBvb2wgaW1wbGVtZW50cyBQb29sSW5zdGFuY2U8Q2xpZW50Q29uc3RydWN0b3IsIEFsaWFzPiB7XG4gICAgcHJpdmF0ZSBtYXAgPSBuZXcgTWFwPHN0cmluZywgW1xuICAgICAgbnVtYmVyLFxuICAgICAgUG9vbFN1cnJlYWw8Q2xpZW50Q29uc3RydWN0b3I+LFxuICAgICAgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4/LFxuICAgIF0+KCk7XG5cbiAgICBwcml2YXRlIGNsb3NpbmcgPSBuZXcgU2V0PFxuICAgICAgKG9wdGlvbnM6IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgID4oKTtcblxuICAgIHByaXZhdGUgc2V0dXA6IE5vbk51bGxhYmxlPFBvb2xJbml0PENsaWVudENvbnN0cnVjdG9yLCBBbGlhcz5bXCJzZXR1cFwiXT47XG5cbiAgICBwcml2YXRlIGFsaWFzOiBBbGlhcztcblxuICAgIHByaXZhdGUgY2xvc2VEZWxheTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICBvcHRpb25zOiBQb29sT3B0aW9uczxDbGllbnRDb25zdHJ1Y3RvciwgQWxpYXM+IHwgdW5kZWZpbmVkID0ge30sXG4gICAgKSB7XG4gICAgICB0aGlzLnNldHVwID0gKG9wdGlvbnMuc2V0dXAgfHwgc2V0dXApIGFzIE5vbk51bGxhYmxlPFxuICAgICAgICBQb29sSW5pdDxDbGllbnRDb25zdHJ1Y3RvciwgQWxpYXM+W1wic2V0dXBcIl1cbiAgICAgID47XG4gICAgICB0aGlzLmFsaWFzID0geyAuLi5hbGlhcywgLi4ub3B0aW9ucy5hbGlhcyB9O1xuICAgICAgdGhpcy5jbG9zZURlbGF5ID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5jbG9zZURlbGF5ID8/IDMwZTMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXJsKGVuZHBvaW50OiBFbmRwb2ludDxBbGlhcz4gfCBVUkwpOiBVUkwgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHR5cGVvZiBlbmRwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbGlhc1tlbmRwb2ludF0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBuZXcgVVJMKHRoaXMuYWxpYXNbZW5kcG9pbnRdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBVUkwoZW5kcG9pbnQpOyAvLyBjb3B5XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkoZW5kcG9pbnQ6IEVuZHBvaW50PEFsaWFzPiB8IFVSTCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRVcmwoZW5kcG9pbnQpPy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIEBtdXRleFxuICAgIGFzeW5jIGdldChcbiAgICAgIGVuZHBvaW50OiBFbmRwb2ludDxBbGlhcz4gfCBVUkwsXG4gICAgICBvcHRpb25zOiBQb29sU2V0dXBPcHRpb25zIHwgdW5kZWZpbmVkID0ge30sXG4gICAgKTogUHJvbWlzZTxQb29sU3VycmVhbDxDbGllbnRDb25zdHJ1Y3Rvcj4+IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKGVuZHBvaW50KTtcbiAgICAgIGNvbnN0IGFsaWFzID0gdHlwZW9mIGVuZHBvaW50ID09PSBcInN0cmluZ1wiID8gZW5kcG9pbnQgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBTdXJyZWFsVmFsdWVFcnJvcihcInByZWRlZmluZWQgZW5kcG9pbnRcIiwgdXJsLCB7XG4gICAgICAgICAgY2F1c2U6IHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1cmwudG9TdHJpbmcoKTtcblxuICAgICAgaWYgKHRoaXMubWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWFwLmdldChrZXkpITtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHZhbFsyXSk7XG4gICAgICAgIGRlbGV0ZSB2YWxbMl07XG4gICAgICAgIGNvbnN0IGRiID0gdmFsWzFdO1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwLmNhbGwoZGIsIHVybCwgb3B0aW9ucywgYWxpYXMpO1xuICAgICAgICB2YWxbMF0gKz0gMTtcblxuICAgICAgICByZXR1cm4gZGI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRiID0gbmV3IFN1cnJlYWwoKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoa2V5KTtcblxuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbFswXSAtPSAxO1xuXG4gICAgICAgIGlmICh2YWxbMF0gPiAwIHx8IDIgaW4gdmFsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNsb3NlID0gYXN5bmMgKG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodmFsWzJdKTtcbiAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICBwcm9taXNlIHx8PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdmFsWzFdLmNsb3NlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPKHRhaS1rdW4pOiBUYXNrRW1pdHRlciBcdTMwOTJcdTRGN0ZcdTMwNjNcdTMwNjZcdTUyMjlcdTc1MjhcdTgwMDVcdTMwNENcdTMwQThcdTMwRTlcdTMwRkNcdTMwOTJcdTUzRDdcdTMwNTFcdTUzRDZcdTMwOENcdTMwOEJcdTMwODhcdTMwNDZcdTMwNkJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2luZy5kZWxldGUoY2xvc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFsWzJdID0gc2V0VGltZW91dChjbG9zZSwgdGhpcy5jbG9zZURlbGF5KTtcbiAgICAgICAgdGhpcy5jbG9zaW5nLmFkZChjbG9zZSk7XG4gICAgICB9KSBhcyB1bmtub3duIGFzIFBvb2xTdXJyZWFsPENsaWVudENvbnN0cnVjdG9yPjtcbiAgICAgIGF3YWl0IHRoaXMuc2V0dXAuY2FsbChkYiwgdXJsLCBvcHRpb25zLCBhbGlhcyk7XG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCBbMSwgZGJdKTtcblxuICAgICAgcmV0dXJuIGRiO1xuICAgIH1cblxuICAgIEBtdXRleFxuICAgIGFzeW5jIGNsb3NlKFxuICAgICAgZW5kcG9pbnQ6IEVuZHBvaW50PEFsaWFzPiB8IFVSTCxcbiAgICAgIG9wdGlvbnM/OiBDbGllbnRDbG9zZU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShlbmRwb2ludCk7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLm1hcC5nZXQoa2V5ISk7XG5cbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywgZGJdID0gdmFsO1xuXG4gICAgICBpZiAoZGIuc3RhdGUgPT09IFwiY2xvc2VkXCIgfHwgZGIuc3RhdGUgPT09IFwiY2xvc2luZ1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGIuY2xvc2Uob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgQG11dGV4XG4gICAgYXN5bmMgY2xvc2VBbGwob3B0aW9ucz86IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgZm9yIChjb25zdCBbLCBkYl0gb2YgdGhpcy5tYXAudmFsdWVzKCkpIHtcbiAgICAgICAgZGIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy5jbG9zaW5nXS5tYXAoYXN5bmMgY2xvc2UgPT4ge1xuICAgICAgICBhd2FpdCBjbG9zZShvcHRpb25zKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKV0oKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgUG9vbCxcbiAgICBzdXJxbDogY3JlYXRlU3VycWwoe1xuICAgICAgZm9ybWF0dGVyLFxuICAgICAgdmFyUHJlZml4LFxuICAgIH0pLFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsYUFBYTtBQUN0QixPQUFPLGlCQUdBO0FBeUZRLFNBQVIsU0FJTCxNQUM2QztBQXhHL0M7QUF5R0UsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBLFFBQVEsc0NBQWUsVUFBVSxTQUFTO0FBQ3hDLFVBQUksS0FBSyxVQUFVLFFBQVE7QUFDekI7QUFBQSxNQUNGO0FBRUEsWUFBTSxLQUFLLFFBQVEsVUFBVSxPQUFPO0FBQUEsSUFDdEMsR0FOUTtBQUFBLElBT1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBRztBQUFBLEVBQ0wsSUFBSTtBQUdKLFFBQU0sV0FBTixNQUFNLGlCQUFnQixPQUE2QjtBQUFBLElBQ2pELFlBQW9CLFNBQXFCO0FBQ3ZDLFlBQU07QUFBQSxRQUNKO0FBQUEsUUFD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