@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
279 lines (277 loc) • 27.4 kB
JavaScript
;
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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