62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Packages
 | 
						|
var retrier = require('retry');
 | 
						|
 | 
						|
function retry(fn, opts) {
 | 
						|
  function run(resolve, reject) {
 | 
						|
    var options = opts || {};
 | 
						|
    var op;
 | 
						|
 | 
						|
    // Default `randomize` to true
 | 
						|
    if (!('randomize' in options)) {
 | 
						|
      options.randomize = true;
 | 
						|
    }
 | 
						|
 | 
						|
    op = retrier.operation(options);
 | 
						|
 | 
						|
    // We allow the user to abort retrying
 | 
						|
    // this makes sense in the cases where
 | 
						|
    // knowledge is obtained that retrying
 | 
						|
    // would be futile (e.g.: auth errors)
 | 
						|
 | 
						|
    function bail(err) {
 | 
						|
      reject(err || new Error('Aborted'));
 | 
						|
    }
 | 
						|
 | 
						|
    function onError(err, num) {
 | 
						|
      if (err.bail) {
 | 
						|
        bail(err);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      if (!op.retry(err)) {
 | 
						|
        reject(op.mainError());
 | 
						|
      } else if (options.onRetry) {
 | 
						|
        options.onRetry(err, num);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    function runAttempt(num) {
 | 
						|
      var val;
 | 
						|
 | 
						|
      try {
 | 
						|
        val = fn(bail, num);
 | 
						|
      } catch (err) {
 | 
						|
        onError(err, num);
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      Promise.resolve(val)
 | 
						|
        .then(resolve)
 | 
						|
        .catch(function catchIt(err) {
 | 
						|
          onError(err, num);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    op.attempt(runAttempt);
 | 
						|
  }
 | 
						|
 | 
						|
  return new Promise(run);
 | 
						|
}
 | 
						|
 | 
						|
module.exports = retry;
 |