A library for finite state machines.
VERSION 3.0 Is a significant rewrite from earlier versions. Existing 2.x users should be sure to read the Upgrade Guide.
In a browser:
<scriptsrc='state-machine.js'></script>after downloading the source or the minified version
Using npm:
npm install --save-dev javascript-state-machineIn Node.js:
varStateMachine=require('javascript-state-machine');A state machine can be constructed using:
varfsm=newStateMachine({init: 'solid',transitions: [{name: 'melt',from: 'solid',to: 'liquid'},{name: 'freeze',from: 'liquid',to: 'solid'},{name: 'vaporize',from: 'liquid',to: 'gas'},{name: 'condense',from: 'gas',to: 'liquid'}],methods: {onMelt: function(){console.log('I melted')},onFreeze: function(){console.log('I froze')},onVaporize: function(){console.log('I vaporized')},onCondense: function(){console.log('I condensed')}}});... which creates an object with a current state property:
fsm.state
... methods to transition to a different state:
fsm.melt()fsm.freeze()fsm.vaporize()fsm.condense()
... observer methods called automatically during the lifecycle of a transition:
onMelt()onFreeze()onVaporize()onCondense()
... along with the following helper methods:
fsm.is(s)- return true if statesis the current statefsm.can(t)- return true if transitiontcan occur from the current statefsm.cannot(t)- return true if transitiontcannot occur from the current statefsm.transitions()- return list of transitions that are allowed from the current statefsm.allTransitions()- return list of all possible transitionsfsm.allStates()- return list of all possible states
A state machine consists of a set of States
- solid
- liquid
- gas
A state machine changes state by using Transitions
- melt
- freeze
- vaporize
- condense
A state machine can perform actions during a transition by observing Lifecycle Events
- onBeforeMelt
- onAfterMelt
- onLeaveSolid
- onEnterLiquid
- ...
A state machine can also have arbitrary Data and Methods.
Multiple instances of a state machine can be created using a State Machine Factory.
Read more about
- States and Transitions
- Data and Methods
- Lifecycle Events
- Asynchronous Transitions
- Initialization
- Error Handling
- State History
- Visualization
- State Machine Factory
- Upgrading from 2.x
You can Contribute to this project with issues or pull requests.
You might also want to support this project by purchasing a commercial license.
See RELEASE NOTES file.
Dual-licensed under the LGPL for the open source community and also available with support under a commercial license.
If you have any ideas, feedback, requests or bug reports, you can reach me at jake@codeincomplete.com, or via my website: Code inComplete
