@allgemein/http
Version:
Library for http request backend abstraction.
139 lines • 5.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpGotAdapter = void 0;
const url_1 = require("url");
const JsonUtils_1 = require("@allgemein/base/utils/JsonUtils");
const RequestError_1 = require("../../../libs/errors/RequestError");
const TimeoutError_1 = require("../../../libs/errors/TimeoutError");
const lodash_1 = require("lodash");
class HttpGotAdapter {
constructor() {
this.name = 'got';
}
static wrap(url, method, options) {
const GOT = this.GOT;
if ((0, lodash_1.has)(options, 'passBody')) {
options.resolveBodyOnly = (0, lodash_1.get)(options, 'passBody', false);
}
if ((0, lodash_1.has)(options, 'proxy') && options.proxy && HttpGotAdapter.ProxyAgent) {
const proxyHeaders = options.proxyHeaders || {};
const proxyUrl = new url_1.URL(options.proxy);
const hostName = proxyUrl.hostname;
const port = parseInt(proxyUrl.port, 0);
const tunnelOptions = {
protocol: proxyUrl.protocol,
host: hostName,
port: port,
headers: proxyHeaders
};
if ((0, lodash_1.has)(options, 'rejectUnauthorized')) {
tunnelOptions.rejectUnauthorized = options.rejectUnauthorized;
}
const agent = new HttpGotAdapter.ProxyAgent(tunnelOptions);
options.agent = {};
options.agent[proxyUrl.protocol.replace(':', '')] = agent;
}
else if ((0, lodash_1.has)(options, 'proxy') && options.proxy && !HttpGotAdapter.ProxyAgent) {
throw new Error('proxy agent not imported');
}
if ((0, lodash_1.has)(options, 'stream') && (0, lodash_1.get)(options, 'stream', false)) {
const stream = GOT.stream(url, options);
stream._ended = false;
stream.once('response', (res) => {
res.once('end', () => {
stream._ended = true;
stream.emit('finished');
});
});
stream.asPromise = () => {
return new Promise((resolve, reject) => {
if (!stream._ended) {
stream.once('finished', () => {
resolve(null);
});
stream.once('error', (err) => {
reject(err);
});
}
else {
resolve(null);
}
});
};
return stream;
}
if ((0, lodash_1.has)(options, 'body') && (0, lodash_1.isObjectLike)(options['body'])) {
options['body'] = JsonUtils_1.JsonUtils.stringify(options['body']);
}
let p = null;
if (options) {
p = GOT[method](url, options);
}
else {
p = GOT[method](url);
}
if ((0, lodash_1.get)(options, 'passBody', false)) {
p = p.then((res) => {
if (options.responseType === 'json') {
return res;
}
return res.body;
});
}
return p.catch((err) => {
if (err.name === 'RequestError') {
const e = new RequestError_1.RequestError(err.message);
(0, lodash_1.assign)(e, err);
throw e;
}
else if (err.name === 'TimeoutError') {
const e = new TimeoutError_1.TimeoutError(err.message);
(0, lodash_1.assign)(e, err);
throw e;
}
throw err;
});
}
isAvailable(logger) {
try {
if (!HttpGotAdapter.GOT) {
HttpGotAdapter.GOT = require('got');
try {
HttpGotAdapter.ProxyAgent = require('proxy-agent');
}
catch (e) {
if (logger) {
logger.warn('http got adapter: proxing not possible package proxy-agent missing.');
}
}
}
return true;
}
catch (e) {
if (logger) {
logger.warn('http got adapter: required got package is not installed. Adapter will not be used.');
}
return false;
}
}
get(url, options) {
return HttpGotAdapter.wrap(url, 'get', options);
}
post(url, options) {
return HttpGotAdapter.wrap(url, 'post', options);
}
put(url, options) {
return HttpGotAdapter.wrap(url, 'put', options);
}
delete(url, options) {
return HttpGotAdapter.wrap(url, 'delete', options);
}
head(url, options) {
return HttpGotAdapter.wrap(url, 'head', options);
}
patch(url, options) {
return HttpGotAdapter.wrap(url, 'patch', options);
}
}
exports.HttpGotAdapter = HttpGotAdapter;
//# sourceMappingURL=HttpGotAdapter.js.map