summaryrefslogtreecommitdiff
path: root/index.js
diff options
context:
space:
mode:
authorFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-05-06 01:17:47 +1200
committerFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-05-13 00:40:07 +1200
commit2b3bf882d6b53f09e0dddf3f8d4f159832471fb3 (patch)
treeaeab8858a8095d8b21b7e6d5e086c542028924f7 /index.js
parentf2c37f5801456d447b3c92dd90b9674a52f6e886 (diff)
downloadmanavis-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.js99
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);