Fusium Finite State Machine
Overview
Fusium is a simple finite state machine for gaming or workflow systems. It supports local and global triggers, entry and exit actions, and the ability to block state transitions before exit.
Features
- Unlimited number of states
- Accepted state
- Go to the previous state
- Throws errors on invalid state transitions
- Supports entry actions
- Supports blocking exit actions
- Start on any state
- Reset the state machine
Installation
$ npm install fusium
Examples
Begin by referencing the module:
var fusium = ;
Then add in the classes:
var State = fusiumclassesState;var StateMachineError = fusiumclassesStateMachineError;var StateMachine = fusiumclassesStateMachine;var Transition = fusiumclassesTransition;
Finally, wire up your state machine and start it:
var entryAction = { execute: function( state ) { state.trigger( "next" ); };}; var exitAction = { execute: function( state ) { // Returning false will cancel the state transition return true; };}; var decideAction = { execute: function( state ) { var index = Math.floor( Math.random() * 2 ); if ( index === 0 ) { state.trigger( "goto3" ); } else if ( index === 1 ) { state.trigger( "goto4" ); } }}; var finalAction = { execute: function( state ) { // Can perform some final actions, the state machine is finished running. };}; var stateMachine = new StateMachine();var s1 = stateMachine.createState( "My first state", false );var s2 = stateMachine.createState( "My second state", false );var s3 = stateMachine.createState( "My third state", false );var s4 = stateMachine.createState( "My fourth state", false );// Notice true indicates a final accept state.var s5 = stateMachine.createState( "My final state", true ); // Wire up all entry and exit actionss1.entryAction = entryAction;s1.exitAction = exitAction;s2.entryAction = decideAction;s2.exitAction = exitAction;s3.entryAction = entryAction;s3.exitAction = exitAction;s4.entryAction = entryAction;s4.exitAction = exitAction;s5.entryAction = finalAction; // Define all state transitionss1.addTransition( "next", s2 );s2.addTransition( "goto3", s3 );s2.addTransition( "goto4", s4 );s3.addTransition( "next", s5 );s4.addTransition( "next", s5 ); // Start the state machinestateMachine.start( s1 );