UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

276 lines (274 loc) 26.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/clients/basic/client.ts import { processEndpoint } from "../../engine/index.mjs"; import { CircularEngineReferenceError, Closed, ConnectionConflictError, ConnectionUnavailableError, EngineNotFoundError, RpcResponseError, SurrealTypeError, unreachable } from "../../errors/index.mjs"; import { getTimeoutSignal, mutex, TaskEmitter } from "../../utils/index.mjs"; var _close_dec, _connect_dec, _init; _connect_dec = [mutex], _close_dec = [mutex]; var _BasicClient = class _BasicClient { constructor(config) { __runInitializers(_init, 5, this); this.ee = new TaskEmitter(); this.fmt = void 0; this.eng = null; this._engines = void 0; const { engines, formatter, disableDefaultErrorHandler } = config; this.fmt = formatter; this._engines = engines; if (!disableDefaultErrorHandler) { this.ee.on("error", (_, e) => { if (e.fatal) { console.error("[@tai-kun/surrealdb]", "FATAL", e); this.close({ force: true }).then(null, (reason) => { console.error("[@tai-kun/surrealdb]", reason); }); } else { console.warn("[@tai-kun/surrealdb]", "WARNING", e); } }); } } async createEngine(scheme) { let engine = this._engines[scheme]; const seen = []; while (typeof engine === "string") { if (seen.includes(engine)) { throw new CircularEngineReferenceError(seen); } seen.push(engine); engine = this._engines[engine]; } if (!engine) { throw new EngineNotFoundError(scheme); } return await engine({ emitter: this.ee, formatter: this.fmt }); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#state) */ get state() { return this.eng?.state ?? "closed"; } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#endpoint) */ get endpoint() { return this.eng?.endpoint; } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#namespace) */ get namespace() { return this.eng?.namespace; } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#database) */ get database() { return this.eng?.database; } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#token) */ get token() { return this.eng?.token; } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#getconnectioninfo) */ getConnectionInfo() { return this.eng?.getConnectionInfo(); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#on) */ on(event, listener) { this.ee.on(event, listener); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#off) */ off(event, listener) { if (typeof listener !== "function") { throw new SurrealTypeError("Function", listener); } this.ee.off(event, listener); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#once) */ once(event, options) { return this.ee.once(event, options); } connect(endpoint, options = {}) { try { const conn = this.getConnectionInfo(); endpoint = processEndpoint(endpoint, options); if (conn?.state === "open") { if (conn.endpoint.href === endpoint.href) { return Promise.resolve(); } throw new ConnectionConflictError(conn.endpoint, endpoint); } if (this.eng) { unreachable(conn); } const scheme = endpoint.protocol.slice( 0, -1 /* remove `:` */ ); const { signal = getTimeoutSignal(15e3) } = options; return (async () => { try { this.eng = await this.createEngine(scheme); await this.eng.connect({ endpoint, signal }); } catch (e) { this.eng = null; throw e; } })(); } catch (e) { return Promise.reject(e); } } close(options = {}) { if (!this.eng) { return Promise.resolve(); } const eng = this.eng; this.eng = null; try { if (options.force) { this.ee.abort(new Closed("force close")); } return (async () => { try { await eng.close({ signal: options.signal || getTimeoutSignal(15e3) }); } finally { await this.ee.idle(); } })(); } catch (e) { return Promise.reject(e); } } async rpc(method, params, options = {}) { const { signal = getTimeoutSignal(5e3) } = options; if (this.eng?.state !== "open") { await this.ee.once("open", { signal }); } if (!this.eng) { throw new ConnectionUnavailableError({ cause: "The engine is not set." }); } return await rpc({ engine: this.eng, signal, method, params }); } }; _init = __decoratorStart(null); __decorateElement(_init, 1, "connect", _connect_dec, _BasicClient); __decorateElement(_init, 1, "close", _close_dec, _BasicClient); __decoratorMetadata(_init, _BasicClient); __name(_BasicClient, "BasicClient"); var BasicClient = _BasicClient; async function rpc(args) { const resp = await args.engine.rpc({ signal: args.signal, // @ts-expect-error request: { method: args.method, params: args.params } }); if ("result" in resp) { return resp.result; } throw new RpcResponseError(resp, { cause: { method: args.method, // TODO(tai-kun): params には機微情報が含まれている可能性があるので、method のみにしておく? params: args.params } }); } __name(rpc, "rpc"); export { BasicClient as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaWVudHMvYmFzaWMvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xuICB0eXBlIENvbm5lY3Rpb25JbmZvLFxuICB0eXBlIENvbm5lY3Rpb25TdGF0ZSxcbiAgdHlwZSBFbmdpbmVBYmMsXG4gIHR5cGUgRW5naW5lQWJjQ29uZmlnLFxuICB0eXBlIEVuZ2luZUV2ZW50TWFwLFxuICBwcm9jZXNzRW5kcG9pbnQsXG4gIHR5cGUgUHJvY2Vzc0VuZHBvaW50T3B0aW9ucyxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lbmdpbmVcIjtcbmltcG9ydCB7XG4gIENpcmN1bGFyRW5naW5lUmVmZXJlbmNlRXJyb3IsXG4gIENsb3NlZCxcbiAgQ29ubmVjdGlvbkNvbmZsaWN0RXJyb3IsXG4gIENvbm5lY3Rpb25VbmF2YWlsYWJsZUVycm9yLFxuICBFbmdpbmVOb3RGb3VuZEVycm9yLFxuICBScGNSZXNwb25zZUVycm9yLFxuICBTdXJyZWFsVHlwZUVycm9yLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybWF0dGVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9mb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIHtcbiAgUnBjTWV0aG9kLFxuICBScGNQYXJhbXMsXG4gIFJwY1Jlc3BvbnNlLFxuICBScGNSZXN1bHQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFRpbWVvdXRTaWduYWwsXG4gIG11dGV4LFxuICB0eXBlIFN0YXRlZnVsUHJvbWlzZSxcbiAgVGFza0VtaXR0ZXIsXG4gIHR5cGUgVGFza0xpc3RlbmVyLFxuICB0eXBlIFRhc2tMaXN0ZW5lck9wdGlvbnMsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgQ3JlYXRlRW5naW5lID0gKGNvbmZpZzogRW5naW5lQWJjQ29uZmlnKSA9PlxuICB8IEVuZ2luZUFiY1xuICB8IFByb21pc2VMaWtlPEVuZ2luZUFiYz47XG5cbmV4cG9ydCB0eXBlIENsaWVudEVuZ2luZXMgPSB7XG4gIHJlYWRvbmx5IFtfIGluIHN0cmluZ10/OiBDcmVhdGVFbmdpbmUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIHJlYWRvbmx5IGVuZ2luZXM6IENsaWVudEVuZ2luZXM7XG4gIHJlYWRvbmx5IGZvcm1hdHRlcjogRm9ybWF0dGVyO1xuICByZWFkb25seSBkaXNhYmxlRGVmYXVsdEVycm9ySGFuZGxlcj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q29ubmVjdE9wdGlvbnMgZXh0ZW5kcyBQcm9jZXNzRW5kcG9pbnRPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q2xvc2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRScGNPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2ljQ2xpZW50IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVlOiBUYXNrRW1pdHRlcjxFbmdpbmVFdmVudE1hcD4gPSBuZXcgVGFza0VtaXR0ZXIoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZtdDogRm9ybWF0dGVyO1xuICBwcm90ZWN0ZWQgZW5nOiBFbmdpbmVBYmMgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9lbmdpbmVzOiBDbGllbnRFbmdpbmVzO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2xpZW50Q29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgZW5naW5lcyxcbiAgICAgIGZvcm1hdHRlcixcbiAgICAgIGRpc2FibGVEZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIH0gPSBjb25maWc7XG4gICAgdGhpcy5mbXQgPSBmb3JtYXR0ZXI7XG4gICAgdGhpcy5fZW5naW5lcyA9IGVuZ2luZXM7XG5cbiAgICBpZiAoIWRpc2FibGVEZWZhdWx0RXJyb3JIYW5kbGVyKSB7XG4gICAgICB0aGlzLmVlLm9uKFwiZXJyb3JcIiwgKF8sIGUpID0+IHtcbiAgICAgICAgaWYgKGUuZmF0YWwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0B0YWkta3VuL3N1cnJlYWxkYl1cIiwgXCJGQVRBTFwiLCBlKTtcbiAgICAgICAgICB0aGlzLmNsb3NlKHsgZm9yY2U6IHRydWUgfSkudGhlbihudWxsLCByZWFzb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltAdGFpLWt1bi9zdXJyZWFsZGJdXCIsIHJlYXNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW0B0YWkta3VuL3N1cnJlYWxkYl1cIiwgXCJXQVJOSU5HXCIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlRW5naW5lKHNjaGVtZTogc3RyaW5nKTogUHJvbWlzZTxFbmdpbmVBYmM+IHtcbiAgICBsZXQgZW5naW5lID0gdGhpcy5fZW5naW5lc1tzY2hlbWVdO1xuICAgIGNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5cbiAgICB3aGlsZSAodHlwZW9mIGVuZ2luZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHNlZW4uaW5jbHVkZXMoZW5naW5lKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ2lyY3VsYXJFbmdpbmVSZWZlcmVuY2VFcnJvcihzZWVuKTtcbiAgICAgIH1cblxuICAgICAgc2Vlbi5wdXNoKGVuZ2luZSk7XG4gICAgICBlbmdpbmUgPSB0aGlzLl9lbmdpbmVzW2VuZ2luZV07XG4gICAgfVxuXG4gICAgaWYgKCFlbmdpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFbmdpbmVOb3RGb3VuZEVycm9yKHNjaGVtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGVuZ2luZSh7XG4gICAgICBlbWl0dGVyOiB0aGlzLmVlLFxuICAgICAgZm9ybWF0dGVyOiB0aGlzLmZtdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI3N0YXRlKVxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IENvbm5lY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5zdGF0ZSA/PyBcImNsb3NlZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jZW5kcG9pbnQpXG4gICAqL1xuICBnZXQgZW5kcG9pbnQoKTogVVJMIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5lbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI25hbWVzcGFjZSlcbiAgICovXG4gIGdldCBuYW1lc3BhY2UoKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5uYW1lc3BhY2U7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNkYXRhYmFzZSlcbiAgICovXG4gIGdldCBkYXRhYmFzZSgpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbmc/LmRhdGFiYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jdG9rZW4pXG4gICAqL1xuICBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy50b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI2dldGNvbm5lY3Rpb25pbmZvKVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbkluZm8oKTogQ29ubmVjdGlvbkluZm8gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVuZz8uZ2V0Q29ubmVjdGlvbkluZm8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI29uKVxuICAgKi9cbiAgb248VEV2ZW50IGV4dGVuZHMga2V5b2YgRW5naW5lRXZlbnRNYXA+KFxuICAgIGV2ZW50OiBURXZlbnQsXG4gICAgbGlzdGVuZXI6IFRhc2tMaXN0ZW5lcjxFbmdpbmVFdmVudE1hcFtURXZlbnRdPixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lZS5vbihldmVudCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jb2ZmKVxuICAgKi9cbiAgb2ZmPFRFdmVudCBleHRlbmRzIGtleW9mIEVuZ2luZUV2ZW50TWFwPihcbiAgICBldmVudDogVEV2ZW50LFxuICAgIGxpc3RlbmVyOiBUYXNrTGlzdGVuZXI8RW5naW5lRXZlbnRNYXBbVEV2ZW50XT4sXG4gICk6IHZvaWQge1xuICAgIC8vIFx1OEFBNFx1MzA2M1x1MzA2Nlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2RVx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBFQVx1MzBCOVx1MzBDQVx1MzBGQ1x1MzA5Mlx1ODlFM1x1OTY2NFx1MzA1N1x1MzA2Nlx1MzA1N1x1MzA3RVx1MzA4Rlx1MzA2QVx1MzA0NFx1MzA4OFx1MzA0Nlx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVxuICAgIC8vIGxpc3RlbmVyIFx1MzA0Q1x1NzEyMVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Rlx1MzBBOFx1MzBFOVx1MzBGQ1x1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA4Qlx1MzAwMlxuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFN1cnJlYWxUeXBlRXJyb3IoXCJGdW5jdGlvblwiLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5lZS5vZmYoZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI29uY2UpXG4gICAqL1xuICBvbmNlPFRFdmVudCBleHRlbmRzIGtleW9mIEVuZ2luZUV2ZW50TWFwPihcbiAgICBldmVudDogVEV2ZW50LFxuICAgIG9wdGlvbnM/OiBUYXNrTGlzdGVuZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBTdGF0ZWZ1bFByb21pc2U8RW5naW5lRXZlbnRNYXBbVEV2ZW50XT4ge1xuICAgIHJldHVybiB0aGlzLmVlLm9uY2UoZXZlbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jY29ubmVjdClcbiAgICovXG4gIEBtdXRleFxuICBjb25uZWN0KFxuICAgIGVuZHBvaW50OiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9uczogQ2xpZW50Q29ubmVjdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldENvbm5lY3Rpb25JbmZvKCk7XG4gICAgICBlbmRwb2ludCA9IHByb2Nlc3NFbmRwb2ludChlbmRwb2ludCwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChjb25uPy5zdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgICAgaWYgKGNvbm4uZW5kcG9pbnQuaHJlZiA9PT0gZW5kcG9pbnQuaHJlZikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uQ29uZmxpY3RFcnJvcihjb25uLmVuZHBvaW50LCBlbmRwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVuZykge1xuICAgICAgICB1bnJlYWNoYWJsZShjb25uIGFzIG5ldmVyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NoZW1lID0gZW5kcG9pbnQucHJvdG9jb2wuc2xpY2UoMCwgLTEgLyogcmVtb3ZlIGA6YCAqLyk7XG4gICAgICBjb25zdCB7IHNpZ25hbCA9IGdldFRpbWVvdXRTaWduYWwoMTVfMDAwKSB9ID0gb3B0aW9ucztcblxuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5lbmcgPSBhd2FpdCB0aGlzLmNyZWF0ZUVuZ2luZShzY2hlbWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5nLmNvbm5lY3QoeyBlbmRwb2ludCwgc2lnbmFsIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5lbmcgPSBudWxsO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI2Nsb3NlKVxuICAgKi9cbiAgQG11dGV4XG4gIGNsb3NlKG9wdGlvbnM6IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmVuZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZyA9IHRoaXMuZW5nO1xuICAgIHRoaXMuZW5nID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICB0aGlzLmVlLmFib3J0KG5ldyBDbG9zZWQoXCJmb3JjZSBjbG9zZVwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuZy5jbG9zZSh7XG4gICAgICAgICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIHx8IGdldFRpbWVvdXRTaWduYWwoMTVfMDAwKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmVlLmlkbGUoKTsgLy8gXHUzMEE4XHUzMEU5XHUzMEZDXHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDZBXHUzMDQ0XHUzMDAyXG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJwYzxUTWV0aG9kIGV4dGVuZHMgUnBjTWV0aG9kLCBUUmVzdWx0IGV4dGVuZHMgUnBjUmVzdWx0PFRNZXRob2Q+PihcbiAgICBtZXRob2Q6IFRNZXRob2QsXG4gICAgcGFyYW1zOiBScGNQYXJhbXM8VE1ldGhvZD4sXG4gICAgb3B0aW9uczogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9LFxuICApOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IHNpZ25hbCA9IGdldFRpbWVvdXRTaWduYWwoNV8wMDApIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHRoaXMuZW5nPy5zdGF0ZSAhPT0gXCJvcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZWUub25jZShcIm9wZW5cIiwgeyBzaWduYWwgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuZykge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25VbmF2YWlsYWJsZUVycm9yKHtcbiAgICAgICAgY2F1c2U6IFwiVGhlIGVuZ2luZSBpcyBub3Qgc2V0LlwiLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJwYyh7XG4gICAgICBlbmdpbmU6IHRoaXMuZW5nLFxuICAgICAgc2lnbmFsLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJwYzxcbiAgVE1ldGhvZCBleHRlbmRzIFJwY01ldGhvZCxcbiAgVFJlc3VsdCBleHRlbmRzIFJwY1Jlc3VsdDxUTWV0aG9kPixcbj4oXG4gIGFyZ3M6IHtcbiAgICByZWFkb25seSBlbmdpbmU6IEVuZ2luZUFiYztcbiAgICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xuICAgIHJlYWRvbmx5IG1ldGhvZDogVE1ldGhvZDtcbiAgICByZWFkb25seSBwYXJhbXM6IFJwY1BhcmFtczxUTWV0aG9kPjtcbiAgfSxcbik6IFByb21pc2U8VFJlc3VsdD4ge1xuICBjb25zdCByZXNwOiBScGNSZXNwb25zZTxhbnk+ID0gYXdhaXQgYXJncy5lbmdpbmUucnBjKHtcbiAgICBzaWduYWw6IGFyZ3Muc2lnbmFsLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IGFyZ3MubWV0aG9kLFxuICAgICAgcGFyYW1zOiBhcmdzLnBhcmFtcyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoXCJyZXN1bHRcIiBpbiByZXNwKSB7XG4gICAgcmV0dXJuIHJlc3AucmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IFJwY1Jlc3BvbnNlRXJyb3IocmVzcCwge1xuICAgIGNhdXNlOiB7XG4gICAgICBtZXRob2Q6IGFyZ3MubWV0aG9kLFxuICAgICAgLy8gVE9ETyh0YWkta3VuKTogcGFyYW1zIFx1MzA2Qlx1MzA2Rlx1NkE1Rlx1NUZBRVx1NjBDNVx1NTgzMVx1MzA0Q1x1NTQyQlx1MzA3RVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTNFRlx1ODBGRFx1NjAyN1x1MzA0Q1x1MzA0Mlx1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMW1ldGhvZCBcdTMwNkVcdTMwN0ZcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEFcdTMwNEZcdUZGMUZcbiAgICAgIHBhcmFtczogYXJncy5wYXJhbXMsXG4gICAgfSxcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSxFQU1FO0FBQUEsT0FFSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FB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