UNPKG

4.04 kBJavaScriptView Raw
1//load statechart from scxml string; return initial state and token id
2
3//send event to statechart with tokenid
4//clean up statechart
5
6var scxml = require('..'),
7 http = require('http');
8
9var sessionCounter = 0, sessions = {}, timeouts = {}, timeoutMs = 5000;
10
11var PORT = process.env.PORT || 42000;
12
13function loadScxml(scxmlStr){
14}
15
16function cleanUp(sessionToken){
17 delete sessions[sessionToken];
18}
19
20http.createServer(function (req, res) {
21 //TODO: set a timeout to clean up if we don't hear back for a while
22 var s = "";
23 req.on("data",function(data){
24 s += data;
25 });
26 req.on("end",function(){
27 var sessionToken;
28 try{
29 var reqJson = JSON.parse(s);
30 if(reqJson.load){
31 scxml.urlToModel(reqJson.load,function(err,model){
32 //console.log('model',model);
33 if(err){
34 console.error(err.stack);
35 res.writeHead(500, {'Content-Type': 'text/plain'});
36 res.end(err.message);
37 }else{
38 try {
39 model.prepare(function(err, fnModel) {
40 if (err) {
41 console.error('model preparation error: ' + err);
42 res.writeHead(500, {'Content-Type': 'text/plain'});
43 res.end(err.message);
44 return;
45 }
46
47 var interpreter = new scxml.scion.Statechart(fnModel, { sessionid: sessionCounter });
48
49 var sessionToken = sessionCounter;
50 sessionCounter++;
51 sessions[sessionToken] = interpreter;
52
53 var conf = interpreter.start();
54
55 res.writeHead(200, {'Content-Type': 'application/json'});
56 res.end(JSON.stringify({
57 sessionToken : sessionToken,
58 nextConfiguration : conf
59 }));
60
61 // TODO: timeout should be kicked off before fetch/compilation/preparation
62 timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
63 });
64 } catch(e) {
65 console.log(e.stack);
66 console.log(e);
67 res.writeHead(500, {'Content-Type': 'text/plain'});
68 res.end(e.message);
69 }
70 }
71 });
72
73 }else if(reqJson.event && (typeof reqJson.sessionToken === "number")){
74 console.log("sending event to statechart",reqJson.event);
75 sessionToken = reqJson.sessionToken;
76 var nextConfiguration = sessions[sessionToken].gen(reqJson.event);
77 console.log('nextConfiguration',nextConfiguration);
78 res.writeHead(200, {'Content-Type': 'application/json'});
79 res.end(JSON.stringify({
80 nextConfiguration : nextConfiguration
81 }));
82
83 clearTimeout(timeouts[sessionToken]);
84 timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
85 }else{
86 //unrecognized. send back an error
87 res.writeHead(400, {'Content-Type': 'text/plain'});
88 res.end("Unrecognized request.\n");
89 }
90 }catch(e){
91 console.error(e.stack);
92 console.error(e);
93 res.writeHead(500, {'Content-Type': 'text/plain'});
94 res.end(e.message);
95 }
96 });
97}).listen(PORT, function(){
98 console.log("Express server listening on port " + PORT);
99});
100
101console.log('listening on port ' + PORT);