diff options
author | Freeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace> | 2013-05-06 01:17:47 +1200 |
---|---|---|
committer | Freeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace> | 2013-05-13 00:40:07 +1200 |
commit | 2b3bf882d6b53f09e0dddf3f8d4f159832471fb3 (patch) | |
tree | aeab8858a8095d8b21b7e6d5e086c542028924f7 /index.js | |
parent | f2c37f5801456d447b3c92dd90b9674a52f6e886 (diff) | |
download | manavis-2b3bf882d6b53f09e0dddf3f8d4f159832471fb3.tar.gz manavis-2b3bf882d6b53f09e0dddf3f8d4f159832471fb3.tar.bz2 manavis-2b3bf882d6b53f09e0dddf3f8d4f159832471fb3.tar.xz manavis-2b3bf882d6b53f09e0dddf3f8d4f159832471fb3.zip |
Broadcast active filters
There is now a simple node application to enable broadcasting of active
filters, using socket.io.
Currently, everyone on the server will send and receive all changes.
This might get chaotic depending on how crowded things become.
Perhaps `channels' might help keep things scalable.
Broadcasting filters for the stat trellis chart would be interesting.
You can also set and change your own nickname.
This closes #12.
Diffstat (limited to 'index.js')
-rw-r--r-- | index.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/index.js b/index.js new file mode 100644 index 0000000..2c3e894 --- /dev/null +++ b/index.js @@ -0,0 +1,99 @@ +/* Deps */ +var http = require('http') + , path = require('path') + , connect = require('connect') + , express = require('express') + , app = express() + , logger = require('logger').createLogger('manavis.log') + , cookieParser = express.cookieParser('your secret sauce') + , sessionStore = new connect.middleware.session.MemoryStore() + ; + +app.configure(function () { + app.use(express.bodyParser()); + app.use(express.methodOverride()); + app.use(cookieParser); + app.use(express.session({ store: sessionStore })); + app.use(app.router); + app.use(express.static(__dirname)); +}); + +var server = http.createServer(app) + , io = require('socket.io').listen(server) + , SessionSockets = require('session.socket.io') + , sessionSockets = new SessionSockets(io, sessionStore, cookieParser) + ; +/* End deps */ + +/* Only one level is logged, and numerical timestamps are easier to compare. */ +logger.format = function(level, date, message) { + return (+date) + ":" + message; +} + +/* Number of sessions we've seen. */ +var count = 0; +/* nid -> { nick, filters, following } */ +var users = {}; + +sessionSockets.on('connection', function (err, socket, session) { + /* + * Don't do anything until they send a login message. + * Later versions might also check a protocol version here. + */ + socket.on('login', function() { + /* Someone new connected. Restore or initialise their session data. */ + session.nid = session.nid || (++count); + session.nick = session.nick || null; + session.save(); + /* New user! */ + logAction("CONNECT", socket.handshake.address.address); + users[session.nid] = { nick: session.nick, filters: {} }; + /* Let them know of their data. */ + socket.emit('selflogin', { + id: session.nid, + nick: session.nick + }); + /* Let everyone else know that someone connected. */ + socket.broadcast.emit('login', { + id: session.nid, + nick: session.nick + }); + /* Send the new user the userlist. */ + socket.emit('users', { users: users }); + /* Set up various handlers for the new socket. */ + socket.on('nick', function (d) { + /* TODO Collision checking? */ + users[session.nid].nick = session.nick = d.nick; + session.save(); + logAction("NICK", d.nick); + io.sockets.emit('nickset', { + id: session.nid, + nick: d.nick + }); + }); + socket.on('filter', function(d) { + users[session.nid].filters = d.filters; + logAction("FILTER", d.filters); + socket.broadcast.emit('filterset', { + id: session.nid, + filters: d.filters + }); + }); + socket.on('disconnect', function() { + logAction("DISCONNECT"); + delete users[session.nid]; + socket.broadcast.emit('logout', { + id: session.nid + }); + }); + }); + function logAction(action, content) { + logger.info(session.nid + , action + , content + ); + } +}); + +logger.info(0, "STARTUP"); +server.listen(3000); |