1 | function AcceptorStateMachine(states, state) {
|
2 | this.currentState = state || null;
|
3 | this.states = states || {};
|
4 | }
|
5 |
|
6 | AcceptorStateMachine.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 |
|
30 | AcceptorStateMachine.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 |
|
44 |
|
45 | module.exports = AcceptorStateMachine;
|