@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
228 lines (226 loc) • 23 kB
JavaScript
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// src/engines/http/engine.ts
import {
EngineAbc,
processQueryRequest
} from "../../engine/index.mjs";
import {
ConnectionUnavailableError,
MissingNamespaceError,
ServerResponseError,
SurrealTypeError,
unreachable
} from "../../errors/index.mjs";
import { cloneSync } from "../../formatter/index.mjs";
import {
isBrowser,
isRpcResponse,
throwIfAborted
} from "../../utils/index.mjs";
var _HttpEngine = class _HttpEngine extends EngineAbc {
constructor(config) {
super(config);
this.name = "http";
this.vars = {};
this.fetch = config.fetch || (isBrowser() ? window.fetch.bind(window) : fetch);
}
async connect({ endpoint, signal }) {
throwIfAborted(signal);
const conn = this.getConnectionInfo();
if (conn.state === "open") {
return;
}
if (conn.state !== "closed") {
unreachable(conn);
}
await this.transition(
{
state: "connecting",
endpoint
},
() => "closed"
);
await this.transition(
{
state: "open",
endpoint
},
() => "closed"
);
}
async close({ signal }) {
throwIfAborted(signal);
const conn = this.getConnectionInfo();
if (conn.state === "closed") {
return;
}
if (conn.state !== "open") {
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 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 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) ?? 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 = processQueryRequest(request);
req.params[1] = Object.assign({}, this.vars, req.params[1]);
request = req;
break;
}
}
if (conn.namespace === null && conn.database !== null) {
throw new MissingNamespaceError(conn.database);
}
const body = this.fmt.encodeSync(request);
if (typeof body !== "string" && !(body instanceof Uint8Array)) {
throw new 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 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 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 (!isRpcResponse(rpcResp) || "id" in rpcResp) {
throw new 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;
export {
HttpEngine as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuZ2luZXMvaHR0cC9lbmdpbmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIHR5cGUgQ2xvc2VBcmdzLFxuICB0eXBlIENvbm5lY3RBcmdzLFxuICBFbmdpbmVBYmMsXG4gIHR5cGUgRW5naW5lQWJjQ29uZmlnLFxuICBwcm9jZXNzUXVlcnlSZXF1ZXN0LFxuICB0eXBlIFJwY0FyZ3MsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZW5naW5lXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uVW5hdmFpbGFibGVFcnJvcixcbiAgTWlzc2luZ05hbWVzcGFjZUVycm9yLFxuICBTZXJ2ZXJSZXNwb25zZUVycm9yLFxuICBTdXJyZWFsVHlwZUVycm9yLFxuICB1bnJlYWNoYWJsZSxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lcnJvcnNcIjtcbmltcG9ydCB7IGNsb25lU3luYyB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZm9ybWF0dGVyXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJpZGlyZWN0aW9uYWxScGNSZXNwb25zZSxcbiAgSWRMZXNzUnBjUmVzcG9uc2UsXG4gIFJwY1BhcmFtcyxcbiAgUnBjUXVlcnlSZXF1ZXN0LFxuICBScGNSZXN1bHQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzQnJvd3NlcixcbiAgaXNScGNSZXNwb25zZSxcbiAgdGhyb3dJZkFib3J0ZWQsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRmV0Y2hlclJlcXVlc3RJbml0IHtcbiAgbWV0aG9kOiBcIlBPU1RcIjtcbiAgaGVhZGVyczoge1xuICAgIFwiQ29udGVudC1UeXBlXCI6IHN0cmluZztcbiAgICBcIlN1cnJlYWwtREJcIj86IHN0cmluZztcbiAgICBcIlN1cnJlYWwtTlNcIj86IHN0cmluZztcbiAgICBBY2NlcHQ6IHN0cmluZztcbiAgICBBdXRob3JpemF0aW9uPzogYEJlYXJlciAke3N0cmluZ31gO1xuICB9O1xuICBib2R5OiBzdHJpbmcgfCBVaW50OEFycmF5O1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgdHlwZSBIdHRwRmV0Y2hlciA9IChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgaW5pdDogSHR0cEZldGNoZXJSZXF1ZXN0SW5pdCxcbikgPT4gUHJvbWlzZUxpa2U8UmVzcG9uc2U+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFbmdpbmVDb25maWcgZXh0ZW5kcyBFbmdpbmVBYmNDb25maWcge1xuICByZWFkb25seSBmZXRjaD86IEh0dHBGZXRjaGVyIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwRW5naW5lIGV4dGVuZHMgRW5naW5lQWJjIHtcbiAgcmVhZG9ubHkgbmFtZSA9IFwiaHR0cFwiO1xuXG4gIHByb3RlY3RlZCB2YXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIHByb3RlY3RlZCBmZXRjaDogSHR0cEZldGNoZXI7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBIdHRwRW5naW5lQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmZldGNoID0gY29uZmlnLmZldGNoXG4gICAgICB8fCAoaXNCcm93c2VyKCkgPyB3aW5kb3cuZmV0Y2guYmluZCh3aW5kb3cpIDogZmV0Y2gpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdCh7IGVuZHBvaW50LCBzaWduYWwgfTogQ29ubmVjdEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldENvbm5lY3Rpb25JbmZvKCk7XG5cbiAgICBpZiAoY29ubi5zdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29ubi5zdGF0ZSAhPT0gXCJjbG9zZWRcIikge1xuICAgICAgdW5yZWFjaGFibGUoY29ubiBhcyBuZXZlcik7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50cmFuc2l0aW9uKFxuICAgICAge1xuICAgICAgICBzdGF0ZTogXCJjb25uZWN0aW5nXCIsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgfSxcbiAgICAgICgpID0+IFwiY2xvc2VkXCIsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zaXRpb24oXG4gICAgICB7XG4gICAgICAgIHN0YXRlOiBcIm9wZW5cIixcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICB9LFxuICAgICAgKCkgPT4gXCJjbG9zZWRcIixcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoeyBzaWduYWwgfTogQ2xvc2VBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhyb3dJZkFib3J0ZWQoc2lnbmFsKTtcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpO1xuXG4gICAgaWYgKGNvbm4uc3RhdGUgPT09IFwiY2xvc2VkXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29ubi5zdGF0ZSAhPT0gXCJvcGVuXCIpIHtcbiAgICAgIHVucmVhY2hhYmxlKGNvbm4gYXMgbmV2ZXIpO1xuICAgIH1cblxuICAgIHRoaXMudmFycyA9IHt9O1xuICAgIGF3YWl0IHRoaXMudHJhbnNpdGlvbihcbiAgICAgIHtcbiAgICAgICAgc3RhdGU6IFwiY2xvc2luZ1wiLFxuICAgICAgICBlbmRwb2ludDogY29ubi5lbmRwb2ludCxcbiAgICAgIH0sXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBzdGF0ZTogXCJjbG9zaW5nXCIsXG4gICAgICAgIGVuZHBvaW50OiBjb25uLmVuZHBvaW50LFxuICAgICAgfSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zaXRpb24oXCJjbG9zZWRcIiwgKCkgPT4gXCJjbG9zZWRcIik7XG4gIH1cblxuICBhc3luYyBycGMoeyByZXF1ZXN0LCBzaWduYWwgfTogUnBjQXJncyk6IFByb21pc2U8SWRMZXNzUnBjUmVzcG9uc2U+IHtcbiAgICAvLyBcdTYzQTVcdTdEOUFcdTYwQzVcdTU4MzFcdTMwNkVcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzhcdTMwOTJcdTUzRDZcdTVGOTdcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcbiAgICAvLyBcdTRFRTVcdTk2NERcdTMwMDFcdTYzQTVcdTdEOUFcdTYwQzVcdTU4MzFcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdTk2OUJcdTMwNkZcdTMwNTNcdTMwOENcdTMwOTJcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpO1xuXG4gICAgaWYgKGNvbm4uc3RhdGUgIT09IFwib3BlblwiKSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvblVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogXCJUaGUgY29ubmVjdGlvbiBpcyBub3QgZXN0YWJsaXNoZWQgdmlhIHRoZSAuY29ubmVjdCgpIG1ldGhvZC5cIixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVxdWVzdC5tZXRob2QpIHtcbiAgICAgIGNhc2UgXCJ1c2VcIjoge1xuICAgICAgICBsZXQgeyBuYW1lc3BhY2UsIGRhdGFiYXNlIH0gPSBjb25uO1xuICAgICAgICBjb25zdCBbbnMsIGRiXSA9IHJlcXVlc3QucGFyYW1zO1xuXG4gICAgICAgIGlmIChucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRhdGFiYXNlID0gZGI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZXNwYWNlID09PSBudWxsICYmIGRhdGFiYXNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdOYW1lc3BhY2VFcnJvcihkYXRhYmFzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJsZXRcIjoge1xuICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gcmVxdWVzdC5wYXJhbXM7XG4gICAgICAgIHRoaXMudmFyc1tuYW1lXSA9IHRoaXMuZm10LnRvRW5jb2RlZD8uKHZhbHVlKVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBcdTMwQThcdTMwRjNcdTMwQjhcdTMwRjNcdTMwNjhcdTMwNkVcdTYzMTlcdTUyRDVcdTMwOTJcdTU0MDhcdTMwOEZcdTMwNUJcdTMwOEJcdTMwNUZcdTMwODFcdTMwNkJcdTMwRDFcdTMwRTlcdTMwRTFcdTMwRkNcdTMwQkZcdTMwRkNcdTMwOTJcdTRFMERcdTU5MDlcdTMwNkJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICAgICAgICA/PyBjbG9uZVN5bmModGhpcy5mbXQsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwidW5zZXRcIjoge1xuICAgICAgICBjb25zdCBbbmFtZV0gPSByZXF1ZXN0LnBhcmFtcztcbiAgICAgICAgZGVsZXRlIHRoaXMudmFyc1tuYW1lXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicXVlcnlcIjoge1xuICAgICAgICBjb25zdCByZXEgPSBwcm9jZXNzUXVlcnlSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICByZXEucGFyYW1zWzFdID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YXJzLCByZXEucGFyYW1zWzFdKTtcbiAgICAgICAgcmVxdWVzdCA9IHJlcSBhcyBScGNRdWVyeVJlcXVlc3Q7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25uLm5hbWVzcGFjZSA9PT0gbnVsbCAmJiBjb25uLmRhdGFiYXNlICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ05hbWVzcGFjZUVycm9yKGNvbm4uZGF0YWJhc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IHVua25vd24gPSB0aGlzLmZtdC5lbmNvZGVTeW5jKHJlcXVlc3QpO1xuXG4gICAgaWYgKHR5cGVvZiBib2R5ICE9PSBcInN0cmluZ1wiICYmICEoYm9keSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICB0aHJvdyBuZXcgU3VycmVhbFR5cGVFcnJvcihbXCJTdHJpbmdcIiwgXCJVaW50OEFycmF5XCJdLCBib2R5KTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBIdHRwRmV0Y2hlclJlcXVlc3RJbml0W1wiaGVhZGVyc1wiXSA9IHtcbiAgICAgIEFjY2VwdDogdGhpcy5mbXQuY29udGVudFR5cGUsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiB0aGlzLmZtdC5jb250ZW50VHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKGNvbm4ubmFtZXNwYWNlICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnNbXCJTdXJyZWFsLU5TXCJdID0gY29ubi5uYW1lc3BhY2U7XG4gICAgfVxuXG4gICAgaWYgKGNvbm4uZGF0YWJhc2UgIT0gbnVsbCkge1xuICAgICAgaGVhZGVyc1tcIlN1cnJlYWwtREJcIl0gPSBjb25uLmRhdGFiYXNlO1xuICAgIH1cblxuICAgIGlmIChjb25uLnRva2VuKSB7XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHtjb25uLnRva2VufWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcDogdW5rbm93biA9IGF3YWl0IHRoaXMuZmV0Y2goY29ubi5lbmRwb2ludC5ocmVmLCB7XG4gICAgICBib2R5LFxuICAgICAgc2lnbmFsLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgY2F1c2UgPSB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgLy8gVE9ETyh0YWkta3VuKTogcGFyYW1zIFx1MzA2Qlx1MzA2Rlx1NkE1Rlx1NUZBRVx1NjBDNVx1NTgzMVx1MzA0Q1x1NTQyQlx1MzA3RVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTNFRlx1ODBGRFx1NjAyN1x1MzA0Q1x1MzA0Mlx1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMW1ldGhvZCBcdTMwNkVcdTMwN0ZcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEFcdTMwNEZcdUZGMUZcbiAgICAgIHBhcmFtczogcmVxdWVzdC5wYXJhbXMsXG4gICAgICBlbmRwb2ludDogY29ubi5lbmRwb2ludC5ocmVmLFxuICAgICAgZGF0YWJhc2U6IGNvbm4uZGF0YWJhc2UsXG4gICAgICBuYW1lc3BhY2U6IGNvbm4ubmFtZXNwYWNlLFxuICAgIH07XG5cbiAgICBpZiAoIShyZXNwIGluc3RhbmNlb2YgUmVzcG9uc2UpIHx8IHJlc3AuYm9keSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFNlcnZlclJlc3BvbnNlRXJyb3IoXG4gICAgICAgIFwiRXhwZWN0ZWQgYFJlc3BvbnNlYCBjb250YWlucyBhIG5vbi1udWxsIGJvZHkuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogT2JqZWN0LmFzc2lnbihjYXVzZSwge1xuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3AsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZXNwLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcmVzcC50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgU2VydmVyUmVzcG9uc2VFcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGNhdXNlOiBPYmplY3QuYXNzaWduKGNhdXNlLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwLnN0YXR1cyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB0aHJvd0lmQWJvcnRlZChzaWduYWwpO1xuICAgIGxldCBycGNSZXNwOiB1bmtub3duO1xuXG4gICAgaWYgKHRoaXMuZm10LmRlY29kZVN0cmVhbSAmJiB0aGlzLmZtdC5kZWNvZGluZ1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBOdW1iZXIocmVzcC5oZWFkZXJzLmdldChcImNvbnRlbnQtbGVuZ3RoXCIpKTtcblxuICAgICAgaWYgKFxuICAgICAgICBsZW5ndGggPT09IGxlbmd0aFxuICAgICAgICAmJiBsZW5ndGggPiAwXG4gICAgICAgICYmIHRoaXMuZm10LmRlY29kaW5nU3RyYXRlZ3koeyBuYW1lOiBcImZldGNoXCIsIGxlbmd0aCB9KSA9PT0gXCJzdHJlYW1cIlxuICAgICAgKSB7XG4gICAgICAgIHJwY1Jlc3AgPSBhd2FpdCB0aGlzLmZtdC5kZWNvZGVTdHJlYW0ocmVzcC5ib2R5LCBzaWduYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcnBjUmVzcCA9IHRoaXMuZm10LmRlY29kZVN5bmMoYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcnBjUmVzcCA9IHRoaXMuZm10LmRlY29kZVN5bmMoYXdhaXQgcmVzcC5hcnJheUJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUnBjUmVzcG9uc2UocnBjUmVzcCkgfHwgXCJpZFwiIGluIHJwY1Jlc3ApIHtcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJSZXNwb25zZUVycm9yKFwiRXhwZWN0ZWQgaWQtbGVzcyBycGMgcmVzcG9uc2UuXCIsIHtcbiAgICAgICAgY2F1c2U6IE9iamVjdC5hc3NpZ24oY2F1c2UsIHtcbiAgICAgICAgICByZXNwb25zZTogcnBjUmVzcCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXN1bHRcIiBpbiBycGNSZXNwKSB7XG4gICAgICBjb25zdCBycGMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIHBhcmFtczogcmVxdWVzdC5wYXJhbXMsXG4gICAgICAgIHJlc3VsdDogcnBjUmVzcC5yZXN1bHQsXG4gICAgICB9IGFzIHtcbiAgICAgICAgW00gaW4gKHR5cGVvZiByZXF1ZXN0KVtcIm1ldGhvZFwiXV06IHtcbiAgICAgICAgICBtZXRob2Q6IE07XG4gICAgICAgICAgcGFyYW1zOiBScGNQYXJhbXM8TT47XG4gICAgICAgICAgcmVzdWx0OiBScGNSZXN1bHQ8TT47XG4gICAgICAgIH07XG4gICAgICB9Wyh0eXBlb2YgcmVxdWVzdClbXCJtZXRob2RcIl1dO1xuXG4gICAgICBzd2l0Y2ggKHJwYy5tZXRob2QpIHtcbiAgICAgICAgY2FzZSBcInNpZ25pblwiOlxuICAgICAgICBjYXNlIFwic2lnbnVwXCI6XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHJwYy5yZXN1bHQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImF1dGhlbnRpY2F0ZVwiOlxuICAgICAgICAgIFt0aGlzLnRva2VuXSA9IHJwYy5wYXJhbXM7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcImludmFsaWRhdGVcIjpcbiAgICAgICAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTUzQ0NcdTY1QjlcdTU0MTFcdTkwMUFcdTRGRTFcdTMwNkVcdTMwRUNcdTMwQjlcdTMwRERcdTMwRjNcdTMwQjlcdTMwNkJcdTY0RUNcdTYxNEJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICBjb25zdCBpZDogQmlkaXJlY3Rpb25hbFJwY1Jlc3BvbnNlW1wiaWRcIl0gPSBgJHtyZXF1ZXN0Lm1ldGhvZH1fMGA7XG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmVlLmVtaXQoYHJwY18ke2lkfWAsIHtcbiAgICAgIGlkLFxuICAgICAgLi4ucnBjUmVzcCxcbiAgICB9KTtcblxuICAgIGlmIChob29rcykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoaG9va3MpO1xuICAgIH1cblxuICAgIHJldHVybiBycGNSZXNwO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBQUE7QUFBQSxFQUdFO0FBQUEsRUFFQTtBQUFBLE9BRUs7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUJBQWlCO0FBUTFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXdCUCxJQUFxQixjQUFyQixNQUFxQixvQkFBbUIsVUFBVTtBQUFBLEVBT2hELFlBQVksUUFBMEI7QUFDcEMsVUFBTSxNQUFNO0FBUGQsU0FBUyxPQUFPO0FBRWhCLFNBQVUsT0FBZ0MsQ0FBQztBQU16QyxTQUFLLFFBQVEsT0FBTyxVQUNkLFVBQVUsSUFBSSxPQUFPLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFBQSxFQUNsRDtBQUFBLEVBRUEsTUFBTSxRQUFRLEVBQUUsVUFBVSxPQUFPLEdBQStCO0FBQzlELG1CQUFlLE1BQU07QUFDckIsVUFBTSxPQUFPLEtBQUssa0JBQWtCO0FBRXBDLFFBQUksS0FBSyxVQUFVLFFBQVE7QUFDekI7QUFBQSxJQUNGO0FBRUEsUUFBSSxLQUFLLFVBQVUsVUFBVTtBQUMzQixrQkFBWSxJQUFhO0FBQUEsSUFDM0I7QUFFQSxVQUFNLEtBQUs7QUFBQSxNQUNUO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUDtBQUFBLE1BQ0Y7QUFB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