diff --git a/app.js b/app.js index 994ee45..2139975 100644 --- a/app.js +++ b/app.js @@ -16,6 +16,7 @@ var routes = require('./routes/index'); var users = require('./routes/users'); var posts = require('./routes/posts'); var account = require('./routes/account'); +var chat = require('./routes/chat'); var app = express(); @@ -133,6 +134,10 @@ app.get('/auth/facebook/callback', cors(), res.redirect('/account/profile'); }); +//chat +app.get('/start', cors(), chat.start); +app.post('/send/:message', cors(), chat.send); + // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); diff --git a/bin/www b/bin/www index 8ba0b77..4473e41 100755 --- a/bin/www +++ b/bin/www @@ -9,6 +9,7 @@ var debug = require('debug')('myapp:server'); var http = require('http'); var cluster = require('cluster'); var cpuCount = require('os').cpus().length; +var WebSocketServer = require('websocket').server; /** * Get port from environment and store in Express. @@ -24,21 +25,54 @@ if (cluster.isMaster) { cluster.fork({PORT: port + i}); } } else { - /** - * Create HTTP server in worker process. - */ - var port = process.env.PORT; - var server = http.createServer(app); - - console.log('HTTP server listening on port ' + port + ' at worker ' + cluster.worker.id); - - /** - * Listen on provided port, on all network interfaces. - */ - - server.listen(port); - server.on('error', onError); - server.on('listening', onListening); + var Port = normalizePort(process.env.PORT || '3000'); + /** + * Create HTTP server in worker process. + */ + var server = http.createServer(app).listen(Port, function(){ + console.log('Express server listening on port ' + Port); + }); + + /** + * Listen on provided port, on all network interfaces. + */ + server.on('error', onError); + server.on('listening', onListening); + + /* + * WebSocket Section + */ + var wsServer = new WebSocketServer({ + httpServer: server, + autoAcceptConnections: false + }); + + // create WebSocket connections array + app.clients = []; + + function onWsConnClose(reasonCode, description) { + console.log(' Peer disconnected with reason: ' + reasonCode); + } + + function onWsConnMessage(message) { + if (message.type == 'utf8') { + console.log('Received message: ' + message.utf8Data); + } else if (message.type == 'binary') { + console.log('Received binary data.'); + } + } + + function onWsRequest(request) { + var connection = request.accept('echo-protocol', request.origin); + console.log("WebSocket connection accepted."); + + app.clients.push(connection); + + connection.on('message', onWsConnMessage); + connection.on('close', onWsConnClose); + } + + wsServer.on('request', onWsRequest); } diff --git a/routes/chat.js b/routes/chat.js new file mode 100644 index 0000000..6e55f70 --- /dev/null +++ b/routes/chat.js @@ -0,0 +1,40 @@ + +/* + * GET chat messages + */ + +var history = []; + +exports.start = function(req, res){ + var json; + + json = { + data: history + }; + + res.send(json); +}; + +/* + * POST chat message + */ + +exports.send = function(req, res){ + var clients = req.app.clients; + var msg = req.params.message; + var obj = {}; + var milliseconds = new Date().getTime(); + + obj.message = msg; + obj.timestamp = milliseconds; + + history.push(obj); + + res.send("Receive message: " + msg); + + // Push to all clients via WebSocket + clients.forEach(function(client) { + // Stringify + client.sendUTF(JSON.stringify(history)); + }); +}; \ No newline at end of file