UNPKG

3.62 kBJavaScriptView Raw
1var Executors = Packages.java.util.concurrent.Executors,
2 InetSocketAddress = Packages.java.net.InetSocketAddress,
3 Headers = Packages.com.sun.net.httpserver.Headers,
4 HttpExchange = Packages.com.sun.net.httpserver.HttpExchange,
5 HttpHandler = Packages.com.sun.net.httpserver.HttpHandler,
6 HttpServer = Packages.com.sun.net.httpserver.HttpServer;
7
8
9var scion = require('scion');
10
11var port = 42000;
12var addr = new InetSocketAddress(port);
13var server = HttpServer.create(addr, 0);
14
15var sessionCounter = 0, sessions = {}, timeouts = {}, timeoutMs = 5000;
16
17
18function cleanUp(sessionToken){
19 delete sessions[sessionToken];
20}
21
22function toBytes(s){
23 if(typeof s === "object"){
24 s = JSON.stringify(s);
25 }
26 return (new Packages.java.lang.String(s)).getBytes();
27}
28
29var handler = new HttpHandler({handle : function(exchange){
30 var reqBody = exchange.getRequestBody();
31 var bodyArr = [], c;
32 while((c = reqBody.read()) !== -1){
33 bodyArr.push(String.fromCharCode(c));
34 }
35 var s = bodyArr.join("");
36 //print("body",s);
37
38 var responseHeaders = exchange.getResponseHeaders();
39 var responseBody = exchange.getResponseBody();
40
41 try{
42 var reqJson = JSON.parse(s);
43 if(reqJson.load){
44 print("Loading new statechart");
45
46 scion.urlToModel(reqJson.load,function(err,model){
47
48 if(err){
49 exchange.sendResponseHeaders(500, 0);
50 responseBody.write(toBytes(err.message));
51 }else{
52 var interpreter = new scion.SCXML(model);
53
54 var sessionToken = sessionCounter;
55 sessionCounter++;
56 sessions[sessionToken] = interpreter;
57
58 var conf = interpreter.start();
59
60 responseHeaders.set("Content-Type", "application/json");
61 exchange.sendResponseHeaders(200, 0);
62 responseBody.write(toBytes({
63 sessionToken : sessionToken,
64 nextConfiguration : conf
65 }));
66
67 }
68 responseBody.close();
69
70 //timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
71 });
72 }else if(reqJson.event && (typeof reqJson.sessionToken === "number")){
73 print("sending event to statechart",JSON.stringify(reqJson.event,4,4));
74 var sessionToken = reqJson.sessionToken;
75 var nextConfiguration = sessions[sessionToken].gen(reqJson.event);
76 responseHeaders.set("Content-Type", "application/json");
77 exchange.sendResponseHeaders(200, 0);
78 responseBody.write(toBytes({
79 nextConfiguration : nextConfiguration
80 }));
81
82 //clearTimeout(timeouts[sessionToken]);
83 //timeouts[sessionToken] = setTimeout(function(){cleanUp(sessionToken);},timeoutMs);
84 }else{
85 //unrecognized. send back an error
86 responseHeaders.set("Content-Type", "text/plain");
87 exchange.sendResponseHeaders(400, 0);
88 responseBody.write(toBytes("Unrecognized request.\n"));
89 }
90 }catch(e){
91 print(e);
92 print(e.stack);
93
94 responseHeaders.set("Content-Type", "text/plain");
95 exchange.sendResponseHeaders(500, 0);
96 responseBody.write(toBytes(e.message));
97 }
98
99
100 responseBody.close();
101}});
102server.createContext("/", handler);
103server.setExecutor(Executors.newCachedThreadPool());
104server.start();
105print("Server is listening on port " + port );
106