Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jakesgordon/javascript-state-machine
A javascript finite state machine library
https://github.com/jakesgordon/javascript-state-machine
Last synced: about 13 hours ago
JSON representation
A javascript finite state machine library
- Host: GitHub
- URL: https://github.com/jakesgordon/javascript-state-machine
- Owner: jakesgordon
- License: mit
- Created: 2011-06-01T22:02:01.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2022-04-02T21:30:00.000Z (over 2 years ago)
- Last Synced: 2024-10-29T21:53:57.160Z (13 days ago)
- Language: JavaScript
- Homepage:
- Size: 1.54 MB
- Stars: 8,700
- Watchers: 261
- Forks: 966
- Open Issues: 74
-
Metadata Files:
- Readme: README.md
- Contributing: docs/contributing.md
- License: LICENSE
Awesome Lists containing this project
- awesome-list - javascript-state-machine
- awesome-star-libs - jakesgordon / javascript-state-machine
- awesome - jakesgordon/javascript-state-machine - A javascript finite state machine library (JavaScript)
- awesome - jakesgordon/javascript-state-machine - A javascript finite state machine library (JavaScript)
README
# Javascript State Machine
[![NPM version](https://badge.fury.io/js/javascript-state-machine.svg)](https://badge.fury.io/js/javascript-state-machine)
[![Build Status](https://travis-ci.org/jakesgordon/javascript-state-machine.svg?branch=master)](https://travis-ci.org/jakesgordon/javascript-state-machine)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:
```html
```> after downloading the [source](dist/state-machine.js) or the [minified version](dist/state-machine.min.js)
Using npm:
```shell
npm install --save-dev javascript-state-machine
```In Node.js:
```javascript
var StateMachine = require('javascript-state-machine');
```# Usage
A state machine can be constructed using:
```javascript
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
* gasA state machine changes state by using [**Transitions**](docs/states-and-transitions.md)
* melt
* freeze
* vaporize
* condenseA 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)
# ContributingYou 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](https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE) file.
# Contact
If you have any ideas, feedback, requests or bug reports, you can reach me at
[[email protected]](mailto:[email protected]), or via
my website: [Code inComplete](http://codeincomplete.com/)