fsm.setupStates = function()

in lib/request.js [56:108]


fsm.setupStates = function () {
  var transition = async function transition(_, done) {
    var self = this;
    var origError = self.response.error;
    try {
      await self.emit(self._asm.currentState, async (err) => {
        if (err) {
          if (isTerminalState(self)) {
            throw err;
          } else {
            self.response.error = err;
            done(err);
          }
        } else {
          done(self.response.error);
        }
      });
    } catch (err) {
      if (isTerminalState(self)) {
        throw err;
      } else {
        self.response.error = err;
        done(err);
      }
    }
  };

  this.addState('restart', 'build', 'error', async function (err, done) {
    err = this.response.error;
    if (!err) return done();
    err.retryable = TableStore.DefaultRetryPolicy.shouldRetry(this.response.retryCount, this.response.error, this.response.request.operation);
    if (!err.retryable) return done(err);

    if (this.response.retryCount < TableStore.DefaultRetryPolicy.maxRetryTimes) {
      this.response.retryCount++;
      done();
    } else {
      done(err);
    }
  });
  this.addState('build', 'afterBuild', 'restart', transition);
  this.addState('afterBuild', 'sign', 'restart', transition);
  this.addState('sign', 'send', 'retry', transition);
  this.addState('retry', 'afterRetry', 'afterRetry', transition);
  this.addState('afterRetry', 'sign', 'error', transition);
  this.addState('send', 'validateResponse', 'retry', transition);
  this.addState('validateResponse', 'extractData', 'extractError', transition);
  this.addState('extractError', 'extractData', 'retry', transition);
  this.addState('extractData', 'success', 'retry', transition);
  this.addState('success', 'complete', 'complete', transition);
  this.addState('error', 'complete', 'complete', transition);
  this.addState('complete', null, null, transition);
};