Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
123 lines (92 sloc) 2.5 KB

fsmjs

Build Status

State machines are back, the async way!

$ npm install fsmjs

By example

var fsmjs = require('../lib/fsmjs');

var tim = fsmjs({

	idle: {

		// when 'go' or 'start' or 'g' are pushed, we move to 'running' and start
		// an interval that emits a 'tick' event every 100ms.
		'(go|start|g)': function(cb) {
			process.stdout.write('starting engines...\n');
			tim.state = 'running'; 
			tim._timer = tim.interval('tick', 100);
			cb();
		},

		// strings are target states (and emitted events)
		exit: 'end',
		e: 'error',

		// any other event in this state shows this error
		'.*': function(cb, e) {
			console.log('error: i cant understand what you mean by "' + e + '"');
			cb();
		},
	},

	running: {

		// animate clock every tick
		tick: function(cb) {
			var clock = [ '|', '/', '-', '\\' ];
			process.stdout.write('(' + clock[tim._i] + ")");
			for (var i = 0; i < 50; ++i) process.stdout.write(' ');
			process.stdout.write('\r');
			tim._i = (tim._i + 1) % clock.length;
			cb();
		},

		// cannot exit from this state
		exit: 'error',

		// when 'no' or 'stop' or 'x' are pushed, move to 'stopping' and start
		// a 2sec timeout that emits 'elapsed' when elapsed (surpise!)
		'(no|stop|x)': function(cb) { 
			process.stdout.write('stopping...\n');
			tim.state = 'stopping';
			tim.timeout('stopped', 5000);

			cb();
		},

		$exit: function(cb) {
			// take some time before changing state.
			console.log('our running times are over.. give me 2 more seconds.');
			setTimeout(cb, 2000);
		},

	},

	stopping: {

		// called when the stopping timer elapses. clears the 
		// interval and changes state to 'idle'
		stopped: function(cb) {
			process.stdout.write('\nall done.\n');
			clearInterval(tim._timer);
			tim.state = 'idle';
			cb();
		},

		// a tick during stop operation, show dots
		tick: function(cb) {
			process.stdout.write(".");
			cb();
		},

		exit: 'error',

	},

	error: function(cb, state) {
		console.log('An error occured in state', state);
		tim.state = state;
		cb();
	},

	_timer: null, // timer object to allow clearing the interval
	_i: 0, // animated clock
});

tim.on('end', function() {
	process.exit();
});

tim.on('error', function() {
	console.log('on-error');
});

tim.on('idle.start', function() {
	console.log("try 'go' the next time...");
});

var i = require('../lib/debugger')(tim, { verbose: false });

More examples under examples/.

Lisence

MIT