39c8b14f |
1 | var sys = require("sys") |
2 | , fs = require("fs") |
3 | , Path = require("path") |
4 | , http = require("http") |
5 | , crypto = require("crypto") |
6 | , ws = require('../lib/ws/server'); |
7 | |
8 | console.log(process.pid); |
9 | |
10 | /*----------------------------------------------- |
11 | logging: |
12 | -----------------------------------------------*/ |
13 | var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; |
14 | |
15 | function pad(n) { |
16 | return n < 10 ? '0' + n.toString(10) : n.toString(10); |
17 | } |
18 | |
19 | function timestamp() { |
20 | var d = new Date(); |
21 | return [ |
22 | d.getDate(), |
23 | months[d.getMonth()], |
24 | [ pad(d.getHours()) |
25 | , pad(d.getMinutes()) |
26 | , pad(d.getSeconds()) |
27 | , (d.getTime() + "").substr( - 4, 4) |
28 | ].join(':') |
29 | ].join(' '); |
30 | }; |
31 | |
32 | function log(msg) { |
33 | sys.puts(timestamp() + ' - ' + msg.toString()); |
34 | }; |
35 | |
36 | var cache = {}; |
37 | function readPage(path, callback){ |
38 | if(cache[path]) { |
39 | callback(cache[path]); |
40 | } else { |
41 | cache[path] = []; |
42 | |
43 | fs.createReadStream( Path.normalize(Path.join(__dirname, path)), { |
44 | 'flags': 'r', |
45 | 'encoding': 'binary', |
46 | 'mode': 0666, |
47 | 'bufferSize': 4 * 1024 |
48 | }).addListener("data", function(chunk){ |
49 | cache[path].push(chunk); |
50 | }).on("end", function(){ |
51 | callback(cache[path]); |
52 | }); |
53 | } |
54 | } |
55 | |
56 | readPage("client.html", function(){}); |
57 | |
58 | var reqnum = 0; |
59 | function serveFile(req, res){ |
60 | if(req.method == "GET"){ |
61 | if( req.url.indexOf("favicon") > -1 ){ |
62 | log("HTTP: inbound request, served nothing, (favicon)"); |
63 | |
64 | res.writeHead(200, {'Content-Type': 'image/x-icon'}); |
65 | res.end(""); |
66 | } else { |
67 | log("HTTP: inbound request, served client.html"); |
68 | res.writeHead(200, {'Content-Type': 'text/html', 'Connection': 'close'}); |
69 | readPage("client.html", function(data){ |
70 | data.forEach(function(datum){ |
71 | res.write(datum); |
72 | }); |
73 | |
74 | res.end(); |
75 | }); |
76 | } |
77 | } else { |
78 | res.writeHead(200, {'Content-Type': 'text/html'}); |
79 | res.end(); |
80 | } |
81 | }; |
82 | |
83 | /*----------------------------------------------- |
84 | Spin up our server: |
85 | -----------------------------------------------*/ |
86 | |
87 | var certPem = fs.readFileSync(Path.normalize(Path.join(__dirname, "ssl/cert.pem")), 'ascii'); |
88 | var keyPem = fs.readFileSync(Path.normalize(Path.join(__dirname, "ssl/cert.key")), 'ascii'); |
89 | |
90 | var credentials = crypto.createCredentials({key:keyPem, cert:certPem}); |
91 | |
92 | |
93 | var httpServer = http.createServer(serveFile); |
94 | |
95 | |
96 | var server = ws.createServer({ |
97 | debug: true, |
98 | useStorage: true, |
99 | server: httpServer |
100 | }); |
101 | server.setSecure(credentials); |
102 | |
103 | |
104 | server.addListener("listening", function(){ |
105 | log("Listening for connections."); |
106 | }); |
107 | |
108 | // Handle WebSocket Requests |
109 | server.addListener("connection", function(conn){ |
110 | conn.send("Connection: "+conn.id); |
111 | conn.broadcast("<"+conn.id+"> connected"); |
112 | conn.addListener("message", function(message){ |
113 | conn.broadcast("<"+conn.id+"> "+message); |
114 | // conn.storage.incr("messages"); |
115 | }); |
116 | }); |
117 | |
118 | server.addListener("close", function(conn){ |
119 | // sys.puts(conn.id+" sent "+conn.storage.get("messages")); |
120 | server.broadcast("<"+conn.id+"> disconnected"); |
121 | }); |
122 | |
123 | server.listen(8000); |