Skip to content
/ fsm Public

Fully typed finite state machine for JavaScript and TypeScript.

License

Notifications You must be signed in to change notification settings

ggoodman/fsm

Repository files navigation

@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
// ...

About

Fully typed finite state machine for JavaScript and TypeScript.

Resources

License

Stars

Watchers

Forks

Packages

No packages published