Popularity
7.3
Growing
Activity
0.0
Stable
7,343
257
915

Description

A library for finite state machines.

Monthly Downloads: 0
Programming language: JavaScript
License: MIT License
Latest version: v3.1.0

Javascript State Machine alternatives and similar libraries

Based on the "Control Flow" category

Do you think we are missing an alternative of Javascript State Machine or a related project?

Add another 'Control Flow' Library

README

Javascript State Machine

NPM version Build Status

A library for finite state machines.

[matter state machine](examples/matter.png)

NOTE for existing users

VERSION 3.0 Is a significant rewrite from earlier versions. Existing 2.x users should be sure to read the [Upgrade Guide](docs/upgrading-from-v2.md).

Installation

In a browser:

  <script src='state-machine.js'></script>

after downloading the [source](dist/state-machine.js) or the [minified version](dist/state-machine.min.js)

Using npm:

  npm install --save-dev javascript-state-machine

In Node.js:

  var StateMachine = require('javascript-state-machine');

Usage

A state machine can be constructed using:

  var fsm = new StateMachine({
    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 state s is the current state
  • fsm.can(t) - return true if transition t can occur from the current state
  • fsm.cannot(t) - return true if transition t cannot occur from the current state
  • fsm.transitions() - return list of transitions that are allowed from the current state
  • fsm.allTransitions() - return list of all possible transitions
  • fsm.allStates() - return list of all possible states

Terminology

A state machine consists of a set of [States](docs/states-and-transitions.md)

  • solid
  • liquid
  • gas

A state machine changes state by using [Transitions](docs/states-and-transitions.md)

  • melt
  • freeze
  • vaporize
  • condense

A state machine can perform actions during a transition by observing [Lifecycle Events](docs/lifecycle-events.md)

  • onBeforeMelt
  • onAfterMelt
  • onLeaveSolid
  • onEnterLiquid
  • ...

A state machine can also have arbitrary [Data and Methods](docs/data-and-methods.md).

Multiple instances of a state machine can be created using a [State Machine Factory](docs/state-machine-factory.md).

Documentation

Read more about

  • [States and Transitions](docs/states-and-transitions.md)
  • [Data and Methods](docs/data-and-methods.md)
  • [Lifecycle Events](docs/lifecycle-events.md)
  • [Asynchronous Transitions](docs/async-transitions.md)
  • [Initialization](docs/initialization.md)
  • [Error Handling](docs/error-handling.md)
  • [State History](docs/state-history.md)
  • [Visualization](docs/visualization.md)
  • [State Machine Factory](docs/state-machine-factory.md)
  • [Upgrading from 2.x](docs/upgrading-from-v2.md)

Contributing

You can [Contribute](docs/contributing.md) to this project with issues or pull requests.

Release Notes

See [RELEASE NOTES](RELEASE_NOTES.md) file.

License

See MIT LICENSE file.

Contact

If you have any ideas, feedback, requests or bug reports, you can reach me at jake@codeincomplete.com, or via my website: Code inComplete


*Note that all licence references and agreements mentioned in the Javascript State Machine README section above are relevant to that project's source code only.