stately

A CommonJS state-machine that works in Node or the browser

Stately

This is extracted from Twebz and is designed to DRY out the CouchDB changes listner Twebz's bot uses for handling Twitter API interactions. That said, this is entirely agnostic to backends and should work great with Redis, message queues, or anything else where you can get a feed of updates as they are happening to the database.

It is totally isolated from IO, so it will also run fine in the browser, although I haven't done that yet.

var stately = require("stately")
  , myMachine = stately.define({
    foo : function(obj) {
      // this function will be called if obj.state == "foo"
      obj.fooRan = true;
    }
  })
  , obj = {state : "foo", fooRan : false};

myMachine.handle(obj);

assert.isTrue(obj.fooRan);

In real life you would hook myMachine.handle up as the listener to events on a Node.js stream. Or in the browser as the callback to an event system or a comet feed.

You can also deal with objects of multiple types if you want, by nesting the definitions one-layer deep, see the tests for details.

The _getState and _getType methods are pluggable.

Haters gonna hate, but I used Vows and "it works!"

To run them:

npm install vows
vows test/test.js
  • Test modifying the states after definition
  • Document more usage scenarios

Apache 2.0