antfarm
Version:
File automation framework for ants.
258 lines (256 loc) • 25.3 kB
JavaScript
"use strict";
var webhookInterface_1 = require("./webhookInterface");
var step_1 = require("./step");
var _ = require("lodash"), clone = require("clone");
/**
* The interface manager allows you to separate your interface fields for stepped user interfaces.
* It's a factory that handles the construction and session handling of WebhookInterface instances.
* #### Example
* ```js
* var manager = webhook.getInterfaceManager();
* manager.addField({
* id: "job_number",
* _name: "Job Number";
* type: "text"
* });
* ```
*/
var InterfaceManager = (function () {
/**
*
* @param e
* @param webhookNest
* @param handleRequest Optional custom request handler for webhooks.
*/
function InterfaceManager(e, webhookNest, handleRequest) {
this.e = e;
this._nest = webhookNest;
this._interfaceInstances = [];
this._fields = [];
this._steps = [];
this._handleRequest = handleRequest;
this.initMetadata();
}
InterfaceManager.prototype.initMetadata = function () {
this._metadata = {
interfaceProperties: []
};
};
Object.defineProperty(InterfaceManager.prototype, "metadata", {
get: function () {
return this._metadata;
},
set: function (metadata) {
var clonedMetadata = clone(metadata);
if (_.has(clonedMetadata, "interfaceProperties") && typeof (clonedMetadata.interfaceProperties) !== "undefined" && clonedMetadata.interfaceProperties.constructor === Array) {
}
else {
clonedMetadata.interfaceProperties = [];
}
this._metadata = clonedMetadata;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "description", {
set: function (description) {
this.metadata.description = description;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "tooltip", {
set: function (tooltip) {
this.metadata.tooltip = tooltip;
},
enumerable: true,
configurable: true
});
InterfaceManager.prototype.addInterfaceProperty = function (property) {
this.metadata.interfaceProperties.push(property);
};
Object.defineProperty(InterfaceManager.prototype, "interfaceProperties", {
set: function (properties) {
this.metadata.interfaceProperties = properties;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "interfaceInstances", {
get: function () {
return this._interfaceInstances;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "checkpointNest", {
get: function () {
return this._checkpointNest;
},
set: function (nest) {
this._checkpointNest = nest;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "customHandleRequest", {
/**
* Get the custom handleRequest function.
* @returns {any}
*/
get: function () {
return this._handleRequest;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "nest", {
/**
* Get the nest
* @returns {WebhookNest}
*/
get: function () {
return this._nest;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InterfaceManager.prototype, "path", {
/**
* Get the nest _path.
* @returns {string}
*/
get: function () {
return this.nest.path;
},
enumerable: true,
configurable: true
});
/**
* Adds an interface field to the interface.
* @param {FieldOptions} field
*/
InterfaceManager.prototype.addField = function (field) {
var wi = this;
var existingField = _.find(wi.fields, function (f) { return f.id === field.id; });
if (existingField) {
wi.e.log(3, "Field id \"" + field.id + "\" already exists. It cannot be added again.", wi);
return false;
}
this.fields.push(field);
};
Object.defineProperty(InterfaceManager.prototype, "fields", {
/**
* Gets an array of interface fields.
* @returns {FieldOptions[]}
*/
get: function () {
return this._fields;
},
enumerable: true,
configurable: true
});
/**
* Adds a user interface step.
* @param stepName
* @param callback Parameters: WebhookJob, WebhookInterface, Step, Done callback
* #### Example
* ```js
* manager.addStep("Check job number", function(webhookJob, webhookInterface, step, done){
* if(webhookJob.getQueryStringValue("job_number")){
* webhookInterface.addField({
* id: "something_else",
* _name: "Some other field",
* type: "text",
* description: "Thanks for adding a job number!"
* });
* step.complete = true; // Mark step as complete
* done(); // Callback to do next step or send response if complete
* }
* });
* ```
*/
InterfaceManager.prototype.addStep = function (stepName, callback) {
var step = new step_1.Step();
step.name = stepName;
step.callback = callback;
step.complete = false;
this._steps.push(step);
};
Object.defineProperty(InterfaceManager.prototype, "steps", {
/**
* Get an array of user interface steps.
* @returns {Step[]}
*/
get: function () {
return this._steps;
},
enumerable: true,
configurable: true
});
InterfaceManager.prototype.addInterfaceInstance = function (wi) {
var im = this;
im.interfaceInstances.push(wi);
// Destruct
var sessionExpiration = (im.e.options.webhook_interface_session_timeout * 60000) || 300000;
setTimeout(function () {
im.removeInterfaceInstance(wi);
}, sessionExpiration);
};
InterfaceManager.prototype.removeInterfaceInstance = function (wi) {
var im = this;
var removeSuccess = _.remove(im.interfaceInstances, function (i) {
return i.sessionId === wi.sessionId;
});
if (removeSuccess) {
im.e.log(0, "Removed webhook interface session " + wi.sessionId, im);
}
else {
im.e.log(3, "Unable to remove webhook interface session " + wi.sessionId, im);
}
};
;
/**
* Find or return a new webhook interface instance.
* @param sessionId
* @returns {WebhookInterface}
*/
InterfaceManager.prototype.getInterface = function (sessionId) {
var im = this;
var wi;
// Find in this.interfaceInstances
if (sessionId) {
wi = _.find(im.interfaceInstances, function (i) { return i.sessionId === sessionId; });
}
if (!wi) {
// Make new interface if not found
wi = new webhookInterface_1.WebhookInterface(im.e, im.nest);
wi.fields = im.fields;
wi.steps = im.steps;
wi.metadata = im.metadata;
wi.checkpointNest = im.checkpointNest;
if (im.interfaceInstances.length === 0) {
im.e.addWebhookInterface(this);
}
else {
im.e.log(0, im.interfaceInstances.length + " interface sessions already exist.", im);
}
im.addInterfaceInstance(wi);
}
else {
im.e.log(0, "Restored interface session " + wi.sessionId + ".", im);
}
return wi;
};
/**
* Adds pending jobs to the interfaces job list.
* @param nest
*/
InterfaceManager.prototype.checkNest = function (nest) {
this.checkpointNest = nest;
nest.watchHold();
};
return InterfaceManager;
}());
exports.InterfaceManager = InterfaceManager;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aS9pbnRlcmZhY2VNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxpQ0FBK0Isb0JBQW9CLENBQUMsQ0FBQTtBQUdwRCxxQkFBbUIsUUFBUSxDQUFDLENBQUE7QUFLNUIsSUFBUSxDQUFDLEdBQWEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUMvQixLQUFLLEdBQVMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXZDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIO0lBV0k7Ozs7O09BS0c7SUFDSCwwQkFBWSxDQUFjLEVBQUUsV0FBd0IsRUFBRSxhQUFtQjtRQUNyRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFUyx1Q0FBWSxHQUF0QjtRQUNJLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDYixtQkFBbUIsRUFBRSxFQUFFO1NBQ0wsQ0FBQztJQUMzQixDQUFDO0lBRUQsc0JBQVcsc0NBQVE7YUFBbkI7WUFDSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO2FBRUQsVUFBb0IsUUFBMkI7WUFFM0MsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXJDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLHFCQUFxQixDQUFDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFdBQVcsSUFBSSxjQUFjLENBQUMsbUJB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LE1BQU0sdUNBQW9DLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUNELEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0NBQThCLEVBQUUsQ0FBQyxTQUFTLE1BQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSSxvQ0FBUyxHQUFoQixVQUFpQixJQUFnQjtRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNMLHVCQUFDO0FBQUQsQ0F0T0EsQUFzT0MsSUFBQTtBQXRPWSx3QkFBZ0IsbUJBc081QixDQUFBIiwiZmlsZSI6ImxpYi91aS9pbnRlcmZhY2VNYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtXZWJob29rTmVzdH0gZnJvbSBcIi4uL25lc3Qvd2ViaG9va05lc3RcIjtcbmltcG9ydCB7V2ViaG9va0ludGVyZmFjZX0gZnJvbSBcIi4vd2ViaG9va0ludGVyZmFjZVwiO1xuaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSBcIi4uL2Vudmlyb25tZW50L2Vudmlyb25tZW50XCI7XG5pbXBvcnQge0ZpZWxkT3B0aW9uc30gZnJvbSBcIi4vZmllbGRcIjtcbmltcG9ydCB7U3RlcH0gZnJvbSBcIi4vc3RlcFwiO1xuaW1wb3J0IHtJbnRlcmZhY2VNZXRhZGF0YX0gZnJvbSBcIi4vaW50ZXJmYWNlTWV0YWRhdGFcIjtcbmltcG9ydCB7SW50ZXJmYWNlUHJvcGVydHl9IGZyb20gXCIuL0ludGVyZmFjZVByb3BlcnR5XCI7XG5pbXBvcnQge0ZvbGRlck5lc3R9IGZyb20gXCIuLi9uZXN0L2ZvbGRlck5lc3RcIjtcblxuY29uc3QgICBfICAgICAgICAgICA9IHJlcXVpcmUoXCJsb2Rhc2hcIiksXG4gICAgICAgIGNsb25lICAgICAgID0gcmVxdWlyZShcImNsb25lXCIpO1xuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgbWFuYWdlciBhbGxvd3MgeW91IHRvIHNlcGFyYXRlIHlvdXIgaW50ZXJmYWNlIGZpZWxkcyBmb3Igc3RlcHBlZCB1c2VyIGludGVyZmFjZXMuXG4gKiBJdCdzIGEgZmFjdG9yeSB0aGF0IGhhbmRsZXMgdGhlIGNvbnN0cnVjdGlvbiBhbmQgc2Vzc2lvbiBoYW5kbGluZyBvZiBXZWJob29rSW50ZXJmYWNlIGluc3RhbmNlcy5cbiAqICMjIyMgRXhhbXBsZVxuICogYGBganNcbiAqIHZhciBtYW5hZ2VyID0gd2ViaG9vay5nZXRJbnRlcmZhY2VNYW5hZ2VyKCk7XG4gKiBtYW5hZ2VyLmFkZEZpZWxkKHtcbiAqICAgICAgaWQ6IFwiam9iX251bWJlclwiLFxuICogICAgICBfbmFtZTogXCJKb2IgTnVtYmVyXCI7XG4gKiAgICAgIHR5cGU6IFwidGV4dFwiXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJmYWNlTWFuYWdlciB7XG5cbiAgICBwcm90ZWN0ZWQgZTogRW52aXJvbm1lbnQ7XG4gICAgcHJvdGVjdGVkIF9uZXN0OiBXZWJob29rTmVzdDtcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkczogRmllbGRPcHRpb25zW107XG4gICAgcHJvdGVjdGVkIF9zdGVwczogU3RlcFtdO1xuICAgIHByb3RlY3RlZCBfaW50ZXJmYWNlSW5zdGFuY2VzOiBXZWJob29rSW50ZXJmYWNlW107XG4gICAgcHJvdGVjdGVkIF9oYW5kbGVSZXF1ZXN0OiBhbnk7XG4gICAgcHJvdGVjdGVkIF9tZXRhZGF0YTogSW50ZXJmYWNlTWV0YWRhdGE7XG4gICAgcHJvdGVjdGVkIF9jaGVja3BvaW50TmVzdDogRm9sZGVyTmVzdDtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGVcbiAgICAgKiBAcGFyYW0gd2ViaG9va05lc3RcbiAgICAgKiBAcGFyYW0gaGFuZGxlUmVxdWVzdCAgICAgT3B0aW9uYWwgY3VzdG9tIHJlcXVlc3QgaGFuZGxlciBmb3Igd2ViaG9va3MuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZTogRW52aXJvbm1lbnQsIHdlYmhvb2tOZXN0OiBXZWJob29rTmVzdCwgaGFuZGxlUmVxdWVzdD86IGFueSkge1xuICAgICAgICB0aGlzLmUgPSBlO1xuICAgICAgICB0aGlzLl9uZXN0ID0gd2ViaG9va05lc3Q7XG4gICAgICAgIHRoaXMuX2ludGVyZmFjZUluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLl9maWVsZHMgPSBbXTtcbiAgICAgICAgdGhpcy5fc3RlcHMgPSBbXTtcbiAgICAgICAgdGhpcy5faGFuZGxlUmVxdWVzdCA9IGhhbmRsZVJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaW5pdE1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluaXRNZXRhZGF0YSgpIHtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBpbnRlcmZhY2VQcm9wZXJ0aWVzOiBbXVxuICAgICAgICB9IGFzIEludGVyZmFjZU1ldGFkYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG1ldGFkYXRhOiBJbnRlcmZhY2VNZXRhZGF0YSkge1xuXG4gICAgICAgIGxldCBjbG9uZWRNZXRhZGF0YSA9IGNsb25lKG1ldGFkYXRhKTtcblxuICAgICAgICBpZiAoXy5oYXMoY2xvbmVkTWV0YWRhdGEsIFwiaW50ZXJmYWNlUHJvcGVydGllc1wiKSAmJiB0eXBlb2YgKGNsb25lZE1ldGFkYXRhLmludGVyZmFjZVByb3BlcnRpZXMpICE9PSBcInVuZGVmaW5lZFwiICYmIGNsb25lZE1ldGFkYXRhLmludGVyZmFjZVByb3BlcnRpZXMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbG9uZWRNZXRhZGF0YS5pbnRlcmZhY2VQcm9wZXJ0aWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSBjbG9uZWRNZXRhZGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG9vbHRpcCh0b29sdGlwOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YS50b29sdGlwID0gdG9vbHRpcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW50ZXJmYWNlUHJvcGVydHkocHJvcGVydHk6IEludGVyZmFjZVByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEuaW50ZXJmYWNlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGludGVyZmFjZVByb3BlcnRpZXMocHJvcGVydGllczogSW50ZXJmYWNlUHJvcGVydHlbXSkge1xuICAgICAgICB0aGlzLm1ldGFkYXRhLmludGVyZmFjZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW50ZXJmYWNlSW5zdGFuY2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJmYWNlSW5zdGFuY2VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2hlY2twb2ludE5lc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja3BvaW50TmVzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNoZWNrcG9pbnROZXN0KG5lc3Q6IEZvbGRlck5lc3QpIHtcbiAgICAgICAgdGhpcy5fY2hlY2twb2ludE5lc3QgPSBuZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VzdG9tIGhhbmRsZVJlcXVlc3QgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1c3RvbUhhbmRsZVJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVSZXF1ZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmVzdFxuICAgICAqIEByZXR1cm5zIHtXZWJob29rTmVzdH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5lc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmVzdCBfcGF0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmVzdC5wYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gaW50ZXJmYWNlIGZpZWxkIHRvIHRoZSBpbnRlcmZhY2UuXG4gICAgICogQHBhcmFtIHtGaWVsZE9wdGlvbnN9IGZpZWxkXG4gICAgICovXG4gICAgcHVibGljIGFkZEZpZWxkKGZpZWxkOiBGaWVsZE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHdpID0gdGhpcztcblxuICAgICAgICBsZXQgZXhpc3RpbmdGaWVsZCA9IF8uZmluZCh3aS5maWVsZHMsIGZ1bmN0aW9uKGYpIHsgcmV0dXJuIGYuaWQgPT09IGZpZWxkLmlkOyB9KTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdGaWVsZCkge1xuICAgICAgICAgICAgd2kuZS5sb2coMywgYEZpZWxkIGlkIFwiJHtmaWVsZC5pZH1cIiBhbHJlYWR5IGV4aXN0cy4gSXQgY2Fubm90IGJlIGFkZGVkIGFnYWluLmAsIHdpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmllbGRzLnB1c2goZmllbGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgaW50ZXJmYWNlIGZpZWxkcy5cbiAgICAgKiBAcmV0dXJucyB7RmllbGRPcHRpb25zW119XG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHVzZXIgaW50ZXJmYWNlIHN0ZXAuXG4gICAgICogQHBhcmFtIHN0ZXBOYW1lXG4gICAgICogQHBhcmFtIGNhbGxiYWNrICAgICAgICAgIFBhcmFtZXRlcnM6IFdlYmhvb2tKb2IsIFdlYmhvb2tJbnRlcmZhY2UsIFN0ZXAsIERvbmUgY2FsbGJhY2tcbiAgICAgKiAjIyMjIEV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqICBtYW5hZ2VyLmFkZFN0ZXAoXCJDaGVjayBqb2IgbnVtYmVyXCIsIGZ1bmN0aW9uKHdlYmhvb2tKb2IsIHdlYmhvb2tJbnRlcmZhY2UsIHN0ZXAsIGRvbmUpe1xuICAgICAqICAgICAgaWYod2ViaG9va0pvYi5nZXRRdWVyeVN0cmluZ1ZhbHVlKFwiam9iX251bWJlclwiKSl7XG4gICAgICogICAgICAgICAgd2ViaG9va0ludGVyZmFjZS5hZGRGaWVsZCh7XG4gICAgICogICAgICAgICAgICAgIGlkOiBcInNvbWV0aGluZ19lbHNlXCIsXG4gICAgICogICAgICAgICAgICAgIF9uYW1lOiBcIlNvbWUgb3RoZXIgZmllbGRcIixcbiAgICAgKiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICogICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoYW5rcyBmb3IgYWRkaW5nIGEgam9iIG51bWJlciFcIlxuICAgICAqICAgICAgICAgIH0pO1xuICAgICAqICAgICAgICAgIHN0ZXAuY29tcGxldGUgPSB0cnVlOyAvLyBNYXJrIHN0ZXAgYXMgY29tcGxldGVcbiAgICAgKiAgICAgICAgICBkb25lKCk7IC8vIENhbGxiYWNrIHRvIGRvIG5leHQgc3RlcCBvciBzZW5kIHJlc3BvbnNlIGlmIGNvbXBsZXRlXG4gICAgICogICAgICB9XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFkZFN0ZXAoc3RlcE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IGFueSkge1xuICAgICAgICBsZXQgc3RlcCA9IG5ldyBTdGVwKCk7XG4gICAgICAgIHN0ZXAubmFtZSA9IHN0ZXBOYW1lO1xuICAgICAgICBzdGVwLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHN0ZXAuY29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RlcHMucHVzaChzdGVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgdXNlciBpbnRlcmZhY2Ugc3RlcHMuXG4gICAgICogQHJldHVybnMge1N0ZXBbXX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0ZXBzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RlcHM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFkZEludGVyZmFjZUluc3RhbmNlKHdpOiBXZWJob29rSW50ZXJmYWNlKSB7XG4gICAgICAgIGxldCBpbSA9IHRoaXM7XG4gICAgICAgIGltLmludGVyZmFjZUluc3RhbmNlcy5wdXNoKHdpKTtcblxuICAgICAgICAvLyBEZXN0cnVjdFxuICAgICAgICBsZXQgc2Vzc2lvbkV4cGlyYXRpb24gPSAoaW0uZS5vcHRpb25zLndlYmhvb2tfaW50ZXJmYWNlX3Nlc3Npb25fdGltZW91dCAqIDYwMDAwKSB8fCAzMDAwMDA7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpbS5yZW1vdmVJbnRlcmZhY2VJbnN0YW5jZSh3aSk7XG4gICAgICAgIH0sIHNlc3Npb25FeHBpcmF0aW9uKTtcblxuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW1vdmVJbnRlcmZhY2VJbnN0YW5jZSh3aTogV2ViaG9va0ludGVyZmFjZSkge1xuICAgICAgICBsZXQgaW0gPSB0aGlzO1xuICAgICAgICBsZXQgcmVtb3ZlU3VjY2VzcyA9IF8ucmVtb3ZlKGltLmludGVyZmFjZUluc3RhbmNlcywgKGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpLnNlc3Npb25JZCA9PT0gd2kuc2Vzc2lvbklkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVtb3ZlU3VjY2Vzcykge1xuICAgICAgICAgICAgaW0uZS5sb2coMCwgYFJlbW92ZWQgd2ViaG9vayBpbnRlcmZhY2Ugc2Vzc2lvbiAke3dpLnNlc3Npb25JZH1gLCBpbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbS5lLmxvZygzLCBgVW5hYmxlIHRvIHJlbW92ZSB3ZWJob29rIGludGVyZmFjZSBzZXNzaW9uICR7d2kuc2Vzc2lvbklkfWAsIGltKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIG9yIHJldHVybiBhIG5ldyB3ZWJob29rIGludGVyZmFjZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkXG4gICAgICogQHJldHVybnMge1dlYmhvb2tJbnRlcmZhY2V9XG4gICAgICovXG4gICAgcHVibGljIGdldEludGVyZmFjZShzZXNzaW9uSWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGltID0gdGhpcztcbiAgICAgICAgbGV0IHdpO1xuICAgICAgICAvLyBGaW5kIGluIHRoaXMuaW50ZXJmYWNlSW5zdGFuY2VzXG4gICAgICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIHdpID0gXy5maW5kKGltLmludGVyZmFjZUluc3RhbmNlcywgZnVuY3Rpb24oaSkgeyByZXR1cm4gaS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZDsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXdpKSB7XG4gICAgICAgICAgICAvLyBNYWtlIG5ldyBpbnRlcmZhY2UgaWYgbm90IGZvdW5kXG4gICAgICAgICAgICB3aSA9IG5ldyBXZWJob29rSW50ZXJmYWNlKGltLmUsIGltLm5lc3QpO1xuXG4gICAgICAgICAgICB3aS5maWVsZHMgPSBpbS5maWVsZHM7XG4gICAgICAgICAgICB3aS5zdGVwcyA9IGltLnN0ZXBzO1xuICAgICAgICAgICAgd2kubWV0YWRhdGEgPSBpbS5tZXRhZGF0YTtcbiAgICAgICAgICAgIHdpLmNoZWNrcG9pbnROZXN0ID0gaW0uY2hlY2twb2ludE5lc3Q7XG5cbiAgICAgICAgICAgIGlmIChpbS5pbnRlcmZhY2VJbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaW0uZS5hZGRXZWJob29rSW50ZXJmYWNlKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbS5lLmxvZygwLCBgJHtpbS5pbnRlcmZhY2VJbnN0YW5jZXMubGVuZ3RofSBpbnRlcmZhY2Ugc2Vzc2lvbnMgYWxyZWFkeSBleGlzdC5gLCBpbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbS5hZGRJbnRlcmZhY2VJbnN0YW5jZSh3aSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbS5lLmxvZygwLCBgUmVzdG9yZWQgaW50ZXJmYWNlIHNlc3Npb24gJHt3aS5zZXNzaW9uSWR9LmAsIGltKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHBlbmRpbmcgam9icyB0byB0aGUgaW50ZXJmYWNlcyBqb2IgbGlzdC5cbiAgICAgKiBAcGFyYW0gbmVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVja05lc3QobmVzdDogRm9sZGVyTmVzdCkge1xuICAgICAgICB0aGlzLmNoZWNrcG9pbnROZXN0ID0gbmVzdDtcbiAgICAgICAgbmVzdC53YXRjaEhvbGQoKTtcbiAgICB9XG59Il19