diff options
author | Freeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace> | 2013-05-13 13:52:58 +1200 |
---|---|---|
committer | Freeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace> | 2013-05-13 13:52:58 +1200 |
commit | b36fb8abe8efdd2304fb7f215c4bc781ced021c9 (patch) | |
tree | a4d396339002436108cddec2e95a55b713a51a11 /index.js | |
parent | e0c3142731003bf60851a2827757f0f4b7dc759a (diff) | |
download | manavis-b36fb8abe8efdd2304fb7f215c4bc781ced021c9.tar.gz manavis-b36fb8abe8efdd2304fb7f215c4bc781ced021c9.tar.bz2 manavis-b36fb8abe8efdd2304fb7f215c4bc781ced021c9.tar.xz manavis-b36fb8abe8efdd2304fb7f215c4bc781ced021c9.zip |
Ghost multiple session connections
Multiple connections could be made from the same session,
which could cause issues when they disconnected in turn.
Diffstat (limited to 'index.js')
-rw-r--r-- | index.js | 16 |
1 files changed, 16 insertions, 0 deletions
@@ -34,6 +34,10 @@ logger.format = function(level, date, message) { var count = 0; /* nid -> { nick, filters, following } */ var users = {}; +/* nid -> socket */ +var sockets = {}; +/* FIXME: Workaround to prevent logout propagating during ghosting */ +var ghosting = false; sessionSockets.on('connection', function (err, socket, session) { /* @@ -45,6 +49,13 @@ sessionSockets.on('connection', function (err, socket, session) { session.nid = session.nid || (++count); session.nick = session.nick || null; session.save(); + if (session.nid in sockets) { + /* Ghost the old session */ + ghosting = true; + sockets[session.nid].disconnect(); + ghosting = false; + } + sockets[session.nid] = socket; /* New user! */ logAction("CONNECT", socket.handshake.address.address); users[session.nid] = { nick: session.nick, filters: {} }; @@ -86,7 +97,12 @@ sessionSockets.on('connection', function (err, socket, session) { }); }); socket.on('disconnect', function() { + if (ghosting) { + logAction("GHOSTED"); + return; + } logAction("DISCONNECT"); + delete sockets[session.nid]; delete users[session.nid]; socket.broadcast.emit('logout', { id: session.nid |