UNPKG

antfarm

Version:

File automation framework for ants.

187 lines (185 loc) 16.1 kB
"use strict"; 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 job_1 = require("./job"); var fileJob_1 = require("./fileJob"); var fs = require("fs"), tmp = require("tmp"), url = require("url"), path = require("path"), _ = require("lodash"); /** * A job that is triggered when a webhook receives a request. */ var WebhookJob = (function (_super) { __extends(WebhookJob, _super); /** * WebhookJob constructor * @param e * @param request * @param response */ function WebhookJob(e, request, response) { _super.call(this, e, "Webhook Job"); this._request = request; this._response = response; this._responseSent = false; } Object.defineProperty(WebhookJob.prototype, "responseSent", { /** * Get if the response to the webhook was already sent or not. * @returns {boolean} */ get: function () { return this._responseSent; }, /** * Set if the response to the webhook was already sent or not. * @param sent */ set: function (sent) { this._responseSent = sent; }, enumerable: true, configurable: true }); Object.defineProperty(WebhookJob.prototype, "response", { /** * Get the HTTP response object. * @returns {ClientResponse} */ get: function () { return this._response; }, enumerable: true, configurable: true }); Object.defineProperty(WebhookJob.prototype, "request", { /** * Get the HTTP request object. * @returns {ClientRequest} */ get: function () { return this._request; }, enumerable: true, configurable: true }); /** * Return a specific URL parameter. * #### Example * ```js * // Webhook URL: /hooks/my/hook?customer_id=MyCust * var customer_id = webhookJob.getUrlParameter("customer_id"); * // customer_id => MyCust * ``` * @param parameter * @returns {any} */ WebhookJob.prototype.getQueryStringValue = function (parameter) { var wh = this; var url_parts = url.parse(wh.request.url, true); return url_parts.query[parameter]; }; /** * Return all URl parameters. * * #### Example * ```js * // Webhook URL: /hooks/my/hook?customer_id=MyCust&file_name=MyFile.zip * var query = webhookJob.getUrlParameters(); * // query => {customer_id: "MyCust", file_name: "MyFile.zip"} * ``` * @returns {any} */ WebhookJob.prototype.getQueryStringValues = function () { var wh = this; var url_parts = url.parse(wh.request.url, true); return url_parts.query; }; /** * Returns FileJobs made from _files sent via FormData to the webhook. * @returns {FileJob[]} */ WebhookJob.prototype.getFormDataFiles = function () { var wh = this; var files = wh.request.files; var jobs = []; if (files) { files.forEach(function (file) { var job = new fileJob_1.FileJob(wh.e, file.path); job.rename(file.originalname); jobs.push(job); }); } return jobs; }; /** * Get all FormData values. * @returns {any} */ WebhookJob.prototype.getFormDataValues = function () { var wh = this; var body = wh.request.body; return body; }; /** * Get a single FormData value. * @param key * @returns {any} */ WebhookJob.prototype.getFormDataValue = function (key) { var wh = this; var formData = wh.getFormDataValues(); if (formData && key in formData) { return formData[key]; } else { return false; } }; /** * Get a string from the request body. * The given callback is given a string parameter. * #### Example * ```js * webhookJob.getDataAsString(function(requestBody){ * console.log(requestBody); * }); * ``` * @param callback */ WebhookJob.prototype.getDataAsString = function (callback) { var wh = this; var req = wh.request; var data = ""; req.on("data", function (chunk) { data += chunk; }); req.on("end", function () { callback(data); }); }; /** * Returns an array of parameters from both the query string and form-data. */ WebhookJob.prototype.getParameters = function () { var wh = this; return _.merge(wh.getQueryStringValues(), wh.getFormDataValues()); }; /** * Returns a parameter from both the query string and form-data. * @param key * @returns {any} */ WebhookJob.prototype.getParameter = function (key) { var wh = this; if (_.has(wh.getParameters(), key)) { return wh.getParameters()[key]; } else { return false; } }; return WebhookJob; }(job_1.Job)); exports.WebhookJob = WebhookJob; //# sourceMappingURL=data:application/json;charset=utf8;base64,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aUIsRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQ0FBWSxHQUFuQixVQUFvQixHQUFXO1FBQzNCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUNkLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFFTCxpQkFBQztBQUFELENBakxBLEFBaUxDLENBakwrQixTQUFHLEdBaUxsQztBQWpMWSxrQkFBVSxhQWlMdEIsQ0FBQSIsImZpbGUiOiJsaWIvam9iL3dlYmhvb2tKb2IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Vudmlyb25tZW50fSBmcm9tIFwiLi4vZW52aXJvbm1lbnQvZW52aXJvbm1lbnRcIjtcbmltcG9ydCB7Sm9ifSBmcm9tIFwiLi9qb2JcIjtcbmltcG9ydCB7RmlsZUpvYn0gZnJvbSBcIi4vZmlsZUpvYlwiO1xuaW1wb3J0IGV4cHJlc3MgPSByZXF1aXJlKFwiZXhwcmVzc1wiKTtcblxuY29uc3QgICBmcyA9IHJlcXVpcmUoXCJmc1wiKSxcbiAgICAgICAgdG1wID0gcmVxdWlyZShcInRtcFwiKSxcbiAgICAgICAgdXJsID0gcmVxdWlyZShcInVybFwiKSxcbiAgICAgICAgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLFxuICAgICAgICBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuLyoqXG4gKiBBIGpvYiB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIGEgd2ViaG9vayByZWNlaXZlcyBhIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJob29rSm9iIGV4dGVuZHMgSm9iIHtcblxuICAgIHByb3RlY3RlZCBfcmVxdWVzdDtcbiAgICBwcm90ZWN0ZWQgX3Jlc3BvbnNlO1xuICAgIHByb3RlY3RlZCBfcmVzcG9uc2VTZW50OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2ViaG9va0pvYiBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBlXG4gICAgICogQHBhcmFtIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlOiBFbnZpcm9ubWVudCwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIoZSwgXCJXZWJob29rIEpvYlwiKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlU2VudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpZiB0aGUgcmVzcG9uc2UgdG8gdGhlIHdlYmhvb2sgd2FzIGFscmVhZHkgc2VudCBvciBub3QuXG4gICAgICogQHBhcmFtIHNlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJlc3BvbnNlU2VudChzZW50OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlU2VudCA9IHNlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGlmIHRoZSByZXNwb25zZSB0byB0aGUgd2ViaG9vayB3YXMgYWxyZWFkeSBzZW50IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc3BvbnNlU2VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlU2VudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEhUVFAgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtDbGllbnRSZXNwb25zZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBIVFRQIHJlcXVlc3Qgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtDbGllbnRSZXF1ZXN0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgc3BlY2lmaWMgVVJMIHBhcmFtZXRlci5cbiAgICAgKiAjIyMjIEV4YW1wbGVcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFdlYmhvb2sgVVJMOiAvaG9va3MvbXkvaG9vaz9jdXN0b21lcl9pZD1NeUN1c3RcbiAgICAgKiB2YXIgY3VzdG9tZXJfaWQgPSB3ZWJob29rSm9iLmdldFVybFBhcmFtZXRlcihcImN1c3RvbWVyX2lkXCIpO1xuICAgICAqIC8vIGN1c3RvbWVyX2lkID0+IE15Q3VzdFxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWVyeVN0cmluZ1ZhbHVlKHBhcmFtZXRlcjogc3RyaW5nKSB7XG4gICAgICAgIGxldCB3aCA9IHRoaXM7XG4gICAgICAgIGxldCB1cmxfcGFydHMgPSB1cmwucGFyc2Uod2gucmVxdWVzdC51cmwsIHRydWUpO1xuICAgICAgICByZXR1cm4gdXJsX3BhcnRzLnF1ZXJ5W3BhcmFtZXRlcl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCBVUmwgcGFyYW1ldGVycy5cbiAgICAgKiAqICMjIyMgRXhhbXBsZVxuICAgICAqIGBgYGpzXG4gICAgICogLy8gV2ViaG9vayBVUkw6IC9ob29rcy9teS9ob29rP2N1c3RvbWVyX2lkPU15Q3VzdCZmaWxlX25hbWU9TXlGaWxlLnppcFxuICAgICAqIHZhciBxdWVyeSA9IHdlYmhvb2tKb2IuZ2V0VXJsUGFyYW1ldGVycygpO1xuICAgICAqIC8vIHF1ZXJ5ID0+IHtjdXN0b21lcl9pZDogXCJNeUN1c3RcIiwgZmlsZV9uYW1lOiBcIk15RmlsZS56aXBcIn1cbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWVyeVN0cmluZ1ZhbHVlcygpIHtcbiAgICAgICAgbGV0IHdoID0gdGhpcztcbiAgICAgICAgbGV0IHVybF9wYXJ0cyA9IHVybC5wYXJzZSh3aC5yZXF1ZXN0LnVybCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB1cmxfcGFydHMucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBGaWxlSm9icyBtYWRlIGZyb20gX2ZpbGVzIHNlbnQgdmlhIEZvcm1EYXRhIHRvIHRoZSB3ZWJob29rLlxuICAgICAqIEByZXR1cm5zIHtGaWxlSm9iW119XG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1EYXRhRmlsZXMoKSB7XG4gICAgICAgIGxldCB3aCA9IHRoaXM7XG4gICAgICAgIGxldCBmaWxlcyA9IHdoLnJlcXVlc3QuZmlsZXM7XG4gICAgICAgIGxldCBqb2JzID0gW107XG5cbiAgICAgICAgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpe1xuICAgICAgICAgICAgICAgIGxldCBqb2IgPSBuZXcgRmlsZUpvYih3aC5lLCBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIGpvYi5yZW5hbWUoZmlsZS5vcmlnaW5hbG5hbWUpO1xuICAgICAgICAgICAgICAgIGpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gam9icztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIEZvcm1EYXRhIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtRGF0YVZhbHVlcygpIHtcbiAgICAgICAgbGV0IHdoID0gdGhpcztcbiAgICAgICAgbGV0IGJvZHkgPSB3aC5yZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc2luZ2xlIEZvcm1EYXRhIHZhbHVlLlxuICAgICAqIEBwYXJhbSBrZXlcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtRGF0YVZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgICAgIGxldCB3aCA9IHRoaXM7XG4gICAgICAgIGxldCBmb3JtRGF0YSA9IHdoLmdldEZvcm1EYXRhVmFsdWVzKCk7XG5cbiAgICAgICAgaWYgKGZvcm1EYXRhICYmIGtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgcmVxdWVzdCBib2R5LlxuICAgICAqIFRoZSBnaXZlbiBjYWxsYmFjayBpcyBnaXZlbiBhIHN0cmluZyBwYXJhbWV0ZXIuXG4gICAgICogIyMjIyBFeGFtcGxlXG4gICAgICogYGBganNcbiAgICAgKiB3ZWJob29rSm9iLmdldERhdGFBc1N0cmluZyhmdW5jdGlvbihyZXF1ZXN0Qm9keSl7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlcXVlc3RCb2R5KTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YUFzU3RyaW5nKGNhbGxiYWNrOiBhbnkpIHtcbiAgICAgICAgbGV0IHdoID0gdGhpcztcbiAgICAgICAgbGV0IHJlcSA9IHdoLnJlcXVlc3Q7XG4gICAgICAgIGxldCBkYXRhID0gXCJcIjtcblxuICAgICAgICByZXEub24oXCJkYXRhXCIsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwiZW5kXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmcm9tIGJvdGggdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZm9ybS1kYXRhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCkge1xuICAgICAgICBsZXQgd2ggPSB0aGlzO1xuICAgICAgICByZXR1cm4gXy5tZXJnZSh3aC5nZXRRdWVyeVN0cmluZ1ZhbHVlcygpLCB3aC5nZXRGb3JtRGF0YVZhbHVlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcGFyYW1ldGVyIGZyb20gYm90aCB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmb3JtLWRhdGEuXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlcihrZXk6IHN0cmluZykge1xuICAgICAgICBsZXQgd2ggPSB0aGlzO1xuICAgICAgICBpZiAoXy5oYXMod2guZ2V0UGFyYW1ldGVycygpLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2guZ2V0UGFyYW1ldGVycygpW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iXX0=