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

sicoris-statemachine-js

v0.0.5

Published

Statemachine for JS

Downloads

2

Readme

sicoris-statemachine-js

Simplified state machine library for JS, following most of the principles of https://bitbucket.org/xferro/sicoris-statemachine but with just non-reentrant strategy.

It is a very lightweight but powerful library. A State Machine consists of the following:

  • A set of states. One and only one is the start state. We can have multiple final states
  • A set of events that can be processed by the state machine
  • A set of transition. A transition is a tuple of: source state, event and target state.
  • Each transition has three phases
    • Exit or leave phase: when the transition starts, it's the only phase where we can cancel the transition
    • Transition phase: where we do all the work
    • Enter phase: sometimes, we want to force the transition to move to another state. Useful for condition states
  • If we try to process an event, and the transition has not been defined, it will throw an exception.

build status

Installation

This module is installed via npm:

$ npm install sicoris-statemachine-js

Example Usage with some conditions

      var stateMachine = require('sicoris-statemachine-js');
git
      var cfg = { // State machine with 2 states: STATE_A and STATE_B
          STATE_A : {
              startState: true, // When the SM is created, it will be initialized to STATE_A
              transitions: {
                  EVENT_AB : "STATE_B" // When in STATE_A, we can trigger a transition by processing EVENT_AB
              }
          },
          STATE_B : {
              endState: true // STATE_B is a final state
          }
      };

      var def = stateMachine(cfg);
      var processor = def.processorBuilder()
          // We can register a listener when exiting a state
          .onExit("STATE_A", function(transition) {
              console.log("leaving state " + transition.source 
                          + " to state " + transition.target 
                          + " because of event " + transition.event);
              return true;  // Returning true allows the transition to continue
          })
          .onEnter("STATE_B", function(transition) {
              console.log("entering " + transition.target 
                          + " from state " + transition.source 
                          + " because of event " + transition.event);
          })
          .onTransition("STATE_A", "EVENT_AB", function(transition) {
              console.log("transitioning from state " + transition.source 
                          + " to state " + transition.target 
                          + " because of event " + transition.event);
        })
        .build();

    console.log(processor.getCurrentState());
    processor.process(EVENT_AB);
    console.log(processor.getCurrentState());