request-plus
Version:
advanced promisified http client with retries, EventEmitter, cache-manager, prom-client and logging
64 lines (56 loc) • 2 kB
JavaScript
;
/**
* @param {Function} requester
* @param {Object} [opts]
* @param {function(eventName, uri)} [opts.prefix] - generate log prefix
* @param {function(data...)} [opts.loggers.info=console.info] - used for stdout logging (not erros)
* @param {function(data...)} [opts.loggers.error=console.error] - used to log errors
* @param {'info'|'error'|function(event)} [opts.events.[eventName]] - describes what happens for each eventName
*/
module.exports = function(requester, opts) {
opts = typeof opts === 'object' ? opts : {};
if (!(requester.plus && requester.plus.emitter)) {
throw new Error('log requires an event emitter to be initialized first');
}
const prefixFunc = opts.prefix || (eventName => '[' + eventName + ']');
const loggers = opts.loggers || {
info: function(eventName, uri) {
console.info(prefixFunc(eventName), uri);
},
error: function(eventName, uri) {
console.error(prefixFunc(eventName), uri);
},
warn: function(eventName, uri) {
console.warn(prefixFunc(eventName), uri);
},
};
const events = opts.events || {
request: 'info',
response: 'info',
fail: 'error',
retryFail: 'error'
};
const emitter = requester.plus.emitter;
for (let eventName in events) {
if (typeof events[eventName] === 'string') {
if (!loggers[events[eventName]]) {
throw new Error('log action "' + events[eventName] + '"'
+ ' registered for event "' + eventName + '"'
+ ' but no logger is registered for this lo action'
);
}
emitter.on(eventName, function() {
const args = Array.prototype.slice.call(arguments);
args.unshift(eventName);
loggers[events[eventName]].apply(null, args);
});
} else {
emitter.on(eventName, function() {
const args = Array.prototype.slice.call(arguments);
args.unshift(eventName);
events[eventName].apply(null, args);
});
}
}
return requester;
};