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

0.1.1 • Public • Published

@ggoodman/fsm

Fully typed finite state machine for JavaScript and TypeScript

Installation

npm install @ggoodman/fsm

Example

The example below demonstrates a traffic light that cycles eternally on a timer.

Note: Instead of defining the 'tick' event, we could have called ctx.transitionTo('red' | 'green' | 'yellow') directly.

import { DefineEvent, DefineState, Service } from '@ggoodman/fsm';

type Red = DefineState<'red'>;
type Yellow = DefineState<'yellow'>;
type Green = DefineState<'green'>;

type Tick = DefineEvent<'tick'>;

const service = Service.define<Red | Yellow | Green, Tick>(
  (s) =>
    s
      .defineState('red', (red) =>
        red
          .onEnter((ctx) => ctx.runAfter(30 * 1000, (ctx) => ctx.send('tick')))
          .onEvent('tick', (ctx) => ctx.transitionTo('green'))
      )
      .defineState('green', (red) =>
        red
          .onEnter((ctx) => ctx.runAfter(60 * 1000, (ctx) => ctx.send('tick')))
          .onEvent('tick', (ctx) => ctx.transitionTo('yellow'))
      )
      .defineState('yellow', (red) =>
        red
          .onEnter((ctx) => ctx.runAfter(10 * 1000, (ctx) => ctx.send('tick')))
          .onEvent('tick', (ctx) => ctx.transitionTo('red'))
      ),
  'red'
);

service.onStateChange((state) => {
  console.log('State changed to %s', state.id);
});
service.start();
// State changed to red
// State changed to green
// State changed to yellow
// ...

Package Sidebar

Install

npm i @ggoodman/fsm

Weekly Downloads

3

Version

0.1.1

License

MIT

Unpacked Size

53.5 kB

Total Files

21

Last publish

Collaborators

  • filearts