blob: bb6b5c136436fcda959dd8b5dee8004a1041dc72 [file] [log] [blame]
//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');