npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@edium/fsm

v2.1.5

Published

Simple finite state machine framework that can be used with client or server.

Downloads

4,735

Readme

Edium Finite State Machine

Overview

Edium FSM is a simple finite state machine written in TypeScript used for gaming or workflow systems. It supports local and global transitions/triggers, entry and exit actions, and the ability to block state transitions before exit. It works both on the client and the server in plain JavaScript or with TypeScript.

Features

  • Unlimited number of states
  • One or more completed states
  • Go to the previous state
  • Throws errors on invalid state transitions
  • Supports entry actions
  • Supports blocking exit actions
  • Start on any state
  • Reset the state machine with optional restart
  • Unlimited local transitions
  • Unlimited global transtions/triggers that bypass the current state's transition rules
  • State changes occur via triggers
  • When creating the machine, optionally send in a context which is sent to all state actions.

Installation

    $ npm install @edium/fsm

Tests/Coverage

The code is fully unit tested with near 100 test percent coverage. Additonally, all code has been vetted using Sonar Scanner (TypeScript) and Code Metrics.

  $ npm run test
  $ npm run coverage

Examples

Begin by referencing the module (browser):

import { State, StateMachine } from '@edium/fsm';

or through Node.js:

const { State, StateMachine } = require('@edium/fsm');

Finally, wire up your state machine and start it:

const entryAction = ( state, context ) => {
  state.trigger( "next" );
};

const exitAction = ( state, context ) => {
  // Returning false will cancel the state transition
  return true;
};

const decideAction = ( state, context ) => {
  const index = context.randomize();
  if ( index === 0 ) {
      state.trigger( "gotoThree" );
  } else if ( index === 1 ) {
      state.trigger( "gotoFour" );
  }
};

const finalAction = ( state ) => {
  // Can perform some final actions, the state machine is finished running.
};

const context = {
  randomize: () => {
    return Math.floor( Math.random() * 2 );
  }
};

const stateMachine = new StateMachine('My first state machine', context);
const s1 = stateMachine.createState( "My first state", false, entryAction);
const s2 = stateMachine.createState( "My second state", false, decideAction, exitAction); // Trivial use of exit action as an example.
const s3 = stateMachine.createState( "My third state", false, entryAction);
const s4 = stateMachine.createState( "My fourth state", false, entryAction);

// Notice true indicates completed state.
var s5 = stateMachine.createState( "My fifth and final state", true, finalAction); 

// Define all state transitions
s1.addTransition( "next", s2 );
s2.addTransition( "gotoThree", s3 );
s2.addTransition( "gotoFour", s4 );
s3.addTransition( "next", s5 );
s4.addTransition( "next", s5 );

// Start the state machine
stateMachine.start( s1 );