summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-05-13 13:52:58 +1200
committerFreeyorp <TheFreeYorp@NOSPAM.G.m.a.i.l.replace>2013-05-13 13:52:58 +1200
commitb36fb8abe8efdd2304fb7f215c4bc781ced021c9 (patch)
treea4d396339002436108cddec2e95a55b713a51a11
parente0c3142731003bf60851a2827757f0f4b7dc759a (diff)
downloadmanavis-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.
-rw-r--r--index.js16
1 files changed, 16 insertions, 0 deletions
diff --git a/index.js b/index.js
index 2ff58d5..625444d 100644
--- a/index.js
+++ b/index.js
@@ -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