antfarm
Version:
File automation framework for ants.
202 lines (200 loc) • 19.9 kB
JavaScript
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var nest_1 = require("./nest");
var interfaceManager_1 = require("../ui/interfaceManager");
var http = require("http");
var WebhookNest = (function (_super) {
__extends(WebhookNest, _super);
/**
* Webhook Nest constructor
* @param e
* @param path
* @param httpMethod
* @param handleRequest Custom request handler function.
*/
function WebhookNest(e, path, httpMethod, handleRequest) {
_super.call(this, e, path.toString());
var wh = this;
wh.path = path;
wh.httpMethod = httpMethod;
if (handleRequest) {
wh.customHandleRequest = handleRequest;
}
this._im = new interfaceManager_1.InterfaceManager(this.e, this);
this._holdResponse = false;
}
Object.defineProperty(WebhookNest.prototype, "holdResponse", {
/**
* Get the holdResponse flag.
* @returns {boolean}
*/
get: function () {
return this._holdResponse;
},
/**
* Set hold response flag. This allows you to run tunnel logic and send the response after completion.
* You must call _releaseResponse_ later if you use this.
* @param holdResponse
*/
set: function (holdResponse) {
this._holdResponse = holdResponse;
},
enumerable: true,
configurable: true
});
/**
* Releases the webhook response when tunnel run logic is complete.
* @param job {WebhookJob} The webhook job that triggered the webhook nest.
* @param message {string} The optional response message, if not using a custom request handler.
* #### Example
* ```js
* var webhook = af.createWebhookNest(["jobs", "submit"], "post");
* webhook.holdResponse = true; // Keeps the response from being sent immediately
* var tunnel = af.createTunnel("Dwight's test tunnel");
* tunnel.watch(webhook);
* tunnel.run(function(job, nest){
* setTimeout(function(){
* nest.releaseResponse(job, "Worked!"); // Sends response
* }, 1500); // After 1.5 seconds
* });
* ```
*/
WebhookNest.prototype.releaseResponse = function (job, message) {
var wn = this;
if (wn.holdResponse === false) {
wn.e.log(3, "Nest responses must be held to release a response.", wn);
}
else if (job.responseSent === true) {
wn.e.log(0, "Nest responses was already sent. Skipping.", wn);
}
else {
wn.e.server.sendHookResponse(false, job, wn, job.request, job.response, wn.customHandleRequest, message);
}
};
Object.defineProperty(WebhookNest.prototype, "customHandleRequest", {
/**
* Get the custom handleRequest function.
* @returns {any}
*/
get: function () {
return this._handleRequest;
},
/**
* Set the custom handlerRequest function.
* @param handleRequest
*/
set: function (handleRequest) {
if (handleRequest !== null && typeof handleRequest !== "function") {
throw ("Custom handleRequest must be a function.");
}
this._handleRequest = handleRequest;
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebhookNest.prototype, "path", {
/**
* Get the _path.
* @returns {string}
*/
get: function () {
return this._path;
},
/**
* Set the _path as a string or a string array. All parts are URI encoded.
* Create directory structures with an array: ["one", "two"] results in "/one/two".
* @param path
*/
set: function (path) {
var wh = this;
var modifiedPath = "";
if (typeof (path) === "string") {
modifiedPath = encodeURIComponent(path);
}
else if (path instanceof Array) {
path.forEach(function (pi) {
modifiedPath += "/" + encodeURIComponent(pi);
});
}
else {
throw "Path should be a string or array, " + typeof (path) + " found.";
}
if (modifiedPath.charAt(0) !== "/") {
modifiedPath = "/" + modifiedPath;
}
wh._path = modifiedPath;
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebhookNest.prototype, "httpMethod", {
/**
* Get the HTTP method.
* @returns {string}
*/
get: function () {
return this._httpMethod;
},
/**
* Set the HTTP method.
* @param httpMethod
*/
set: function (httpMethod) {
var lower = httpMethod.toLowerCase();
var acceptableMethods = ["get", "post", "put", "head", "delete", "options", "trace", "copy", "lock", "mkcol", "move", "purge", "propfind", "proppatch", "unlock", "report", "mkactivity", "checkout", "merge", "m-search", "notify", "subscribe", "unsubscribe", "patch", "search", "connect", "all"];
if (acceptableMethods.indexOf(lower) === -1) {
throw "HTTP method \"" + lower + "\" is not an acceptable value. " + JSON.stringify(acceptableMethods);
}
this._httpMethod = lower;
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebhookNest.prototype, "name", {
/**
* Get the _name.
* @returns {string}
*/
get: function () {
return this._name;
},
enumerable: true,
configurable: true
});
/**
* On load, do nothing.
*/
WebhookNest.prototype.load = function () { };
/**
* Add webhook to server watch list.
*/
WebhookNest.prototype.watch = function () {
var wh = this;
wh.e.addWebhook(wh);
};
/**
* Creates a new job
* @param job
*/
WebhookNest.prototype.arrive = function (job) {
_super.prototype.arrive.call(this, job);
};
Object.defineProperty(WebhookNest.prototype, "interfaceManager", {
/**
* Get the interface manager. Used to manage interface instances for session handling.
* @returns {InterfaceManager}
*/
get: function () {
return this._im;
},
enumerable: true,
configurable: true
});
return WebhookNest;
}(nest_1.Nest));
exports.WebhookNest = WebhookNest;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFbnZpcm9ubWVudH0gZnJvbSBcIi4uL2Vudmlyb25tZW50L2Vudmlyb25tZW50XCI7XG5pbXBvcnQgeyBOZXN0IH0gZnJvbSBcIi4vbmVzdFwiO1xuaW1wb3J0IHsgRmlsZUpvYiB9IGZyb20gXCIuLy4uL2pvYi9maWxlSm9iXCI7XG5pbXBvcnQge1dlYmhvb2tKb2J9IGZyb20gXCIuLi9qb2Ivd2ViaG9va0pvYlwiO1xuaW1wb3J0IHtXZWJob29rSW50ZXJmYWNlfSBmcm9tIFwiLi4vdWkvd2ViaG9va0ludGVyZmFjZVwiO1xuaW1wb3J0IHtJbnRlcmZhY2VNYW5hZ2VyfSBmcm9tIFwiLi4vdWkvaW50ZXJmYWNlTWFuYWdlclwiO1xuXG5jb25zdCAgIGh0dHAgPSByZXF1aXJlKFwiaHR0cFwiKTtcblxuZXhwb3J0IGNsYXNzIFdlYmhvb2tOZXN0IGV4dGVuZHMgTmVzdCB7XG5cbiAgICBwcm90ZWN0ZWQgX3BhdGg6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2h0dHBNZXRob2Q6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZVJlcXVlc3Q6IGFueTtcbiAgICBwcm90ZWN0ZWQgX3VpOiBXZWJob29rSW50ZXJmYWNlO1xuICAgIHByb3RlY3RlZCBfaW06IEludGVyZmFjZU1hbmFnZXI7XG4gICAgcHJvdGVjdGVkIF9ob2xkUmVzcG9uc2U6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXZWJob29rIE5lc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0gZVxuICAgICAqIEBwYXJhbSBwYXRoXG4gICAgICogQHBhcmFtIGh0dHBNZXRob2RcbiAgICAgKiBAcGFyYW0gaGFuZGxlUmVxdWVzdCAgICAgQ3VzdG9tIHJlcXVlc3QgaGFuZGxlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlOiBFbnZpcm9ubWVudCwgcGF0aDogc3RyaW5nfHN0cmluZ1tdLCBodHRwTWV0aG9kOiBzdHJpbmcsIGhhbmRsZVJlcXVlc3Q/OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoZSwgcGF0aC50b1N0cmluZygpKTtcbiAgICAgICAgbGV0IHdoID0gdGhpcztcbiAgICAgICAgd2gucGF0aCA9IHBhdGg7XG4gICAgICAgIHdoLmh0dHBNZXRob2QgPSBodHRwTWV0aG9kO1xuICAgICAgICBpZiAoaGFuZGxlUmVxdWVzdCkge1xuICAgICAgICAgICAgd2guY3VzdG9tSGFuZGxlUmVxdWVzdCA9IGhhbmRsZVJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbSA9IG5ldyBJbnRlcmZhY2VNYW5hZ2VyKHRoaXMuZSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2hvbGRSZXNwb25zZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBob2xkIHJlc3BvbnNlIGZsYWcuIFRoaXMgYWxsb3dzIHlvdSB0byBydW4gdHVubmVsIGxvZ2ljIGFuZCBzZW5kIHRoZSByZXNwb25zZSBhZnRlciBjb21wbGV0aW9uLlxuICAgICAqIFlvdSBtdXN0IGNhbGwgX3JlbGVhc2VSZXNwb25zZV8gbGF0ZXIgaWYgeW91IHVzZSB0aGlzLlxuICAgICAqIEBwYXJhbSBob2xkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGhvbGRSZXNwb25zZShob2xkUmVzcG9uc2U6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faG9sZFJlc3BvbnNlID0gaG9sZFJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaG9sZFJlc3BvbnNlIGZsYWcuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcHVibGljIGdldCBob2xkUmVzcG9uc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob2xkUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgdGhlIHdlYmhvb2sgcmVzcG9uc2Ugd2hlbiB0dW5uZWwgcnVuIGxvZ2ljIGlzIGNvbXBsZXRlLlxuICAgICAqIEBwYXJhbSBqb2Ige1dlYmhvb2tKb2J9ICAgICAgVGhlIHdlYmhvb2sgam9iIHRoYXQgdHJpZ2dlcmVkIHRoZSB3ZWJob29rIG5lc3QuXG4gICAgICogQHBhcmFtIG1lc3NhZ2Uge3N0cmluZ30gICAgICBUaGUgb3B0aW9uYWwgcmVzcG9uc2UgbWVzc2FnZSwgaWYgbm90IHVzaW5nIGEgY3VzdG9tIHJlcXVlc3QgaGFuZGxlci5cbiAgICAgKiAjIyMjIEV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIHZhciB3ZWJob29rID0gYWYuY3JlYXRlV2ViaG9va05lc3QoW1wiam9ic1wiLCBcInN1Ym1pdFwiXSwgXCJwb3N0XCIpO1xuICAgICAqIHdlYmhvb2suaG9sZFJlc3BvbnNlID0gdHJ1ZTsgLy8gS2VlcHMgdGhlIHJlc3BvbnNlIGZyb20gYmVpbmcgc2VudCBpbW1lZGlhdGVseVxuICAgICAqIHZhciB0dW5uZWwgPSBhZi5jcmVhdGVUdW5uZWwoXCJEd2lnaHQncyB0ZXN0IHR1bm5lbFwiKTtcbiAgICAgKiB0dW5uZWwud2F0Y2god2ViaG9vayk7XG4gICAgICogdHVubmVsLnJ1bihmdW5jdGlvbihqb2IsIG5lc3Qpe1xuICAgICAqICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAqICAgICAgICAgIG5lc3QucmVsZWFzZVJlc3BvbnNlKGpvYiwgXCJXb3JrZWQhXCIpOyAvLyBTZW5kcyByZXNwb25zZVxuICAgICAqICAgICAgfSwgMTUwMCk7IC8vIEFmdGVyIDEuNSBzZWNvbmRzXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2VSZXNwb25zZShqb2I6IFdlYmhvb2tKb2IsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHduID0gdGhpcztcbiAgICAgICAgaWYgKHduLmhvbGRSZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHduLmUubG9nKDMsIGBOZXN0IHJlc3BvbnNlcyBtdXN0IGJlIGhlbGQgdG8gcmVsZWFzZSBhIHJlc3BvbnNlLmAsIHduKTtcbiAgICAgICAgfSBlbHNlIGlmIChqb2IucmVzcG9uc2VTZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB3bi5lLmxvZygwLCBgTmVzdCByZXNwb25zZXMgd2FzIGFscmVhZHkgc2VudC4gU2tpcHBpbmcuYCwgd24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd24uZS5zZXJ2ZXIuc2VuZEhvb2tSZXNwb25zZShmYWxzZSwgam9iLCB3biwgam9iLnJlcXVlc3QsIGpvYi5yZXNwb25zZSwgd24uY3VzdG9tSGFuZGxlUmVxdWVzdCwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1c3RvbSBoYW5kbGVSZXF1ZXN0IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXN0b21IYW5kbGVSZXF1ZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1c3RvbSBoYW5kbGVyUmVxdWVzdCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gaGFuZGxlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgY3VzdG9tSGFuZGxlUmVxdWVzdChoYW5kbGVSZXF1ZXN0KSB7XG4gICAgICAgIGlmIChoYW5kbGVSZXF1ZXN0ICE9PSBudWxsICYmIHR5cGVvZiBoYW5kbGVSZXF1ZXN0ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93KFwiQ3VzdG9tIGhhbmRsZVJlcXVlc3QgbXVzdCBiZSBhIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oYW5kbGVSZXF1ZXN0ID0gaGFuZGxlUmVxdWVzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIF9wYXRoIGFzIGEgc3RyaW5nIG9yIGEgc3RyaW5nIGFycmF5LiBBbGwgcGFydHMgYXJlIFVSSSBlbmNvZGVkLlxuICAgICAqIENyZWF0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGFuIGFycmF5OiBbXCJvbmVcIiwgXCJ0d29cIl0gcmVzdWx0cyBpbiBcIi9vbmUvdHdvXCIuXG4gICAgICogQHBhcmFtIHBhdGhcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHBhdGgocGF0aDogYW55KSB7XG4gICAgICAgIGxldCB3aCA9IHRoaXM7XG4gICAgICAgIGxldCBtb2RpZmllZFBhdGggPSBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mKHBhdGgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBtb2RpZmllZFBhdGggPSBlbmNvZGVVUklDb21wb25lbnQocGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0aCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBwYXRoLmZvckVhY2goZnVuY3Rpb24ocGkpe1xuICAgICAgICAgICAgICAgIG1vZGlmaWVkUGF0aCArPSBcIi9cIiArIGVuY29kZVVSSUNvbXBvbmVudChwaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGBQYXRoIHNob3VsZCBiZSBhIHN0cmluZyBvciBhcnJheSwgJHt0eXBlb2YocGF0aCl9IGZvdW5kLmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkUGF0aC5jaGFyQXQoMCkgIT09IFwiL1wiKSB7XG4gICAgICAgICAgICBtb2RpZmllZFBhdGggPSBcIi9cIiArIG1vZGlmaWVkUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB3aC5fcGF0aCA9IG1vZGlmaWVkUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIF9wYXRoLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIGdldCBwYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEhUVFAgbWV0aG9kLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIGdldCBodHRwTWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cE1ldGhvZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIEhUVFAgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBodHRwTWV0aG9kXG4gICAgICovXG4gICAgcHVibGljIHNldCBodHRwTWV0aG9kKGh0dHBNZXRob2QpIHtcbiAgICAgICAgbGV0IGxvd2VyID0gaHR0cE1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgYWNjZXB0YWJsZU1ldGhvZHMgPSBbIFwiZ2V0XCIsIFwicG9zdFwiLCBcInB1dFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIiwgXCJvcHRpb25zXCIsIFwidHJhY2VcIiwgXCJjb3B5XCIsIFwibG9ja1wiLCBcIm1rY29sXCIsIFwibW92ZVwiLCBcInB1cmdlXCIsIFwicHJvcGZpbmRcIiwgXCJwcm9wcGF0Y2hcIiwgXCJ1bmxvY2tcIiwgXCJyZXBvcnRcIiwgXCJta2FjdGl2aXR5XCIsIFwiY2hlY2tvdXRcIiwgXCJtZXJnZVwiLCBcIm0tc2VhcmNoXCIsIFwibm90aWZ5XCIsIFwic3Vic2NyaWJlXCIsIFwidW5zdWJzY3JpYmVcIiwgXCJwYXRjaFwiLCBcInNlYXJjaFwiLCBcImNvbm5lY3RcIiwgXCJhbGxcIiBdO1xuICAgICAgICBpZiAoYWNjZXB0YWJsZU1ldGhvZHMuaW5kZXhPZihsb3dlcikgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBgSFRUUCBtZXRob2QgXCIke2xvd2VyfVwiIGlzIG5vdCBhbiBhY2NlcHRhYmxlIHZhbHVlLiAke0pTT04uc3RyaW5naWZ5KGFjY2VwdGFibGVNZXRob2RzKX1gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2h0dHBNZXRob2QgPSBsb3dlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIF9uYW1lLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBsb2FkLCBkbyBub3RoaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkKCkge31cblxuICAgIC8qKlxuICAgICAqIEFkZCB3ZWJob29rIHRvIHNlcnZlciB3YXRjaCBsaXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaCgpIHtcbiAgICAgICAgbGV0IHdoID0gdGhpcztcbiAgICAgICAgd2guZS5hZGRXZWJob29rKHdoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGpvYlxuICAgICAqIEBwYXJhbSBqb2JcbiAgICAgKi9cbiAgICBwdWJsaWMgYXJyaXZlKGpvYjogV2ViaG9va0pvYikge1xuICAgICAgICBzdXBlci5hcnJpdmUoam9iKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGludGVyZmFjZSBtYW5hZ2VyLiBVc2VkIHRvIG1hbmFnZSBpbnRlcmZhY2UgaW5zdGFuY2VzIGZvciBzZXNzaW9uIGhhbmRsaW5nLlxuICAgICAqIEByZXR1cm5zIHtJbnRlcmZhY2VNYW5hZ2VyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW50ZXJmYWNlTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltO1xuICAgIH1cblxufSJdfQ==