traxxx/src/utils/http.js

90 lines
1.7 KiB
JavaScript
Raw Normal View History

'use strict';
const config = require('config');
const tunnel = require('tunnel');
const bhttp = require('bhttp');
const taskQueue = require('promise-task-queue');
const logger = require('../logger')(__filename);
const proxyAgent = tunnel.httpsOverHttp({
proxy: {
host: config.proxy.host,
port: config.proxy.port,
},
});
function useProxy(url) {
if (!config.proxy.enable) {
return false;
}
const { hostname } = new URL(url);
return config.proxy.hostnames.includes(hostname);
}
const queue = taskQueue();
queue.on('concurrencyReached:httpGet', () => {
logger.silly('Queueing GET requests');
});
queue.on('concurrencyReached:httpPost', () => {
logger.silly('Queueing POST requests');
});
queue.define('http', async ({
url,
method = 'GET',
body,
timeout = 30000,
options = {},
}) => {
if (body) {
logger.silly(`${method.toUpperCase()} ${url} with ${body}`);
} else {
logger.silly(`${method.toUpperCase()} ${url}`);
}
const reqOptions = {
responseTimeout: timeout,
...options,
};
if (useProxy(url)) {
reqOptions.agent = proxyAgent;
}
const res = ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())
? await bhttp[method.toLowerCase()](url, body, reqOptions)
: await bhttp[method.toLowerCase()](url, reqOptions);
return {
...res,
code: res.statusCode,
};
}, {
concurrency: 20,
});
async function get(url, options) {
return queue.push('http', {
method: 'get',
url,
options,
});
}
async function post(url, body, options) {
return queue.push('http', {
url,
body,
options,
});
}
module.exports = {
get,
post,
};