"use strict"; let request = require("request"); let __slice = Array.prototype.slice; /** * Promisify a request method. * * @param {Function} fn * @return {Function} */ let promisifyRequestMethod = function (fn) { let context = this; return function () { let args = __slice.call(arguments); //Array.from(arguments) is not available. return new Promise(function (resolve, reject) { // Concatenate the callback manually to avoid array arguments from co. return fn.apply(context, args.concat(function (err) { if (err) { reject(err); } else { resolve.apply(this, __slice.call(arguments, 1)); } })); }); } }; /** * Promisify a request function. * * @param {Function} request * @return {Function} */ let promisifyRequest = function (request) { let fn = promisifyRequestMethod(request); // Regular request methods that don't need be promisified. fn.jar = request.jar; fn.cookie = request.cookie; // Attach all request methods. ["get", "patch", "post", "put", "head", "del"].forEach(function (method) { fn[method] = promisifyRequestMethod.call(request, request[method]); }); return fn; }; /** * Export a promisified request function. * * @type {Function} */ exports = module.exports = promisifyRequest(request); /** * Export the Request instance. * * @type {Function} */ exports.Request = request.Request; /** * Export the defaults method and return a promisified request instance. * * @return {Function} */ exports.defaults = function () { return promisifyRequest(request.defaults.apply(request, arguments)); }; /** * Export the forever agent method and return a promisified request instance. * * @return {Function} */ exports.forever = function () { return promisifyRequest(request.forever.apply(request, arguments)); };