state_machine.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. function AcceptorStateMachine(states, state) {
  2. this.currentState = state || null;
  3. this.states = states || {};
  4. }
  5. AcceptorStateMachine.prototype.runTo = function runTo(finalState, done, bindObject, inputError) {
  6. if (typeof finalState === 'function') {
  7. inputError = bindObject; bindObject = done;
  8. done = finalState; finalState = null;
  9. }
  10. var self = this;
  11. var state = self.states[self.currentState];
  12. state.fn.call(bindObject || self, inputError, function(err) {
  13. if (err) {
  14. if (state.fail) self.currentState = state.fail;
  15. else return done ? done.call(bindObject, err) : null;
  16. } else {
  17. if (state.accept) self.currentState = state.accept;
  18. else return done ? done.call(bindObject) : null;
  19. }
  20. if (self.currentState === finalState) {
  21. return done ? done.call(bindObject, err) : null;
  22. }
  23. self.runTo(finalState, done, bindObject, err);
  24. });
  25. };
  26. AcceptorStateMachine.prototype.addState = function addState(name, acceptState, failState, fn) {
  27. if (typeof acceptState === 'function') {
  28. fn = acceptState; acceptState = null; failState = null;
  29. } else if (typeof failState === 'function') {
  30. fn = failState; failState = null;
  31. }
  32. if (!this.currentState) this.currentState = name;
  33. this.states[name] = { accept: acceptState, fail: failState, fn: fn };
  34. return this;
  35. };
  36. /**
  37. * @api private
  38. */
  39. module.exports = AcceptorStateMachine;