@edium/fsm
TypeScript icon, indicating that this package has built-in type declarations

2.1.4 • Public • Published

Edium Finite State Machine

Overview

Edium FSM is a simple finite state machine written in TypeScript used for gaming or workflow systems. It supports local and global transitions/triggers, entry and exit actions, and the ability to block state transitions before exit. It works both on the client and the server in plain JavaScript or with TypeScript.

Features

  • Unlimited number of states
  • One or more completed states
  • 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 with optional restart
  • Unlimited local transitions
  • Unlimited global transtions/triggers that bypass the current state's transition rules
  • State changes occur via triggers
  • When creating the machine, optionally send in a context which is sent to all state actions.

Installation

    $ npm install @edium/fsm

Tests/Coverage

The code is fully unit tested with near 100 test percent coverage. Additonally, all code has been vetted using Sonar Scanner (TypeScript) and Code Metrics.

  $ npm run test
  $ npm run coverage

Examples

Begin by referencing the module (browser):

import { State, StateMachine } from '@edium/fsm';

or through Node.js:

const { State, StateMachine } = require('@edium/fsm');

Finally, wire up your state machine and start it:

const entryAction = ( state, context ) => {
  state.trigger( "next" );
};

const exitAction = ( state, context ) => {
  // Returning false will cancel the state transition
  return true;
};

const decideAction = ( state, context ) => {
  const index = context.randomize();
  if ( index === 0 ) {
      state.trigger( "gotoThree" );
  } else if ( index === 1 ) {
      state.trigger( "gotoFour" );
  }
};

const finalAction = ( state ) => {
  // Can perform some final actions, the state machine is finished running.
};

const context = {
  randomize: () => {
    return Math.floor( Math.random() * 2 );
  }
};

const stateMachine = new StateMachine('My first state machine', context);
const s1 = stateMachine.createState( "My first state", false, entryAction);
const s2 = stateMachine.createState( "My second state", false, decideAction, exitAction); // Trivial use of exit action as an example.
const s3 = stateMachine.createState( "My third state", false, entryAction);
const s4 = stateMachine.createState( "My fourth state", false, entryAction);

// Notice true indicates completed state.
var s5 = stateMachine.createState( "My fifth and final state", true, finalAction); 

// Define all state transitions
s1.addTransition( "next", s2 );
s2.addTransition( "gotoThree", s3 );
s2.addTransition( "gotoFour", s4 );
s3.addTransition( "next", s5 );
s4.addTransition( "next", s5 );

// Start the state machine
stateMachine.start( s1 );

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 2.1.4
    332
    • latest

Version History

Package Sidebar

Install

npm i @edium/fsm

Weekly Downloads

345

Version

2.1.4

License

MIT

Unpacked Size

92.8 kB

Total Files

29

Last publish

Collaborators

  • splayfee