turnpike-sm
v1.1.0
Published
A small finite state machine for JavaScript
Readme
Turnpike
A minimal finite-state machine for JavaScript.
Installation
$ npm install turnpike-sm --saveUsage
const Turnpike = require('turnpike');
const turnpike = new Turnpike(initialState, transitions, options);initialState and transitions are required. The first is the initial state
for the state machine to start in, the second is an array of transitions that
will happen when a given action (name) occurs;
const turnpike = new Turnpike('asleep', [
{ name: 'bother', from: 'asleep', to: 'awake' },
{ name: 'bother', from: 'awake', to: 'bothered' },
{ name: 'rest', from: 'jumping', to: 'asleep' },
{ name: 'jump', from: Turnpike.ANY, to: 'jumping' }
]);The special value Turnpike.ANY will match any from state.
The third argument (opts) currently accepts 1 option: opts.EventEmitter is
an alternative EventEmitter implementation to use, if your platform doesn't
include node's require('events').
instance methods include:
turnpike.act(actionName, [...args]) // Perform an action
turnpike.getState() // Retrieve the current stateTurnpike includes an EventEmitter and provides several events on each state transition:
turnpike.on('exit:asleep', (...args) => {
console.log('Sleep over', args);
});
turnpike.on('exit', (stateName, ...args) => {
console.log(`Exiting ${stateName} with args:`, args);
});
turnpike.on('enter', (stateName, ...args) => {
console.log(`Entering ${stateName} with args:`, args);
});
turnpike.on('enter:jumping', (height, speed) => {
console.log(`Started jumping, height: ${height}, speed: ${speed}`);
});
turnpike.act('jump', 12, 'fast');Testing / Linting
$ npm test
$ npm run lintMigrating from 0.x to 1.x
A few minor breaking changes:
- Initial state is now a separate argument.
evwas renamed tonamein the event definition.- Now uses EventEmitter syntax (
on('event', ...)) rather than bespokeonEnter/onExithandlers. - No more browser build provided - you should be bundling that yourself.
License
MIT
