request-plus
Version:
advanced promisified http client with retries, EventEmitter, cache-manager, prom-client and logging
48 lines (43 loc) • 1.35 kB
JavaScript
;
// mergeDeep taken from http://stackoverflow.com/a/37164538/167219
// to avoid extra dependency
// difference: it has no validation if inputs are objects (because they are)
function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}
function mergeDeep(target, source) {
const output = Object.assign({}, target);
Object.keys(source).forEach(key => {
if (isObject(source[key])) {
if (!(key in target)) {
Object.assign(output, {[key]: source[key]});
} else {
output[key] = mergeDeep(target[key], source[key]);
}
} else {
Object.assign(output, {[key]: source[key]});
}
});
return output;
}
/**
* @param {Function} requester
* @param {Object} [opts]
* @param {EventEmitter} [opts.emitter]
*/
module.exports = function(requester, defaults) {
if (typeof defaults !== 'object') {
throw new Error('defaults object expected, type ' + typeof defaults + ' provided');
}
return function me(uri, requestOptions, callback) {
if (typeof requestOptions === 'object') {
requestOptions = mergeDeep(defaults, requestOptions);
} else {
if (typeof uri === 'string') {
uri = {uri};
}
uri = mergeDeep(defaults, uri);
}
return requester(uri, requestOptions, callback);
};
};