1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | var scxml = require('..'),
|
7 | http = require('http');
|
8 |
|
9 | var sessionCounter = 0, sessions = {}, timeouts = {}, timeoutMs = 5000;
|
10 |
|
11 | var PORT = process.env.PORT || 42000;
|
12 |
|
13 | function loadScxml(scxmlStr){
|
14 | }
|
15 |
|
16 | function cleanUp(sessionToken){
|
17 | delete sessions[sessionToken];
|
18 | }
|
19 |
|
20 | http.createServer(function (req, res) {
|
21 |
|
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 |
|
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 |
|
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 |
|
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 |
|
101 | console.log('listening on port ' + PORT);
|