--- /dev/null
+// Set up: npm install\r
+var http = require("http"),\r
+ fs = require("fs"),\r
+ path = require("path"),\r
+ ws = require("ws"),\r
+ open = require("open"),\r
+ ProtoBuf = require("protobufjs");\r
+\r
+// Copy dependencies to "www/" (example specific, you usually don't have to care\r
+var deps = [\r
+ ["Long.min.js", "./node_modules/long/dist/Long.min.js"],\r
+ ["ByteBufferAB.min.js", "./node_modules/bytebuffer/dist/ByteBufferAB.min.js"],\r
+ ["ProtoBuf.min.js", "./node_modules/protobufjs/dist/ProtoBuf.min.js"]\r
+];\r
+for (var i=0, dep, data; i<deps.length; i++) {\r
+ dep = deps[i];\r
+ if (!fs.existsSync(path.join(__dirname, "www", dep[0]))) {\r
+ console.log("Copying "+dep[0]+" from "+dep[1]);\r
+ try {\r
+ fs.writeFileSync(path.join(__dirname, "www", dep[0]), fs.readFileSync(path.join(__dirname, dep[1])));\r
+ } catch (err) {\r
+ console.log("Copying failed: "+err.message);\r
+ console.log("\nDid you run `npm install` ?");\r
+ process.exit(1);\r
+ }\r
+ }\r
+}\r
+\r
+// Initialize from .proto file\r
+var builder = ProtoBuf.loadProtoFile(path.join(__dirname, "www", "example.proto")),\r
+ Message = builder.build("Message");\r
+\r
+// HTTP server\r
+var server = http.createServer(function(req, res) {\r
+ var file = null,\r
+ type = "text/html";\r
+ if (req.url == "/") {\r
+ file = "index.html";\r
+ } else if (/^\/(\w+(?:\.min)?\.(?:js|html|proto))$/.test(req.url)) {\r
+ file = req.url.substring(1);\r
+ if (/\.js$/.test(file)) {\r
+ type = "text/javascript";\r
+ }\r
+ }\r
+ if (file) {\r
+ fs.readFile(path.join(__dirname, "www", file), function(err, data) {\r
+ if (err) {\r
+ res.writeHead(500, {"Content-Type": type});\r
+ res.end("Internal Server Error: "+err);\r
+ } else {\r
+ res.writeHead(200, {"Content-Type": type});\r
+ res.write(data);\r
+ res.end();\r
+ console.log("Served www/"+file);\r
+ }\r
+ });\r
+ } else {\r
+ res.writeHead(404, {"Content-Type": "text/html"});\r
+ res.end("Not Found");\r
+ }\r
+ });\r
+server.listen(8080);\r
+server.on("listening", function() {\r
+ console.log("Server started");\r
+ open("http://localhost:8080/");\r
+});\r
+server.on("error", function(err) {\r
+ console.log("Failed to start server:", err);\r
+ process.exit(1);\r
+});\r
+\r
+// WebSocket adapter\r
+var wss = new ws.Server({server: server});\r
+wss.on("connection", function(socket) {\r
+ console.log("New WebSocket connection");\r
+ socket.on("close", function() {\r
+ console.log("WebSocket disconnected");\r
+ });\r
+ socket.on("message", function(data, flags) {\r
+ if (flags.binary) {\r
+ try {\r
+ // Decode the Message\r
+ var msg = Message.decode(data);\r
+ console.log("Received: "+msg.text);\r
+ // Transform the text to upper case\r
+ msg.text = msg.text.toUpperCase();\r
+ // Re-encode it and send it back\r
+ socket.send(msg.toBuffer());\r
+ console.log("Sent: "+msg.text);\r
+ } catch (err) {\r
+ console.log("Processing failed:", err);\r
+ }\r
+ } else {\r
+ console.log("Not binary data");\r
+ }\r
+ });\r
+});\r