Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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');
Expand Down
64 changes: 49 additions & 15 deletions bin/www
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);
}


Expand Down
40 changes: 40 additions & 0 deletions routes/chat.js
Original file line number Diff line number Diff line change
@@ -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));
});
};