UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

228 lines (226 loc) 23 kB
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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