UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

279 lines (277 loc) 27.4 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; 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 __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/clients/basic/client.ts var client_exports = {}; __export(client_exports, { default: () => BasicClient }); module.exports = __toCommonJS(client_exports); var import_engine = require("../../engine/index.cjs"); var import_errors = require("../../errors/index.cjs"); var import_utils = require("../../utils/index.cjs"); var _close_dec, _connect_dec, _init; _connect_dec = [import_utils.mutex], _close_dec = [import_utils.mutex]; var _BasicClient = class _BasicClient { constructor(config) { __runInitializers(_init, 5, this); this.ee = new import_utils.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 import_errors.CircularEngineReferenceError(seen); } seen.push(engine); engine = this._engines[engine]; } if (!engine) { throw new import_errors.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 import_errors.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 = (0, import_engine.processEndpoint)(endpoint, options); if (conn?.state === "open") { if (conn.endpoint.href === endpoint.href) { return Promise.resolve(); } throw new import_errors.ConnectionConflictError(conn.endpoint, endpoint); } if (this.eng) { (0, import_errors.unreachable)(conn); } const scheme = endpoint.protocol.slice( 0, -1 /* remove `:` */ ); const { signal = (0, import_utils.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 import_errors.Closed("force close")); } return (async () => { try { await eng.close({ signal: options.signal || (0, import_utils.getTimeoutSignal)(15e3) }); } finally { await this.ee.idle(); } })(); } catch (e) { return Promise.reject(e); } } async rpc(method, params, options = {}) { const { signal = (0, import_utils.getTimeoutSignal)(5e3) } = options; if (this.eng?.state !== "open") { await this.ee.once("open", { signal }); } if (!this.eng) { throw new import_errors.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 import_errors.RpcResponseError(resp, { cause: { method: args.method, // TODO(tai-kun): params には機微情報が含まれている可能性があるので、method のみにしておく? params: args.params } }); } __name(rpc, "rpc"); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaWVudHMvYmFzaWMvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xuICB0eXBlIENvbm5lY3Rpb25JbmZvLFxuICB0eXBlIENvbm5lY3Rpb25TdGF0ZSxcbiAgdHlwZSBFbmdpbmVBYmMsXG4gIHR5cGUgRW5naW5lQWJjQ29uZmlnLFxuICB0eXBlIEVuZ2luZUV2ZW50TWFwLFxuICBwcm9jZXNzRW5kcG9pbnQsXG4gIHR5cGUgUHJvY2Vzc0VuZHBvaW50T3B0aW9ucyxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lbmdpbmVcIjtcbmltcG9ydCB7XG4gIENpcmN1bGFyRW5naW5lUmVmZXJlbmNlRXJyb3IsXG4gIENsb3NlZCxcbiAgQ29ubmVjdGlvbkNvbmZsaWN0RXJyb3IsXG4gIENvbm5lY3Rpb25VbmF2YWlsYWJsZUVycm9yLFxuICBFbmdpbmVOb3RGb3VuZEVycm9yLFxuICBScGNSZXNwb25zZUVycm9yLFxuICBTdXJyZWFsVHlwZUVycm9yLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybWF0dGVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9mb3JtYXR0ZXJcIjtcbmltcG9ydCB0eXBlIHtcbiAgUnBjTWV0aG9kLFxuICBScGNQYXJhbXMsXG4gIFJwY1Jlc3BvbnNlLFxuICBScGNSZXN1bHQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFRpbWVvdXRTaWduYWwsXG4gIG11dGV4LFxuICB0eXBlIFN0YXRlZnVsUHJvbWlzZSxcbiAgVGFza0VtaXR0ZXIsXG4gIHR5cGUgVGFza0xpc3RlbmVyLFxuICB0eXBlIFRhc2tMaXN0ZW5lck9wdGlvbnMsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgQ3JlYXRlRW5naW5lID0gKGNvbmZpZzogRW5naW5lQWJjQ29uZmlnKSA9PlxuICB8IEVuZ2luZUFiY1xuICB8IFByb21pc2VMaWtlPEVuZ2luZUFiYz47XG5cbmV4cG9ydCB0eXBlIENsaWVudEVuZ2luZXMgPSB7XG4gIHJlYWRvbmx5IFtfIGluIHN0cmluZ10/OiBDcmVhdGVFbmdpbmUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIHJlYWRvbmx5IGVuZ2luZXM6IENsaWVudEVuZ2luZXM7XG4gIHJlYWRvbmx5IGZvcm1hdHRlcjogRm9ybWF0dGVyO1xuICByZWFkb25seSBkaXNhYmxlRGVmYXVsdEVycm9ySGFuZGxlcj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q29ubmVjdE9wdGlvbnMgZXh0ZW5kcyBQcm9jZXNzRW5kcG9pbnRPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q2xvc2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRScGNPcHRpb25zIHtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2ljQ2xpZW50IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVlOiBUYXNrRW1pdHRlcjxFbmdpbmVFdmVudE1hcD4gPSBuZXcgVGFza0VtaXR0ZXIoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZtdDogRm9ybWF0dGVyO1xuICBwcm90ZWN0ZWQgZW5nOiBFbmdpbmVBYmMgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9lbmdpbmVzOiBDbGllbnRFbmdpbmVzO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2xpZW50Q29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgZW5naW5lcyxcbiAgICAgIGZvcm1hdHRlcixcbiAgICAgIGRpc2FibGVEZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIH0gPSBjb25maWc7XG4gICAgdGhpcy5mbXQgPSBmb3JtYXR0ZXI7XG4gICAgdGhpcy5fZW5naW5lcyA9IGVuZ2luZXM7XG5cbiAgICBpZiAoIWRpc2FibGVEZWZhdWx0RXJyb3JIYW5kbGVyKSB7XG4gICAgICB0aGlzLmVlLm9uKFwiZXJyb3JcIiwgKF8sIGUpID0+IHtcbiAgICAgICAgaWYgKGUuZmF0YWwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0B0YWkta3VuL3N1cnJlYWxkYl1cIiwgXCJGQVRBTFwiLCBlKTtcbiAgICAgICAgICB0aGlzLmNsb3NlKHsgZm9yY2U6IHRydWUgfSkudGhlbihudWxsLCByZWFzb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltAdGFpLWt1bi9zdXJyZWFsZGJdXCIsIHJlYXNvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW0B0YWkta3VuL3N1cnJlYWxkYl1cIiwgXCJXQVJOSU5HXCIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlRW5naW5lKHNjaGVtZTogc3RyaW5nKTogUHJvbWlzZTxFbmdpbmVBYmM+IHtcbiAgICBsZXQgZW5naW5lID0gdGhpcy5fZW5naW5lc1tzY2hlbWVdO1xuICAgIGNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5cbiAgICB3aGlsZSAodHlwZW9mIGVuZ2luZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHNlZW4uaW5jbHVkZXMoZW5naW5lKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ2lyY3VsYXJFbmdpbmVSZWZlcmVuY2VFcnJvcihzZWVuKTtcbiAgICAgIH1cblxuICAgICAgc2Vlbi5wdXNoKGVuZ2luZSk7XG4gICAgICBlbmdpbmUgPSB0aGlzLl9lbmdpbmVzW2VuZ2luZV07XG4gICAgfVxuXG4gICAgaWYgKCFlbmdpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFbmdpbmVOb3RGb3VuZEVycm9yKHNjaGVtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGVuZ2luZSh7XG4gICAgICBlbWl0dGVyOiB0aGlzLmVlLFxuICAgICAgZm9ybWF0dGVyOiB0aGlzLmZtdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI3N0YXRlKVxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IENvbm5lY3Rpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5zdGF0ZSA/PyBcImNsb3NlZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jZW5kcG9pbnQpXG4gICAqL1xuICBnZXQgZW5kcG9pbnQoKTogVVJMIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5lbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI25hbWVzcGFjZSlcbiAgICovXG4gIGdldCBuYW1lc3BhY2UoKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy5uYW1lc3BhY2U7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNkYXRhYmFzZSlcbiAgICovXG4gIGdldCBkYXRhYmFzZSgpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbmc/LmRhdGFiYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jdG9rZW4pXG4gICAqL1xuICBnZXQgdG9rZW4oKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW5nPy50b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI2dldGNvbm5lY3Rpb25pbmZvKVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbkluZm8oKTogQ29ubmVjdGlvbkluZm8gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVuZz8uZ2V0Q29ubmVjdGlvbkluZm8oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI29uKVxuICAgKi9cbiAgb248VEV2ZW50IGV4dGVuZHMga2V5b2YgRW5naW5lRXZlbnRNYXA+KFxuICAgIGV2ZW50OiBURXZlbnQsXG4gICAgbGlzdGVuZXI6IFRhc2tMaXN0ZW5lcjxFbmdpbmVFdmVudE1hcFtURXZlbnRdPixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5lZS5vbihldmVudCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jb2ZmKVxuICAgKi9cbiAgb2ZmPFRFdmVudCBleHRlbmRzIGtleW9mIEVuZ2luZUV2ZW50TWFwPihcbiAgICBldmVudDogVEV2ZW50LFxuICAgIGxpc3RlbmVyOiBUYXNrTGlzdGVuZXI8RW5naW5lRXZlbnRNYXBbVEV2ZW50XT4sXG4gICk6IHZvaWQge1xuICAgIC8vIFx1OEFBNFx1MzA2M1x1MzA2Nlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2RVx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBFQVx1MzBCOVx1MzBDQVx1MzBGQ1x1MzA5Mlx1ODlFM1x1OTY2NFx1MzA1N1x1MzA2Nlx1MzA1N1x1MzA3RVx1MzA4Rlx1MzA2QVx1MzA0NFx1MzA4OFx1MzA0Nlx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVxuICAgIC8vIGxpc3RlbmVyIFx1MzA0Q1x1NzEyMVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Rlx1MzBBOFx1MzBFOVx1MzBGQ1x1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA4Qlx1MzAwMlxuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFN1cnJlYWxUeXBlRXJyb3IoXCJGdW5jdGlvblwiLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5lZS5vZmYoZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI29uY2UpXG4gICAqL1xuICBvbmNlPFRFdmVudCBleHRlbmRzIGtleW9mIEVuZ2luZUV2ZW50TWFwPihcbiAgICBldmVudDogVEV2ZW50LFxuICAgIG9wdGlvbnM/OiBUYXNrTGlzdGVuZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBTdGF0ZWZ1bFByb21pc2U8RW5naW5lRXZlbnRNYXBbVEV2ZW50XT4ge1xuICAgIHJldHVybiB0aGlzLmVlLm9uY2UoZXZlbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jY29ubmVjdClcbiAgICovXG4gIEBtdXRleFxuICBjb25uZWN0KFxuICAgIGVuZHBvaW50OiBzdHJpbmcgfCBVUkwsXG4gICAgb3B0aW9uczogQ2xpZW50Q29ubmVjdE9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldENvbm5lY3Rpb25JbmZvKCk7XG4gICAgICBlbmRwb2ludCA9IHByb2Nlc3NFbmRwb2ludChlbmRwb2ludCwgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChjb25uPy5zdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgICAgaWYgKGNvbm4uZW5kcG9pbnQuaHJlZiA9PT0gZW5kcG9pbnQuaHJlZikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uQ29uZmxpY3RFcnJvcihjb25uLmVuZHBvaW50LCBlbmRwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVuZykge1xuICAgICAgICB1bnJlYWNoYWJsZShjb25uIGFzIG5ldmVyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NoZW1lID0gZW5kcG9pbnQucHJvdG9jb2wuc2xpY2UoMCwgLTEgLyogcmVtb3ZlIGA6YCAqLyk7XG4gICAgICBjb25zdCB7IHNpZ25hbCA9IGdldFRpbWVvdXRTaWduYWwoMTVfMDAwKSB9ID0gb3B0aW9ucztcblxuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5lbmcgPSBhd2FpdCB0aGlzLmNyZWF0ZUVuZ2luZShzY2hlbWUpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5nLmNvbm5lY3QoeyBlbmRwb2ludCwgc2lnbmFsIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5lbmcgPSBudWxsO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI2Nsb3NlKVxuICAgKi9cbiAgQG11dGV4XG4gIGNsb3NlKG9wdGlvbnM6IENsaWVudENsb3NlT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmVuZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZyA9IHRoaXMuZW5nO1xuICAgIHRoaXMuZW5nID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICB0aGlzLmVlLmFib3J0KG5ldyBDbG9zZWQoXCJmb3JjZSBjbG9zZVwiKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuZy5jbG9zZSh7XG4gICAgICAgICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIHx8IGdldFRpbWVvdXRTaWduYWwoMTVfMDAwKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmVlLmlkbGUoKTsgLy8gXHUzMEE4XHUzMEU5XHUzMEZDXHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDZBXHUzMDQ0XHUzMDAyXG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJwYzxUTWV0aG9kIGV4dGVuZHMgUnBjTWV0aG9kLCBUUmVzdWx0IGV4dGVuZHMgUnBjUmVzdWx0PFRNZXRob2Q+PihcbiAgICBtZXRob2Q6IFRNZXRob2QsXG4gICAgcGFyYW1zOiBScGNQYXJhbXM8VE1ldGhvZD4sXG4gICAgb3B0aW9uczogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9LFxuICApOiBQcm9taXNlPFRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IHNpZ25hbCA9IGdldFRpbWVvdXRTaWduYWwoNV8wMDApIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHRoaXMuZW5nPy5zdGF0ZSAhPT0gXCJvcGVuXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZWUub25jZShcIm9wZW5cIiwgeyBzaWduYWwgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmVuZykge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25VbmF2YWlsYWJsZUVycm9yKHtcbiAgICAgICAgY2F1c2U6IFwiVGhlIGVuZ2luZSBpcyBub3Qgc2V0LlwiLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJwYyh7XG4gICAgICBlbmdpbmU6IHRoaXMuZW5nLFxuICAgICAgc2lnbmFsLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGFyYW1zLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJwYzxcbiAgVE1ldGhvZCBleHRlbmRzIFJwY01ldGhvZCxcbiAgVFJlc3VsdCBleHRlbmRzIFJwY1Jlc3VsdDxUTWV0aG9kPixcbj4oXG4gIGFyZ3M6IHtcbiAgICByZWFkb25seSBlbmdpbmU6IEVuZ2luZUFiYztcbiAgICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsO1xuICAgIHJlYWRvbmx5IG1ldGhvZDogVE1ldGhvZDtcbiAgICByZWFkb25seSBwYXJhbXM6IFJwY1BhcmFtczxUTWV0aG9kPjtcbiAgfSxcbik6IFByb21pc2U8VFJlc3VsdD4ge1xuICBjb25zdCByZXNwOiBScGNSZXNwb25zZTxhbnk+ID0gYXdhaXQgYXJncy5lbmdpbmUucnBjKHtcbiAgICBzaWduYWw6IGFyZ3Muc2lnbmFsLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IGFyZ3MubWV0aG9kLFxuICAgICAgcGFyYW1zOiBhcmdzLnBhcmFtcyxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoXCJyZXN1bHRcIiBpbiByZXNwKSB7XG4gICAgcmV0dXJuIHJlc3AucmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IFJwY1Jlc3BvbnNlRXJyb3IocmVzcCwge1xuICAgIGNhdXNlOiB7XG4gICAgICBtZXRob2Q6IGFyZ3MubWV0aG9kLFxuICAgICAgLy8gVE9ETyh0YWkta3VuKTogcGFyYW1zIFx1MzA2Qlx1MzA2Rlx1NkE1Rlx1NUZBRVx1NjBDNVx1NTgzMVx1MzA0Q1x1NTQyQlx1MzA3RVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTNFRlx1ODBGRFx1NjAyN1x1MzA0Q1x1MzA0Mlx1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMW1ldGhvZCBcdTMwNkVcdTMwN0ZcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEFcdTMwNEZcdUZGMUZcbiAgICAgIHBhcmFtczogYXJncy5wYXJhbXMsXG4gICAgfSxcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFRTztBQUNQLG9CQVNPO0FBUVAsbUJBT087QUFqQ1A7QUFvTUUsZ0JBQUMscUJBeUNELGNBQUM7QUEvS0gsSUFBcUIsZUFBckIs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