| var STARTING_BACK_OFF = 0; |
| |
| function randomNumber(min, max) { |
| min = parseInt(min, 10) || 0; |
| max = parseInt(max, 10); |
| if (max !== max || max <= min) { |
| max = (min || 1) << 1; //doubling |
| } else { |
| max = max + 1; |
| } |
| var ratio = Math.random(); |
| var range = max - min; |
| |
| return ~~(range * ratio + min); // ~~ coerces to an int, but fast. |
| } |
| |
| function defaultBackOff(min) { |
| var max = 0; |
| if (!min) { |
| max = 2000; |
| } |
| return randomNumber(min, max); |
| } |
| |
| function backOff(opts, returnValue, error, callback) { |
| if (opts.retry === false) { |
| returnValue.emit('error', error); |
| returnValue.removeAllListeners(); |
| return; |
| } |
| if (typeof opts.back_off_function !== 'function') { |
| opts.back_off_function = defaultBackOff; |
| } |
| returnValue.emit('requestError', error); |
| if (returnValue.state === 'active' || returnValue.state === 'pending') { |
| returnValue.emit('paused', error); |
| returnValue.state = 'stopped'; |
| returnValue.once('active', function () { |
| opts.current_back_off = STARTING_BACK_OFF; |
| }); |
| } |
| |
| opts.current_back_off = opts.current_back_off || STARTING_BACK_OFF; |
| opts.current_back_off = opts.back_off_function(opts.current_back_off); |
| setTimeout(callback, opts.current_back_off); |
| } |
| |
| export default backOff; |