UNPKG

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