Revision control
++ //load statechart from scxml string; return initial state and token id
++
++ //send event to statechart with tokenid
++ //clean up statechart
++
++ var scion = require('scion'),
++ http = require('http');
++
++ var sessionCounter = 0, sessions = {}, timeouts = {}, timeoutMs = 5000;
++
++ function loadScxml(scxmlStr){
++ }
++
++ function cleanUp(sessionToken){
++ delete sessions[sessionToken];
++ }
++
++ http.createServer(function (req, res) {
++ //TODO: set a timeout to clean up if we don't hear back for a while
++ var s = "";
++ req.on("data",function(data){
++ s += data;
++ });
++ req.on("end",function(){
++ var sessionToken;
++ try{
++ var reqJson = JSON.parse(s);
++ if(reqJson.load){
++ console.log("Loading new statechart");
++
++ scion.urlToModel(reqJson.load,function(err,model){
++ if(err){
++ console.error(err.stack);
++ res.writeHead(500, {'Content-Type': 'text/plain'});
++ res.end(err.message);
++ }else{
++ var interpreter = new scion.SCXML(model);
++
++ var sessionToken = sessionCounter;
++ sessionCounter++;
++ sessions[sessionToken] = interpreter;
++
++ var conf = interpreter.start();
++
++ res.writeHead(200, {'Content-Type': 'application/json'});
++ res.end(JSON.stringify({
++ sessionToken : sessionToken,
++ nextConfiguration : conf
++ }));
++
++ timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
++ }
++ });
++
++ }else if(reqJson.event && (typeof reqJson.sessionToken === "number")){
++ console.log("sending event to statechart",reqJson.event);
++ sessionToken = reqJson.sessionToken;
++ var nextConfiguration = sessions[sessionToken].gen(reqJson.event);
++ console.log('nextConfiguration',nextConfiguration);
++ res.writeHead(200, {'Content-Type': 'application/json'});
++ res.end(JSON.stringify({
++ nextConfiguration : nextConfiguration
++ }));
++
++ clearTimeout(timeouts[sessionToken]);
++ timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
++ }else{
++ //unrecognized. send back an error
++ res.writeHead(400, {'Content-Type': 'text/plain'});
++ res.end("Unrecognized request.\n");
++ }
++ }catch(e){
++ console.error(e.stack);
++ console.error(e);
++ res.writeHead(500, {'Content-Type': 'text/plain'});
++ res.end(e.message);
++ }
++ });
++ }).listen(42000, '127.0.0.1');
++