preservative

A proxy for state machines to preserve state and history

Preservative

This module allows you to replay scenarios from state machines whose interface is a single class. Advantageous to serializing and saving internal state as a JSON blob because not only do you get full revision history, but also append-only history which is nice for replication.

Attach a state machine of your choice, and pass in the operations that changes the state of the class. Here we use duel tournaments as a reference state machine class.

var PreservedDuel = require('preservative')(require('duel'), ['new', 'score']);
 
var duel = new PreservedDuel(8); // 8 player duel tournament 
duel.score(duel.matches[0].id, [1,0]); // use duel API 
duel.score(duel.matches[1].id, [1,2]); // use duel API 
 
var preserve = duel.preserve();
preserve;
[ { type: 'new', args: [ 8,  ] },
  { type: 'score', args: [ { s: 1, r: 1, m: 1 }, [ 1, 0 ],  ] },
  { type: 'score', args: [ { s: 1, r: 1, m: 2 }, [ 1, 2 ],  ] } ]
 
var duel = PreservedDuel.from(preserve); // same as original duel before .preserve(); 

If the underlying state machine returns boolean whether or not the operation was allowed, preservative can filter out the calls that were disallowed.

var PreservedDuel = require('preservative')(require('duel'), ['new', 'score'], { filterNoops: true });
var duel = new PreservedDuel(4);
var last = duel.matches[duel.matches.length-1];
duel.score(last.id, [1,0]); // false 
 
duel.preserve(); // [ { type: 'new', args: [ 4,  ] } ] 
 
var first = duel.matches[0]
duel.score(first.id, [1,0]); // true 
duel.preserve();
[ { type: 'new', args: [ 4,  ] }
  { type: 'score', args: [ { s: 1, r: 1, m: 1 }, [ 1, 0 ],  ] } ]

By using ignoreNoops, you only get the part of history that mattered.

Install locally from npm

$ npm install preservative --save

Install development dependencies

$ npm install

Run the tests

$ npm test

MIT-Licensed. See LICENSE file for details.