twitst4tz

twitter statistics web application
Log | Files | Refs | README | LICENSE

index.js (1399B)


      1 
      2 /**
      3  * Expose `Backoff`.
      4  */
      5 
      6 module.exports = Backoff;
      7 
      8 /**
      9  * Initialize backoff timer with `opts`.
     10  *
     11  * - `min` initial timeout in milliseconds [100]
     12  * - `max` max timeout [10000]
     13  * - `jitter` [0]
     14  * - `factor` [2]
     15  *
     16  * @param {Object} opts
     17  * @api public
     18  */
     19 
     20 function Backoff(opts) {
     21   opts = opts || {};
     22   this.ms = opts.min || 100;
     23   this.max = opts.max || 10000;
     24   this.factor = opts.factor || 2;
     25   this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;
     26   this.attempts = 0;
     27 }
     28 
     29 /**
     30  * Return the backoff duration.
     31  *
     32  * @return {Number}
     33  * @api public
     34  */
     35 
     36 Backoff.prototype.duration = function(){
     37   var ms = this.ms * Math.pow(this.factor, this.attempts++);
     38   if (this.jitter) {
     39     var rand =  Math.random();
     40     var deviation = Math.floor(rand * this.jitter * ms);
     41     ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;
     42   }
     43   return Math.min(ms, this.max) | 0;
     44 };
     45 
     46 /**
     47  * Reset the number of attempts.
     48  *
     49  * @api public
     50  */
     51 
     52 Backoff.prototype.reset = function(){
     53   this.attempts = 0;
     54 };
     55 
     56 /**
     57  * Set the minimum duration
     58  *
     59  * @api public
     60  */
     61 
     62 Backoff.prototype.setMin = function(min){
     63   this.ms = min;
     64 };
     65 
     66 /**
     67  * Set the maximum duration
     68  *
     69  * @api public
     70  */
     71 
     72 Backoff.prototype.setMax = function(max){
     73   this.max = max;
     74 };
     75 
     76 /**
     77  * Set the jitter
     78  *
     79  * @api public
     80  */
     81 
     82 Backoff.prototype.setJitter = function(jitter){
     83   this.jitter = jitter;
     84 };
     85