server.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Set up: npm install
  2. var http = require("http"),
  3. fs = require("fs"),
  4. path = require("path"),
  5. ws = require("ws"),
  6. open = require("open"),
  7. ProtoBuf = require("protobufjs");
  8. // Copy dependencies to "www/" (example specific, you usually don't have to care
  9. var deps = [
  10. ["Long.min.js", "./node_modules/long/dist/Long.min.js"],
  11. ["ByteBufferAB.min.js", "./node_modules/bytebuffer/dist/ByteBufferAB.min.js"],
  12. ["ProtoBuf.min.js", "./node_modules/protobufjs/dist/ProtoBuf.min.js"]
  13. ];
  14. for (var i=0, dep, data; i<deps.length; i++) {
  15. dep = deps[i];
  16. if (!fs.existsSync(path.join(__dirname, "www", dep[0]))) {
  17. console.log("Copying "+dep[0]+" from "+dep[1]);
  18. try {
  19. fs.writeFileSync(path.join(__dirname, "www", dep[0]), fs.readFileSync(path.join(__dirname, dep[1])));
  20. } catch (err) {
  21. console.log("Copying failed: "+err.message);
  22. console.log("\nDid you run `npm install` ?");
  23. process.exit(1);
  24. }
  25. }
  26. }
  27. // Initialize from .proto file
  28. var builder = ProtoBuf.loadProtoFile(path.join(__dirname, "www", "example.proto")),
  29. Message = builder.build("Message");
  30. // HTTP server
  31. var server = http.createServer(function(req, res) {
  32. var file = null,
  33. type = "text/html";
  34. if (req.url == "/") {
  35. file = "index.html";
  36. } else if (/^\/(\w+(?:\.min)?\.(?:js|html|proto))$/.test(req.url)) {
  37. file = req.url.substring(1);
  38. if (/\.js$/.test(file)) {
  39. type = "text/javascript";
  40. }
  41. }
  42. if (file) {
  43. fs.readFile(path.join(__dirname, "www", file), function(err, data) {
  44. if (err) {
  45. res.writeHead(500, {"Content-Type": type});
  46. res.end("Internal Server Error: "+err);
  47. } else {
  48. res.writeHead(200, {"Content-Type": type});
  49. res.write(data);
  50. res.end();
  51. console.log("Served www/"+file);
  52. }
  53. });
  54. } else {
  55. res.writeHead(404, {"Content-Type": "text/html"});
  56. res.end("Not Found");
  57. }
  58. });
  59. server.listen(8080);
  60. server.on("listening", function() {
  61. console.log("Server started");
  62. open("http://localhost:8080/");
  63. });
  64. server.on("error", function(err) {
  65. console.log("Failed to start server:", err);
  66. process.exit(1);
  67. });
  68. // WebSocket adapter
  69. var wss = new ws.Server({server: server});
  70. wss.on("connection", function(socket) {
  71. console.log("New WebSocket connection");
  72. socket.on("close", function() {
  73. console.log("WebSocket disconnected");
  74. });
  75. socket.on("message", function(data, flags) {
  76. if (flags.binary) {
  77. try {
  78. // Decode the Message
  79. var msg = Message.decode(data);
  80. console.log("Received: "+msg.text);
  81. // Transform the text to upper case
  82. msg.text = msg.text.toUpperCase();
  83. // Re-encode it and send it back
  84. socket.send(msg.toBuffer());
  85. console.log("Sent: "+msg.text);
  86. } catch (err) {
  87. console.log("Processing failed:", err);
  88. }
  89. } else {
  90. console.log("Not binary data");
  91. }
  92. });
  93. });