UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

234 lines (232 loc) 23.8 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; 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); // src/engines/http/engine.ts var engine_exports = {}; __export(engine_exports, { default: () => HttpEngine }); module.exports = __toCommonJS(engine_exports); var import_engine = require("../../engine/index.cjs"); var import_errors = require("../../errors/index.cjs"); var import_formatter = require("../../formatter/index.cjs"); var import_utils = require("../../utils/index.cjs"); var _HttpEngine = class _HttpEngine extends import_engine.EngineAbc { constructor(config) { super(config); this.name = "http"; this.vars = {}; this.fetch = config.fetch || ((0, import_utils.isBrowser)() ? window.fetch.bind(window) : fetch); } async connect({ endpoint, signal }) { (0, import_utils.throwIfAborted)(signal); const conn = this.getConnectionInfo(); if (conn.state === "open") { return; } if (conn.state !== "closed") { (0, import_errors.unreachable)(conn); } await this.transition( { state: "connecting", endpoint }, () => "closed" ); await this.transition( { state: "open", endpoint }, () => "closed" ); } async close({ signal }) { (0, import_utils.throwIfAborted)(signal); const conn = this.getConnectionInfo(); if (conn.state === "closed") { return; } if (conn.state !== "open") { (0, import_errors.unreachable)(conn); } this.vars = {}; await this.transition( { state: "closing", endpoint: conn.endpoint }, () => ({ state: "closing", endpoint: conn.endpoint }) ); await this.transition("closed", () => "closed"); } async rpc({ request, signal }) { const conn = this.getConnectionInfo(); if (conn.state !== "open") { throw new import_errors.ConnectionUnavailableError({ cause: "The connection is not established via the .connect() method." }); } switch (request.method) { case "use": { let { namespace, database } = conn; const [ns, db] = request.params; if (ns !== void 0) { namespace = ns; } if (db !== void 0) { database = db; } if (namespace === null && database !== null) { throw new import_errors.MissingNamespaceError(database); } this.namespace = namespace; this.database = database; return { result: void 0 }; } case "let": { const [name, value] = request.params; this.vars[name] = this.fmt.toEncoded?.(value) ?? (0, import_formatter.cloneSync)(this.fmt, value); return { result: void 0 }; } case "unset": { const [name] = request.params; delete this.vars[name]; return { result: void 0 }; } case "query": { const req = (0, import_engine.processQueryRequest)(request); req.params[1] = Object.assign({}, this.vars, req.params[1]); request = req; break; } } if (conn.namespace === null && conn.database !== null) { throw new import_errors.MissingNamespaceError(conn.database); } const body = this.fmt.encodeSync(request); if (typeof body !== "string" && !(body instanceof Uint8Array)) { throw new import_errors.SurrealTypeError(["String", "Uint8Array"], body); } const headers = { Accept: this.fmt.contentType, "Content-Type": this.fmt.contentType }; if (conn.namespace != null) { headers["Surreal-NS"] = conn.namespace; } if (conn.database != null) { headers["Surreal-DB"] = conn.database; } if (conn.token) { headers["Authorization"] = `Bearer ${conn.token}`; } const resp = await this.fetch(conn.endpoint.href, { body, signal, method: "POST", headers }); const cause = { method: request.method, // TODO(tai-kun): params には機微情報が含まれている可能性があるので、method のみにしておく? params: request.params, endpoint: conn.endpoint.href, database: conn.database, namespace: conn.namespace }; if (!(resp instanceof Response) || resp.body === null) { throw new import_errors.ServerResponseError( "Expected `Response` contains a non-null body.", { cause: Object.assign(cause, { response: resp }) } ); } if (resp.status !== 200) { const message = await resp.text(); throw new import_errors.ServerResponseError(message, { cause: Object.assign(cause, { status: resp.status }) }); } let rpcResp; if (this.fmt.decodeStream && this.fmt.decodingStrategy) { const length = Number(resp.headers.get("content-length")); if (length === length && length > 0 && this.fmt.decodingStrategy({ name: "fetch", length }) === "stream") { rpcResp = await this.fmt.decodeStream(resp.body, signal); } else { rpcResp = this.fmt.decodeSync(await resp.arrayBuffer()); } } else { rpcResp = this.fmt.decodeSync(await resp.arrayBuffer()); } if (!(0, import_utils.isRpcResponse)(rpcResp) || "id" in rpcResp) { throw new import_errors.ServerResponseError("Expected id-less rpc response.", { cause: Object.assign(cause, { response: rpcResp }) }); } if ("result" in rpcResp) { const rpc = { method: request.method, params: request.params, result: rpcResp.result }; switch (rpc.method) { case "signin": case "signup": this.token = rpc.result; break; case "authenticate": [this.token] = rpc.params; break; case "invalidate": this.token = null; break; } } const id = `${request.method}_0`; const hooks = this.ee.emit(`rpc_${id}`, { id, ...rpcResp }); if (hooks) { await Promise.all(hooks); } return rpcResp; } }; __name(_HttpEngine, "HttpEngine"); var HttpEngine = _HttpEngine; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuZ2luZXMvaHR0cC9lbmdpbmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIHR5cGUgQ2xvc2VBcmdzLFxuICB0eXBlIENvbm5lY3RBcmdzLFxuICBFbmdpbmVBYmMsXG4gIHR5cGUgRW5naW5lQWJjQ29uZmlnLFxuICBwcm9jZXNzUXVlcnlSZXF1ZXN0LFxuICB0eXBlIFJwY0FyZ3MsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5naW5lXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uVW5hdmFpbGFibGVFcnJvcixcbiAgTWlzc2luZ05hbWVzcGFjZUVycm9yLFxuICBTZXJ2ZXJSZXNwb25zZUVycm9yLFxuICBTdXJyZWFsVHlwZUVycm9yLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB7IGNsb25lU3luYyB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJpZGlyZWN0aW9uYWxScGNSZXNwb25zZSxcbiAgSWRMZXNzUnBjUmVzcG9uc2UsXG4gIFJwY1BhcmFtcyxcbiAgUnBjUXVlcnlSZXF1ZXN0LFxuICBScGNSZXN1bHQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQnJvd3NlcixcbiAgaXNScGNSZXNwb25zZSxcbiAgdGhyb3dJZkFib3J0ZWQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRmV0Y2hlclJlcXVlc3RJbml0IHtcbiAgbWV0aG9kOiBcIlBPU1RcIjtcbiAgaGVhZGVyczoge1xuICAgIFwiQ29udGVudC1UeXBlXCI6IHN0cmluZztcbiAgICBcIlN1cnJlYWwtREJcIj86IHN0cmluZztcbiAgICBcIlN1cnJlYWwtTlNcIj86IHN0cmluZztcbiAgICBBY2NlcHQ6IHN0cmluZztcbiAgICBBdXRob3JpemF0aW9uPzogYEJlYXJlciAke3N0cmluZ31gO1xuICB9O1xuICBib2R5OiBzdHJpbmcgfCBVaW50OEFycmF5O1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgdHlwZSBIdHRwRmV0Y2hlciA9IChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgaW5pdDogSHR0cEZldGNoZXJSZXF1ZXN0SW5pdCxcbikgPT4gUHJvbWlzZUxpa2U8UmVzcG9uc2U+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFbmdpbmVDb25maWcgZXh0ZW5kcyBFbmdpbmVBYmNDb25maWcge1xuICByZWFkb25seSBmZXRjaD86IEh0dHBGZXRjaGVyIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwRW5naW5lIGV4dGVuZHMgRW5naW5lQWJjIHtcbiAgcmVhZG9ubHkgbmFtZSA9IFwiaHR0cFwiO1xuXG4gIHByb3RlY3RlZCB2YXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBmZXRjaDogSHR0cEZldGNoZXI7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBIdHRwRW5naW5lQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmZldGNoID0gY29uZmlnLmZldGNoXG4gICAgICB8fCAoaXNCcm93c2VyKCkgPyB3aW5kb3cuZmV0Y2guYmluZCh3aW5kb3cpIDogZmV0Y2gpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdCh7IGVuZHBvaW50LCBzaWduYWwgfTogQ29ubmVjdEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldENvbm5lY3Rpb25JbmZvKCk7XG5cbiAgICBpZiAoY29ubi5zdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29ubi5zdGF0ZSAhPT0gXCJjbG9zZWRcIikge1xuICAgICAgdW5yZWFjaGFibGUoY29ubiBhcyBuZXZlcik7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50cmFuc2l0aW9uKFxuICAgICAge1xuICAgICAgICBzdGF0ZTogXCJjb25uZWN0aW5nXCIsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgfSxcbiAgICAgICgpID0+IFwiY2xvc2VkXCIsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zaXRpb24oXG4gICAgICB7XG4gICAgICAgIHN0YXRlOiBcIm9wZW5cIixcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICB9LFxuICAgICAgKCkgPT4gXCJjbG9zZWRcIixcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoeyBzaWduYWwgfTogQ2xvc2VBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhyb3dJZkFib3J0ZWQoc2lnbmFsKTtcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpO1xuXG4gICAgaWYgKGNvbm4uc3RhdGUgPT09IFwiY2xvc2VkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29ubi5zdGF0ZSAhPT0gXCJvcGVuXCIpIHtcbiAgICAgIHVucmVhY2hhYmxlKGNvbm4gYXMgbmV2ZXIpO1xuICAgIH1cblxuICAgIHRoaXMudmFycyA9IHt9O1xuICAgIGF3YWl0IHRoaXMudHJhbnNpdGlvbihcbiAgICAgIHtcbiAgICAgICAgc3RhdGU6IFwiY2xvc2luZ1wiLFxuICAgICAgICBlbmRwb2ludDogY29ubi5lbmRwb2ludCxcbiAgICAgIH0sXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBzdGF0ZTogXCJjbG9zaW5nXCIsXG4gICAgICAgIGVuZHBvaW50OiBjb25uLmVuZHBvaW50LFxuICAgICAgfSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zaXRpb24oXCJjbG9zZWRcIiwgKCkgPT4gXCJjbG9zZWRcIik7XG4gIH1cblxuICBhc3luYyBycGMoeyByZXF1ZXN0LCBzaWduYWwgfTogUnBjQXJncyk6IFByb21pc2U8SWRMZXNzUnBjUmVzcG9uc2U+IHtcbiAgICAvLyBcdTYzQTVcdTdEOUFcdTYwQzVcdTU4MzFcdTMwNkVcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzhcdTMwOTJcdTUzRDZcdTVGOTdcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcbiAgICAvLyBcdTRFRTVcdTk2NERcdTMwMDFcdTYzQTVcdTdEOUFcdTYwQzVcdTU4MzFcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdTk2OUJcdTMwNkZcdTMwNTNcdTMwOENcdTMwOTJcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpO1xuXG4gICAgaWYgKGNvbm4uc3RhdGUgIT09IFwib3BlblwiKSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvblVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogXCJUaGUgY29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQgdmlhIHRoZSAuY29ubmVjdCgpIG1ldGhvZC5cIixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVxdWVzdC5tZXRob2QpIHtcbiAgICAgIGNhc2UgXCJ1c2VcIjoge1xuICAgICAgICBsZXQgeyBuYW1lc3BhY2UsIGRhdGFiYXNlIH0gPSBjb25uO1xuICAgICAgICBjb25zdCBbbnMsIGRiXSA9IHJlcXVlc3QucGFyYW1zO1xuXG4gICAgICAgIGlmIChucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRhdGFiYXNlID0gZGI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZXNwYWNlID09PSBudWxsICYmIGRhdGFiYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdOYW1lc3BhY2VFcnJvcihkYXRhYmFzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJsZXRcIjoge1xuICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gcmVxdWVzdC5wYXJhbXM7XG4gICAgICAgIHRoaXMudmFyc1tuYW1lXSA9IHRoaXMuZm10LnRvRW5jb2RlZD8uKHZhbHVlKVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBcdTMwQThcdTMwRjNcdTMwQjhcdTMwRjNcdTMwNjhcdTMwNkVcdTYzMTlcdTUyRDVcdTMwOTJcdTU0MDhcdTMwOEZcdTMwNUJcdTMwOEJcdTMwNUZcdTMwODFcdTMwNkJcdTMwRDFcdTMwRTlcdTMwRTFcdTMwRkNcdTMwQkZcdTMwRkNcdTMwOTJcdTRFMERcdTU5MDlcdTMwNkJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICAgICAgICA/PyBjbG9uZVN5bmModGhpcy5mbXQsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwidW5zZXRcIjoge1xuICAgICAgICBjb25zdCBbbmFtZV0gPSByZXF1ZXN0LnBhcmFtcztcbiAgICAgICAgZGVsZXRlIHRoaXMudmFyc1tuYW1lXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicXVlcnlcIjoge1xuICAgICAgICBjb25zdCByZXEgPSBwcm9jZXNzUXVlcnlSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICByZXEucGFyYW1zWzFdID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YXJzLCByZXEucGFyYW1zWzFdKTtcbiAgICAgICAgcmVxdWVzdCA9IHJlcSBhcyBScGNRdWVyeVJlcXVlc3Q7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25uLm5hbWVzcGFjZSA9PT0gbnVsbCAmJiBjb25uLmRhdGFiYXNlICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ05hbWVzcGFjZUVycm9yKGNvbm4uZGF0YWJhc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IHVua25vd24gPSB0aGlzLmZtdC5lbmNvZGVTeW5jKHJlcXVlc3QpO1xuXG4gICAgaWYgKHR5cGVvZiBib2R5ICE9PSBcInN0cmluZ1wiICYmICEoYm9keSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICB0aHJvdyBuZXcgU3VycmVhbFR5cGVFcnJvcihbXCJTdHJpbmdcIiwgXCJVaW50OEFycmF5XCJdLCBib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBIdHRwRmV0Y2hlclJlcXVlc3RJbml0W1wiaGVhZGVyc1wiXSA9IHtcbiAgICAgIEFjY2VwdDogdGhpcy5mbXQuY29udGVudFR5cGUsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiB0aGlzLmZtdC5jb250ZW50VHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKGNvbm4ubmFtZXNwYWNlICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnNbXCJTdXJyZWFsLU5TXCJdID0gY29ubi5uYW1lc3BhY2U7XG4gICAgfVxuXG4gICAgaWYgKGNvbm4uZGF0YWJhc2UgIT0gbnVsbCkge1xuICAgICAgaGVhZGVyc1tcIlN1cnJlYWwtREJcIl0gPSBjb25uLmRhdGFiYXNlO1xuICAgIH1cblxuICAgIGlmIChjb25uLnRva2VuKSB7XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHtjb25uLnRva2VufWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcDogdW5rbm93biA9IGF3YWl0IHRoaXMuZmV0Y2goY29ubi5lbmRwb2ludC5ocmVmLCB7XG4gICAgICBib2R5LFxuICAgICAgc2lnbmFsLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgY2F1c2UgPSB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgLy8gVE9ETyh0YWkta3VuKTogcGFyYW1zIFx1MzA2Qlx1MzA2Rlx1NkE1Rlx1NUZBRVx1NjBDNVx1NTgzMVx1MzA0Q1x1NTQyQlx1MzA3RVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTNFRlx1ODBGRFx1NjAyN1x1MzA0Q1x1MzA0Mlx1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMW1ldGhvZCBcdTMwNkVcdTMwN0ZcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEFcdTMwNEZcdUZGMUZcbiAgICAgIHBhcmFtczogcmVxdWVzdC5wYXJhbXMsXG4gICAgICBlbmRwb2ludDogY29ubi5lbmRwb2ludC5ocmVmLFxuICAgICAgZGF0YWJhc2U6IGNvbm4uZGF0YWJhc2UsXG4gICAgICBuYW1lc3BhY2U6IGNvbm4ubmFtZXNwYWNlLFxuICAgIH07XG5cbiAgICBpZiAoIShyZXNwIGluc3RhbmNlb2YgUmVzcG9uc2UpIHx8IHJlc3AuYm9keSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFNlcnZlclJlc3BvbnNlRXJyb3IoXG4gICAgICAgIFwiRXhwZWN0ZWQgYFJlc3BvbnNlYCBjb250YWlucyBhIG5vbi1udWxsIGJvZHkuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogT2JqZWN0LmFzc2lnbihjYXVzZSwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZXNwLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVzcC50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgU2VydmVyUmVzcG9uc2VFcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGNhdXNlOiBPYmplY3QuYXNzaWduKGNhdXNlLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwLnN0YXR1cyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuICAgIGxldCBycGNSZXNwOiB1bmtub3duO1xuXG4gICAgaWYgKHRoaXMuZm10LmRlY29kZVN0cmVhbSAmJiB0aGlzLmZtdC5kZWNvZGluZ1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBOdW1iZXIocmVzcC5oZWFkZXJzLmdldChcImNvbnRlbnQtbGVuZ3RoXCIpKTtcblxuICAgICAgaWYgKFxuICAgICAgICBsZW5ndGggPT09IGxlbmd0aFxuICAgICAgICAmJiBsZW5ndGggPiAwXG4gICAgICAgICYmIHRoaXMuZm10LmRlY29kaW5nU3RyYXRlZ3koeyBuYW1lOiBcImZldGNoXCIsIGxlbmd0aCB9KSA9PT0gXCJzdHJlYW1cIlxuICAgICAgKSB7XG4gICAgICAgIHJwY1Jlc3AgPSBhd2FpdCB0aGlzLmZtdC5kZWNvZGVTdHJlYW0ocmVzcC5ib2R5LCBzaWduYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnBjUmVzcCA9IHRoaXMuZm10LmRlY29kZVN5bmMoYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcnBjUmVzcCA9IHRoaXMuZm10LmRlY29kZVN5bmMoYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUnBjUmVzcG9uc2UocnBjUmVzcCkgfHwgXCJpZFwiIGluIHJwY1Jlc3ApIHtcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJSZXNwb25zZUVycm9yKFwiRXhwZWN0ZWQgaWQtbGVzcyBycGMgcmVzcG9uc2UuXCIsIHtcbiAgICAgICAgY2F1c2U6IE9iamVjdC5hc3NpZ24oY2F1c2UsIHtcbiAgICAgICAgICByZXNwb25zZTogcnBjUmVzcCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXN1bHRcIiBpbiBycGNSZXNwKSB7XG4gICAgICBjb25zdCBycGMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIHBhcmFtczogcmVxdWVzdC5wYXJhbXMsXG4gICAgICAgIHJlc3VsdDogcnBjUmVzcC5yZXN1bHQsXG4gICAgICB9IGFzIHtcbiAgICAgICAgW00gaW4gKHR5cGVvZiByZXF1ZXN0KVtcIm1ldGhvZFwiXV06IHtcbiAgICAgICAgICBtZXRob2Q6IE07XG4gICAgICAgICAgcGFyYW1zOiBScGNQYXJhbXM8TT47XG4gICAgICAgICAgcmVzdWx0OiBScGNSZXN1bHQ8TT47XG4gICAgICAgIH07XG4gICAgICB9Wyh0eXBlb2YgcmVxdWVzdClbXCJtZXRob2RcIl1dO1xuXG4gICAgICBzd2l0Y2ggKHJwYy5tZXRob2QpIHtcbiAgICAgICAgY2FzZSBcInNpZ25pblwiOlxuICAgICAgICBjYXNlIFwic2lnbnVwXCI6XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHJwYy5yZXN1bHQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImF1dGhlbnRpY2F0ZVwiOlxuICAgICAgICAgIFt0aGlzLnRva2VuXSA9IHJwYy5wYXJhbXM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImludmFsaWRhdGVcIjpcbiAgICAgICAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTUzQ0NcdTY1QjlcdTU0MTFcdTkwMUFcdTRGRTFcdTMwNkVcdTMwRUNcdTMwQjlcdTMwRERcdTMwRjNcdTMwQjlcdTMwNkJcdTY0RUNcdTYxNEJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICBjb25zdCBpZDogQmlkaXJlY3Rpb25hbFJwY1Jlc3BvbnNlW1wiaWRcIl0gPSBgJHtyZXF1ZXN0Lm1ldGhvZH1fMGA7XG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmVlLmVtaXQoYHJwY18ke2lkfWAsIHtcbiAgICAgIGlkLFxuICAgICAgLi4ucnBjUmVzcCxcbiAgICB9KTtcblxuICAgIGlmIChob29rcykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaG9va3MpO1xuICAgIH1cblxuICAgIHJldHVybiBycGNSZXNwO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBT087QUFDUCxvQkFNTztBQUNQLHVCQUEwQjtBQVExQixtQkFJTztBQXdCUCxJQUFxQixjQUFyQixNQUFxQixvQkFBbUIsd0JBQVU7QUFBQSxFQU9oRCxZQUFZLFFBQTBCO0FBQ3BDLFVBQU0sTUFBTTtBQVBkLFNBQVMsT0FBTztBQUVoQixTQUFVLE9BQWdDLENBQUM7QUFNekMsU0FBSyxRQUFRLE9BQU8sY0FDZCx3QkFBVSxJQUFJLE9BQU8sTUFBTSxLQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ2xEO0FBQUEsRUFFQSxNQUFNLFFBQVEsRUFBRSxVQUFVLE9BQU8sR0FBK0I7QUFDOUQscUNBQWUsTUFBTTtBQUNyQixVQUFNLE9BQU8sS0FBSyxrQkFBa0I7QUFFcEMsUUFBSSxLQUFLLFVBQVUsUUFBUTtBQUN6QjtBQUFBLElBQ0Y7QUFFQSxRQUFJLEtBQUssVUFBVSxVQUFVO0FBQzNCLHFDQUFZLElBQWE7QUFBQSxJQUMzQjtBQUVBLFVBQU0sS0FBSztBQUFBLE1BQ1Q7QUFBQSxRQUNFLE9BQU87QUFBQSxRQUNQO0FBQUEsTUFDRjtBQUFBLE1BQ0EsTUFBTTtBQUFBLElBQ1I7QUFDQSxVQUFNLEtBQUs7QUFBQSxNQUNUO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUDtB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