@selfage/datastore_client
Version:
Provides a type-safe client library to interact with Google Cloud Datastore.
184 lines • 22.6 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatastoreTransaction = exports.DatastoreClient = void 0;
const bigInt = require("big-integer");
const datastore_1 = require("@google-cloud/datastore");
const parser_1 = require("@selfage/message/parser");
function parseValue(rawValue, descriptor) {
let value = parser_1.parseMessage(rawValue, descriptor.valueDescriptor);
value[descriptor.key] = rawValue[datastore_1.Datastore.KEY].name;
return value;
}
function allocateKeys(datastoreRequest, values, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
let incompleteKey = new datastore_1.Key({ path: [descriptor.name] });
let response = yield datastoreRequest.allocateIds(incompleteKey, values.length);
let keys = response[0];
for (let i = 0; i < keys.length; i++) {
let uint8Array = bigInt(keys[i].id).toArray(256).value;
values[i][descriptor.key] =
Buffer.from(uint8Array).toString("base64");
}
return values;
});
}
function getValuesByKeys(datastoreRequest, keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
let datastoreKeys = new Array();
for (let key of keys) {
datastoreKeys.push(new datastore_1.Key({ path: [descriptor.name, key] }));
}
let response = yield datastoreRequest.get(datastoreKeys);
let results = new Array();
for (let rawValue of response[0]) {
results.push(parseValue(rawValue, descriptor));
}
return results;
});
}
function deleteByKeys(datastoreRequest, keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
let datastoreKeys = new Array();
for (let key of keys) {
datastoreKeys.push(new datastore_1.Key({ path: [descriptor.name, key] }));
}
yield datastoreRequest.delete(datastoreKeys);
});
}
function saveValues(datastoreRequest, values, descriptor, method) {
return __awaiter(this, void 0, void 0, function* () {
let entities = new Array();
for (let value of values) {
let keyValue = value[descriptor.key];
let key = new datastore_1.Key({
path: [descriptor.name, keyValue],
});
delete value[descriptor.key];
entities.push({
key: key,
data: value,
excludeFromIndexes: descriptor.excludedIndexes,
method: method,
});
}
yield datastoreRequest.save(entities);
});
}
function queryValues(datastoreRequest, datastoreQuery) {
return __awaiter(this, void 0, void 0, function* () {
let query = datastoreRequest.createQuery(datastoreQuery.modelDescriptor.name);
if (datastoreQuery.startCursor) {
query.start(datastoreQuery.startCursor);
}
if (datastoreQuery.limit) {
query.limit(datastoreQuery.limit);
}
for (let filter of datastoreQuery.filters) {
query.filter(filter.fieldName, filter.operator, filter.fieldValue);
}
for (let ordering of datastoreQuery.orderings) {
query.order(ordering.fieldName, { descending: ordering.descending });
}
let response = yield query.run();
let values = new Array();
for (let rawValue of response[0]) {
values.push(parseValue(rawValue, datastoreQuery.modelDescriptor));
}
let cursor;
if (response[1].moreResults !== "NO_MORE_RESULTS") {
cursor = response[1].endCursor;
}
return {
values,
cursor,
};
});
}
class DatastoreClient {
constructor(datastore) {
this.datastore = datastore;
}
// Use default Datastore constructor.
static create() {
let datastore = new datastore_1.Datastore();
return new DatastoreClient(datastore);
}
startTransaction() {
return __awaiter(this, void 0, void 0, function* () {
let [transaction] = yield this.datastore.transaction().run();
return new DatastoreTransaction(transaction);
});
}
allocateKeys(values, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return allocateKeys(this.datastore, values, descriptor);
});
}
get(keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return getValuesByKeys(this.datastore, keys, descriptor);
});
}
delete(keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return deleteByKeys(this.datastore, keys, descriptor);
});
}
save(values, descriptor, method) {
return __awaiter(this, void 0, void 0, function* () {
return saveValues(this.datastore, values, descriptor, method);
});
}
query(datastoreQuery) {
return __awaiter(this, void 0, void 0, function* () {
return queryValues(this.datastore, datastoreQuery);
});
}
}
exports.DatastoreClient = DatastoreClient;
class DatastoreTransaction {
constructor(transaction) {
this.transaction = transaction;
}
allocateKeys(values, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return allocateKeys(this.transaction, values, descriptor);
});
}
get(keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return getValuesByKeys(this.transaction, keys, descriptor);
});
}
delete(keys, descriptor) {
return __awaiter(this, void 0, void 0, function* () {
return deleteByKeys(this.transaction, keys, descriptor);
});
}
save(values, descriptor, method) {
return __awaiter(this, void 0, void 0, function* () {
return saveValues(this.transaction, values, descriptor, method);
});
}
query(datastoreQuery) {
return __awaiter(this, void 0, void 0, function* () {
return queryValues(this.transaction, datastoreQuery);
});
}
commit() {
return __awaiter(this, void 0, void 0, function* () {
yield this.transaction.commit();
});
}
}
exports.DatastoreTransaction = DatastoreTransaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHNDQUF1QztBQUV2Qyx1REFLaUM7QUFDakMsb0RBQXVEO0FBWXZELFNBQVMsVUFBVSxDQUNqQixRQUFhLEVBQ2IsVUFBdUM7SUFFdkMsSUFBSSxLQUFLLEdBQUcscUJBQVksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlELEtBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQWUsWUFBWSxDQUN6QixnQkFBa0MsRUFDbEMsTUFBZ0IsRUFDaEIsVUFBdUM7O1FBRXZDLElBQUksYUFBYSxHQUFHLElBQUksZUFBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFdBQVcsQ0FDL0MsYUFBYSxFQUNiLE1BQU0sQ0FBQyxNQUFNLENBQ2QsQ0FBQztRQUNGLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQWUsQ0FBQztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdEQsTUFBTSxDQUFDLENBQUMsQ0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxJQUFJ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RVksR0FBRyxDQUNkLElBQW1CLEVBQ25CLFVBQXVDOztZQUV2QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RCxDQUFDO0tBQUE7SUFFWSxNQUFNLENBQ2pCLElBQW1CLEVBQ25CLFVBQXVDOztZQUV2QyxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDO0tBQUE7SUFFWSxJQUFJLENBQ2YsTUFBZ0IsRUFDaEIsVUFBdUMsRUFDdkMsTUFBa0I7O1lBRWxCLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRSxDQUFDO0tBQUE7SUFFWSxLQUFLLENBQ2hCLGNBQWlDOztZQUVqQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7S0FBQTtJQUVZLE1BQU07O1lBQ2pCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0tBQUE7Q0FDRjtBQXpDRCxvREF5Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYmlnSW50ID0gcmVxdWlyZShcImJpZy1pbnRlZ2VyXCIpO1xuaW1wb3J0IHsgRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yLCBEYXRhc3RvcmVRdWVyeSB9IGZyb20gXCIuL21vZGVsX2Rlc2NyaXB0b3JcIjtcbmltcG9ydCB7XG4gIERhdGFzdG9yZSxcbiAgRGF0YXN0b3JlUmVxdWVzdCxcbiAgS2V5LFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSBcIkBnb29nbGUtY2xvdWQvZGF0YXN0b3JlXCI7XG5pbXBvcnQgeyBwYXJzZU1lc3NhZ2UgfSBmcm9tIFwiQHNlbGZhZ2UvbWVzc2FnZS9wYXJzZXJcIjtcblxuLy8gU2hvdWxkIGJlIGRlZmluZWQgYnkgRGF0YXN0b3JlIGJ1dCBub3QgZXhwb3J0ZWQuXG5leHBvcnQgdHlwZSBTYXZlTWV0aG9kID0gXCJpbnNlcnRcIiB8IFwidXBkYXRlXCIgfCBcInVwc2VydFwiO1xuXG5pbnRlcmZhY2UgRW50aXR5IHtcbiAga2V5OiBLZXk7XG4gIGRhdGE6IGFueTtcbiAgZXhjbHVkZUZyb21JbmRleGVzOiBBcnJheTxzdHJpbmc+O1xuICBtZXRob2Q6IFNhdmVNZXRob2Q7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWU8VD4oXG4gIHJhd1ZhbHVlOiBhbnksXG4gIGRlc2NyaXB0b3I6IERhdGFzdG9yZU1vZGVsRGVzY3JpcHRvcjxUPlxuKTogVCB7XG4gIGxldCB2YWx1ZSA9IHBhcnNlTWVzc2FnZShyYXdWYWx1ZSwgZGVzY3JpcHRvci52YWx1ZURlc2NyaXB0b3IpO1xuICAodmFsdWUgYXMgYW55KVtkZXNjcmlwdG9yLmtleV0gPSByYXdWYWx1ZVtEYXRhc3RvcmUuS0VZXS5uYW1lO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFsbG9jYXRlS2V5czxUPihcbiAgZGF0YXN0b3JlUmVxdWVzdDogRGF0YXN0b3JlUmVxdWVzdCxcbiAgdmFsdWVzOiBBcnJheTxUPixcbiAgZGVzY3JpcHRvcjogRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yPFQ+XG4pOiBQcm9taXNlPEFycmF5PFQ+PiB7XG4gIGxldCBpbmNvbXBsZXRlS2V5ID0gbmV3IEtleSh7IHBhdGg6IFtkZXNjcmlwdG9yLm5hbWVdIH0pO1xuICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBkYXRhc3RvcmVSZXF1ZXN0LmFsbG9jYXRlSWRzKFxuICAgIGluY29tcGxldGVLZXksXG4gICAgdmFsdWVzLmxlbmd0aFxuICApO1xuICBsZXQga2V5cyA9IHJlc3BvbnNlWzBdIGFzIEFycmF5PEtleT47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGxldCB1aW50OEFycmF5ID0gYmlnSW50KGtleXNbaV0uaWQpLnRvQXJyYXkoMjU2KS52YWx1ZTtcbiAgICAodmFsdWVzW2ldIGFzIGFueSlbZGVzY3JpcHRvci5rZXldID1cbiAgICAgIEJ1ZmZlci5mcm9tKHVpbnQ4QXJyYXkpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZhbHVlc0J5S2V5czxUPihcbiAgZGF0YXN0b3JlUmVxdWVzdDogRGF0YXN0b3JlUmVxdWVzdCxcbiAga2V5czogQXJyYXk8c3RyaW5nPixcbiAgZGVzY3JpcHRvcjogRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yPFQ+XG4pOiBQcm9taXNlPEFycmF5PFQ+PiB7XG4gIGxldCBkYXRhc3RvcmVLZXlzID0gbmV3IEFycmF5PEtleT4oKTtcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBkYXRhc3RvcmVLZXlzLnB1c2gobmV3IEtleSh7IHBhdGg6IFtkZXNjcmlwdG9yLm5hbWUsIGtleV0gfSkpO1xuICB9XG4gIGxldCByZXNwb25zZSA9IGF3YWl0IGRhdGFzdG9yZVJlcXVlc3QuZ2V0KGRhdGFzdG9yZUtleXMpO1xuICBsZXQgcmVzdWx0cyA9IG5ldyBBcnJheTxUPigpO1xuICBmb3IgKGxldCByYXdWYWx1ZSBvZiByZXNwb25zZVswXSkge1xuICAgIHJlc3VsdHMucHVzaChwYXJzZVZhbHVlKHJhd1ZhbHVlLCBkZXNjcmlwdG9yKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ5S2V5czxUPihcbiAgZGF0YXN0b3JlUmVxdWVzdDogRGF0YXN0b3JlUmVxdWVzdCxcbiAga2V5czogQXJyYXk8c3RyaW5nPixcbiAgZGVzY3JpcHRvcjogRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yPFQ+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGRhdGFzdG9yZUtleXMgPSBuZXcgQXJyYXk8S2V5PigpO1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgIGRhdGFzdG9yZUtleXMucHVzaChuZXcgS2V5KHsgcGF0aDogW2Rlc2NyaXB0b3IubmFtZSwga2V5XSB9KSk7XG4gIH1cbiAgYXdhaXQgZGF0YXN0b3JlUmVxdWVzdC5kZWxldGUoZGF0YXN0b3JlS2V5cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVWYWx1ZXM8VD4oXG4gIGRhdGFzdG9yZVJlcXVlc3Q6IERhdGFzdG9yZVJlcXVlc3QsXG4gIHZhbHVlczogQXJyYXk8VD4sXG4gIGRlc2NyaXB0b3I6IERhdGFzdG9yZU1vZGVsRGVzY3JpcHRvcjxUPixcbiAgbWV0aG9kOiBTYXZlTWV0aG9kXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGVudGl0aWVzID0gbmV3IEFycmF5PEVudGl0eT4oKTtcbiAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgbGV0IGtleVZhbHVlID0gKHZhbHVlIGFzIGFueSlbZGVzY3JpcHRvci5rZXldO1xuICAgIGxldCBrZXkgPSBuZXcgS2V5KHtcbiAgICAgIHBhdGg6IFtkZXNjcmlwdG9yLm5hbWUsIGtleVZhbHVlXSxcbiAgICB9KTtcbiAgICBkZWxldGUgKHZhbHVlIGFzIGFueSlbZGVzY3JpcHRvci5rZXldO1xuICAgIGVudGl0aWVzLnB1c2goe1xuICAgICAga2V5OiBrZXksXG4gICAgICBkYXRhOiB2YWx1ZSxcbiAgICAgIGV4Y2x1ZGVGcm9tSW5kZXhlczogZGVzY3JpcHRvci5leGNsdWRlZEluZGV4ZXMsXG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICB9KTtcbiAgfVxuICBhd2FpdCBkYXRhc3RvcmVSZXF1ZXN0LnNhdmUoZW50aXRpZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBxdWVyeVZhbHVlczxUPihcbiAgZGF0YXN0b3JlUmVxdWVzdDogRGF0YXN0b3JlUmVxdWVzdCxcbiAgZGF0YXN0b3JlUXVlcnk6IERhdGFzdG9yZVF1ZXJ5PFQ+XG4pOiBQcm9taXNlPHsgdmFsdWVzOiBBcnJheTxUPjsgY3Vyc29yPzogc3RyaW5nIH0+IHtcbiAgbGV0IHF1ZXJ5ID0gZGF0YXN0b3JlUmVxdWVzdC5jcmVhdGVRdWVyeShkYXRhc3RvcmVRdWVyeS5tb2RlbERlc2NyaXB0b3IubmFtZSk7XG4gIGlmIChkYXRhc3RvcmVRdWVyeS5zdGFydEN1cnNvcikge1xuICAgIHF1ZXJ5LnN0YXJ0KGRhdGFzdG9yZVF1ZXJ5LnN0YXJ0Q3Vyc29yKTtcbiAgfVxuICBpZiAoZGF0YXN0b3JlUXVlcnkubGltaXQpIHtcbiAgICBxdWVyeS5saW1pdChkYXRhc3RvcmVRdWVyeS5saW1pdCk7XG4gIH1cbiAgZm9yIChsZXQgZmlsdGVyIG9mIGRhdGFzdG9yZVF1ZXJ5LmZpbHRlcnMpIHtcbiAgICBxdWVyeS5maWx0ZXIoZmlsdGVyLmZpZWxkTmFtZSwgZmlsdGVyLm9wZXJhdG9yLCBmaWx0ZXIuZmllbGRWYWx1ZSk7XG4gIH1cbiAgZm9yIChsZXQgb3JkZXJpbmcgb2YgZGF0YXN0b3JlUXVlcnkub3JkZXJpbmdzKSB7XG4gICAgcXVlcnkub3JkZXIob3JkZXJpbmcuZmllbGROYW1lLCB7IGRlc2NlbmRpbmc6IG9yZGVyaW5nLmRlc2NlbmRpbmcgfSk7XG4gIH1cbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcXVlcnkucnVuKCk7XG4gIGxldCB2YWx1ZXMgPSBuZXcgQXJyYXk8VD4oKTtcbiAgZm9yIChsZXQgcmF3VmFsdWUgb2YgcmVzcG9uc2VbMF0pIHtcbiAgICB2YWx1ZXMucHVzaChwYXJzZVZhbHVlKHJhd1ZhbHVlLCBkYXRhc3RvcmVRdWVyeS5tb2RlbERlc2NyaXB0b3IpKTtcbiAgfVxuICBsZXQgY3Vyc29yOiBzdHJpbmc7XG4gIGlmIChyZXNwb25zZVsxXS5tb3JlUmVzdWx0cyAhPT0gXCJOT19NT1JFX1JFU1VMVFNcIikge1xuICAgIGN1cnNvciA9IHJlc3BvbnNlWzFdLmVuZEN1cnNvcjtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbHVlcyxcbiAgICBjdXJzb3IsXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhc3RvcmVDbGllbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhc3RvcmU6IERhdGFzdG9yZSkge31cblxuICAvLyBVc2UgZGVmYXVsdCBEYXRhc3RvcmUgY29uc3RydWN0b3IuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCk6IERhdGFzdG9yZUNsaWVudCB7XG4gICAgbGV0IGRhdGFzdG9yZSA9IG5ldyBEYXRhc3RvcmUoKTtcbiAgICByZXR1cm4gbmV3IERhdGFzdG9yZUNsaWVudChkYXRhc3RvcmUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxEYXRhc3RvcmVUcmFuc2FjdGlvbj4ge1xuICAgIGxldCBbdHJhbnNhY3Rpb25dID0gYXdhaXQgdGhpcy5kYXRhc3RvcmUudHJhbnNhY3Rpb24oKS5ydW4oKTtcbiAgICByZXR1cm4gbmV3IERhdGFzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhbGxvY2F0ZUtleXM8VD4oXG4gICAgdmFsdWVzOiBBcnJheTxUPixcbiAgICBkZXNjcmlwdG9yOiBEYXRhc3RvcmVNb2RlbERlc2NyaXB0b3I8VD5cbiAgKTogUHJvbWlzZTxBcnJheTxUPj4ge1xuICAgIHJldHVybiBhbGxvY2F0ZUtleXModGhpcy5kYXRhc3RvcmUsIHZhbHVlcywgZGVzY3JpcHRvcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0PFQ+KFxuICAgIGtleXM6IEFycmF5PHN0cmluZz4sXG4gICAgZGVzY3JpcHRvcjogRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yPFQ+XG4gICk6IFByb21pc2U8QXJyYXk8VD4+IHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzQnlLZXlzKHRoaXMuZGF0YXN0b3JlLCBrZXlzLCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGU8VD4oXG4gICAga2V5czogQXJyYXk8c3RyaW5nPixcbiAgICBkZXNjcmlwdG9yOiBEYXRhc3RvcmVNb2RlbERlc2NyaXB0b3I8VD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGRlbGV0ZUJ5S2V5cyh0aGlzLmRhdGFzdG9yZSwga2V5cywgZGVzY3JpcHRvcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZTxUPihcbiAgICB2YWx1ZXM6IEFycmF5PFQ+LFxuICAgIGRlc2NyaXB0b3I6IERhdGFzdG9yZU1vZGVsRGVzY3JpcHRvcjxUPixcbiAgICBtZXRob2Q6IFNhdmVNZXRob2RcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHNhdmVWYWx1ZXModGhpcy5kYXRhc3RvcmUsIHZhbHVlcywgZGVzY3JpcHRvciwgbWV0aG9kKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBxdWVyeTxUPihcbiAgICBkYXRhc3RvcmVRdWVyeTogRGF0YXN0b3JlUXVlcnk8VD5cbiAgKTogUHJvbWlzZTx7IHZhbHVlczogQXJyYXk8VD47IGN1cnNvcj86IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHF1ZXJ5VmFsdWVzKHRoaXMuZGF0YXN0b3JlLCBkYXRhc3RvcmVRdWVyeSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERhdGFzdG9yZVRyYW5zYWN0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBhbGxvY2F0ZUtleXM8VD4oXG4gICAgdmFsdWVzOiBBcnJheTxUPixcbiAgICBkZXNjcmlwdG9yOiBEYXRhc3RvcmVNb2RlbERlc2NyaXB0b3I8VD5cbiAgKTogUHJvbWlzZTxBcnJheTxUPj4ge1xuICAgIHJldHVybiBhbGxvY2F0ZUtleXModGhpcy50cmFuc2FjdGlvbiwgdmFsdWVzLCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXQ8VD4oXG4gICAga2V5czogQXJyYXk8c3RyaW5nPixcbiAgICBkZXNjcmlwdG9yOiBEYXRhc3RvcmVNb2RlbERlc2NyaXB0b3I8VD5cbiAgKTogUHJvbWlzZTxBcnJheTxUPj4ge1xuICAgIHJldHVybiBnZXRWYWx1ZXNCeUtleXModGhpcy50cmFuc2FjdGlvbiwga2V5cywgZGVzY3JpcHRvcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQ+KFxuICAgIGtleXM6IEFycmF5PHN0cmluZz4sXG4gICAgZGVzY3JpcHRvcjogRGF0YXN0b3JlTW9kZWxEZXNjcmlwdG9yPFQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBkZWxldGVCeUtleXModGhpcy50cmFuc2FjdGlvbiwga2V5cywgZGVzY3JpcHRvcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZTxUPihcbiAgICB2YWx1ZXM6IEFycmF5PFQ+LFxuICAgIGRlc2NyaXB0b3I6IERhdGFzdG9yZU1vZGVsRGVzY3JpcHRvcjxUPixcbiAgICBtZXRob2Q6IFNhdmVNZXRob2RcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHNhdmVWYWx1ZXModGhpcy50cmFuc2FjdGlvbiwgdmFsdWVzLCBkZXNjcmlwdG9yLCBtZXRob2QpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHF1ZXJ5PFQ+KFxuICAgIGRhdGFzdG9yZVF1ZXJ5OiBEYXRhc3RvcmVRdWVyeTxUPlxuICApOiBQcm9taXNlPHsgdmFsdWVzOiBBcnJheTxUPjsgY3Vyc29yPzogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gcXVlcnlWYWx1ZXModGhpcy50cmFuc2FjdGlvbiwgZGF0YXN0b3JlUXVlcnkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLmNvbW1pdCgpO1xuICB9XG59XG4iXX0=