1 | var 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 |
|
9 | var scion = require('scion');
|
10 |
|
11 | var port = 42000;
|
12 | var addr = new InetSocketAddress(port);
|
13 | var server = HttpServer.create(addr, 0);
|
14 |
|
15 | var sessionCounter = 0, sessions = {}, timeouts = {}, timeoutMs = 5000;
|
16 |
|
17 |
|
18 | function cleanUp(sessionToken){
|
19 | delete sessions[sessionToken];
|
20 | }
|
21 |
|
22 | function toBytes(s){
|
23 | if(typeof s === "object"){
|
24 | s = JSON.stringify(s);
|
25 | }
|
26 | return (new Packages.java.lang.String(s)).getBytes();
|
27 | }
|
28 |
|
29 | var 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 |
|
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 |
|
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 |
|
83 |
|
84 | }else{
|
85 |
|
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 | }});
|
102 | server.createContext("/", handler);
|
103 | server.setExecutor(Executors.newCachedThreadPool());
|
104 | server.start();
|
105 | print("Server is listening on port " + port );
|
106 |
|