finitestatemachine
A finite state machine built to use as a mechanism to feed other/larger components. JavaScript performance oriented.
Notes
Universal module defined to be used with requirejs, node, commonjs, or global scoped if no module loader is used.
- All files in the dist folder are minified for production use.
- All files in the src directory are the source code for development use.
- Packages point at the dist minified code with source maps.
Development
Requirements
- nodejs
- npm install
- npm install -g gulp
Test
gulp test
Gulp Commands
Each process is dependent upon the previous. If one fails the build process exits.
- gulp
- gulp test (Unit specifications)
- gulp build (Test, folder clean-ups, minification, source maps, renaming)
- gulp deploy (Test, build, versioning)
Usage
Installation
npm: npm install finitestatemachine
bower: bower install finitestatemachine
How to use...
var stateExample = {
enter: function() {},
leave: function() {},
events: { // Optional
'event': 'State',
},
transitions: {
beforeEnter: function() {}, // Optional
beforeEnterFromStill: function() {},// Optional
leaveToWalking: function() {}, // Optional
}
};
var movementStates = {
'Still': {
enter: function() {
console.log('Standing Still.');
},
leave: function() {
console.log('Leaving \'Still\'.');
},
transitions: {
beforeEnter: function() {
console.log('Transitioning to \'Still\'.');
}
},
events: {
'move': 'Walking',
'sprint': 'Running'
}
},
'Walking': {
enter: function() {
console.log('Walking.');
},
leave: function() {
console.log('Leaving \'Walking\'.');
},
transitions: {
beforeEnter: function() {
console.log('Transitioning to \'Walking\'.');
}
},
events: {
'move': 'Running',
'sprint': 'Running',
'relax': 'Still',
'stop': 'Still'
}
},
'Running': {
enter: function() {
console.log('Running.');
},
leave: function() {
console.log('Leaving \'Running\'.');
},
transitions: {
beforeEnterFromWalking: function() {
console.log('Enter \'Running\' from \'Walking\'.');
},
leaveToStill: function() {
console.log('Leave \'Running\' to \'Still\'.');
}
},
events: {
'relax': 'Walking',
'stop': 'Still'
}
}
}
var listener1 = function(data) {
console.log('State change listener!');
console.log(JSON.stringify(data));
};
var movementStateManager = new FiniteStateMachine(this);
console.log('Adding states.');
movementStateManager.initialize(movementStates, 'Still');
console.log('Initial state: ' + movementStateManager.getCurrentStateId());
console.log('Handle event: move');
movementStateManager.handleEvent('move');
console.log('Handle event: move');
movementStateManager.handleEvent('relax');
console.log('Handle event: move');
movementStateManager.handleEvent('sprint');
console.log('Handle event: move');
movementStateManager.handleEvent('relax');
Release Notes
v2.1.5
- See statemanager package release notes.
v2.1.0
- See statemanager package release notes.
v2.0.0
Breaking Changes...
- Complete rework.
- Built on top of my StateManager (npm/bower install statemanager). A machine is meant to have managers so this makes more sense and extracts reusable functionality.
- handleStateEvent() is now handleEvent().
Additional Changes...
- Added getPreviousState() to fetch the previous state.
- Changed global variable name to FiniteStateMachine but kept support for global FSM if one doesn't exist to avoid confilcts.
v1.2.0
- Added ability to reset to the initial state.
v1.1.5
-
Added ability to pass data to handleStateEvent(event, data), changeState(state, data), and triggerChangeEvents(event, data). This allows for the data to be distributed to all change event listeners.
Ex. var listener = function(event){ console.log(event.event); console.log(event.from); console.log(event.to); console.log(event.data); // Can be anything but typcially would be an object. }
v1.0.4
Bug Fixes...
- Fixed sourcemap linking for minified files. This is also fixed as part of the build process to automate proper sourcemap creation and linking.
v1.0.2
Breaking Changes...
- Removed ability for addStates' states parameter to be optional.
v1.0.1
Breaking Changes...
- setCurrentState no longer tiggers the change events. Use triggerChangeEvents to explicity trigger events for the current state.
- changeState has been deprecated to handleStateEvent.
- changeState now takes a state as the parameter, changes the current state, and triggers the change events with the event.event data being undefined.
- Previous state remains undefined until the state changes after initial state.
Additional Changes...
- Added getPreviousState() to fetch the previous state.
- Changed global variable name to FiniteStateMachine but kept support for global FSM if one doesn't exist to avoid confilcts.