backoff.js

- Jump To … +
  index.js backoff.js function_call.js exponential.js fibonacci.js strategy.js

- # backoff.js

- ¶

       Copyright (c) 2012 Mathieu Turcotte
       Licensed under the MIT license.

      var events = require('events');
      var precond = require('precond');
      var util = require('util');

- ¶

  A class to hold the state of a backoff operation. Accepts a backoff strategy to generate the backoff delays.

      function Backoff(backoffStrategy) {
          events.EventEmitter.call(this);

          this.backoffStrategy_ = backoffStrategy;
          this.maxNumberOfRetry_ = -1;
          this.backoffNumber_ = 0;
          this.backoffDelay_ = 0;
          this.timeoutID_ = -1;

          this.handlers = {
              backoff: this.onBackoff_.bind(this)
          };
      }
      util.inherits(Backoff, events.EventEmitter);

- ¶

  Sets a limit, greater than 0, on the maximum number of backoffs. A ‘fail’ event will be emitted when the limit is reached.

      Backoff.prototype.failAfter = function(maxNumberOfRetry) {
          precond.checkArgument(maxNumberOfRetry > 0,
              'Expected a maximum number of retry greater than 0 but got %s.',
              maxNumberOfRetry);

          this.maxNumberOfRetry_ = maxNumberOfRetry;
      };

- ¶

  Starts a backoff operation. Accepts an optional parameter to let the listeners know why the backoff operation was started.

      Backoff.prototype.backoff = function(err) {
          precond.checkState(this.timeoutID_ === -1, 'Backoff in progress.');

          if (this.backoffNumber_ === this.maxNumberOfRetry_) {
              this.emit('fail', err);
              this.reset();
          } else {
              this.backoffDelay_ = this.backoffStrategy_.next();
              this.timeoutID_ = setTimeout(this.handlers.backoff, this.backoffDelay_);
              this.emit('backoff', this.backoffNumber_, this.backoffDelay_, err);
          }
      };

- ¶

  Handles the backoff timeout completion.

      Backoff.prototype.onBackoff_ = function() {
          this.timeoutID_ = -1;
          this.emit('ready', this.backoffNumber_, this.backoffDelay_);
          this.backoffNumber_++;
      };

- ¶

  Stops any backoff operation and resets the backoff delay to its inital value.

      Backoff.prototype.reset = function() {
          this.backoffNumber_ = 0;
          this.backoffStrategy_.reset();
          clearTimeout(this.timeoutID_);
          this.timeoutID_ = -1;
      };

      module.exports = Backoff;