From 82c4c5fc930798c3e4cadbf776224af4be55c553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Paw=C5=82owski?= Date: Fri, 3 Nov 2017 13:07:40 +0100 Subject: [PATCH] Removing clients data when disconnected during authentication process --- scserver.js | 6 +++--- test/integration.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/scserver.js b/scserver.js index 3e617ca..44e0bd6 100644 --- a/scserver.js +++ b/scserver.js @@ -491,6 +491,9 @@ SCServer.prototype._handleSocketConnection = function (wsSocket, upgradeReq) { var signedAuthToken = data.authToken || null; clearTimeout(scSocket._handshakeTimeoutRef); + self.clients[id] = scSocket; + self.clientsCount++; + self._processAuthToken(scSocket, signedAuthToken, function (err, isBadToken) { var status = { id: scSocket.id, @@ -510,9 +513,6 @@ SCServer.prototype._handleSocketConnection = function (wsSocket, upgradeReq) { } status.isAuthenticated = !!scSocket.authToken; - self.clients[id] = scSocket; - self.clientsCount++; - scSocket.state = scSocket.OPEN; scSocket.exchange = scSocket.global = self.exchange; diff --git a/test/integration.js b/test/integration.js index 3531c56..9f0dbab 100644 --- a/test/integration.js +++ b/test/integration.js @@ -483,5 +483,37 @@ describe('integration tests', function () { }); }); }); + + it('should remove client data from server when client disconnect before authentication process finished', function (done) { + var port = 8017; + server = socketClusterServer.listen(port, { + authKey: serverOptions.authKey + }); + server.setAuthEngine({ + verifyToken: function (signedAuthToken, verificationKey, defaultVerificationOptions, callback) { + setTimeout(function () { + callback(null, {}) + }, 500) + } + }); + server.on('connection', connectionHandler); + server.on('ready', function () { + client = socketCluster.connect({ + hostname: clientOptions.hostname, + port: port, + multiplex: false + }); + setTimeout(function () { + assert.equal(Object.keys( server.clients ).length, 1); + assert.equal(server.clientsCount, 1); + client.disconnect(); + }, 100); + setTimeout(function () { + assert.equal(Object.keys( server.clients ).length, 0); + assert.equal(server.clientsCount, 0); + done(); + }, 1000); + }); + }); }); });