Skip to content

Commit c1625db

Browse files
committed
Made improvements to handshake middleware
Renamed MIDDLEWARE_HANDSHAKE to MIDDLEWARE_HANDSHAKE_WS and added a new MIDDLEWARE_HANDSHAKE_SC middleware to deal with the SocketCluster handshake.
1 parent 2298351 commit c1625db

File tree

1 file changed

+81
-44
lines changed

1 file changed

+81
-44
lines changed

scserver.js

Lines changed: 81 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ var SCServer = function (options) {
5454

5555
this.options = opts;
5656

57-
this.MIDDLEWARE_HANDSHAKE = 'handshake';
57+
this.MIDDLEWARE_HANDSHAKE_WS = 'handshakeWS';
58+
this.MIDDLEWARE_HANDSHAKE_SC = 'handshakeSC';
5859
this.MIDDLEWARE_EMIT = 'emit';
5960
this.MIDDLEWARE_SUBSCRIBE = 'subscribe';
6061
this.MIDDLEWARE_PUBLISH_IN = 'publishIn';
@@ -65,7 +66,8 @@ var SCServer = function (options) {
6566
this.MIDDLEWARE_PUBLISH = this.MIDDLEWARE_PUBLISH_IN;
6667

6768
this._middleware = {};
68-
this._middleware[this.MIDDLEWARE_HANDSHAKE] = [];
69+
this._middleware[this.MIDDLEWARE_HANDSHAKE_WS] = [];
70+
this._middleware[this.MIDDLEWARE_HANDSHAKE_SC] = [];
6971
this._middleware[this.MIDDLEWARE_EMIT] = [];
7072
this._middleware[this.MIDDLEWARE_SUBSCRIBE] = [];
7173
this._middleware[this.MIDDLEWARE_PUBLISH_IN] = [];
@@ -557,56 +559,64 @@ SCServer.prototype._handleSocketConnection = function (wsSocket, upgradeReq) {
557559
var signedAuthToken = data.authToken || null;
558560
clearTimeout(scSocket._handshakeTimeoutRef);
559561

560-
self._processAuthToken(scSocket, signedAuthToken, function (err, isBadToken) {
561-
if (scSocket.state == scSocket.CLOSED) {
562+
self._passThroughHandshakeSCMiddleware({
563+
socket: scSocket
564+
}, function (err) {
565+
if (err) {
566+
respond(err);
562567
return;
563568
}
569+
self._processAuthToken(scSocket, signedAuthToken, function (err, isBadToken) {
570+
if (scSocket.state == scSocket.CLOSED) {
571+
return;
572+
}
564573

565-
var clientSocketStatus = {
566-
id: scSocket.id,
567-
pingTimeout: self.pingTimeout
568-
};
569-
var serverSocketStatus = {
570-
id: scSocket.id,
571-
pingTimeout: self.pingTimeout
572-
};
573-
574-
if (err) {
575-
if (signedAuthToken != null) {
576-
// Because the token is optional as part of the handshake, we don't count
577-
// it as an error if the token wasn't provided.
578-
clientSocketStatus.authError = scErrors.dehydrateError(err);
579-
serverSocketStatus.authError = err;
574+
var clientSocketStatus = {
575+
id: scSocket.id,
576+
pingTimeout: self.pingTimeout
577+
};
578+
var serverSocketStatus = {
579+
id: scSocket.id,
580+
pingTimeout: self.pingTimeout
581+
};
580582

581-
if (isBadToken) {
582-
scSocket.deauthenticate();
583+
if (err) {
584+
if (signedAuthToken != null) {
585+
// Because the token is optional as part of the handshake, we don't count
586+
// it as an error if the token wasn't provided.
587+
clientSocketStatus.authError = scErrors.dehydrateError(err);
588+
serverSocketStatus.authError = err;
589+
590+
if (isBadToken) {
591+
scSocket.deauthenticate();
592+
}
583593
}
584594
}
585-
}
586-
clientSocketStatus.isAuthenticated = !!scSocket.authToken;
587-
serverSocketStatus.isAuthenticated = clientSocketStatus.isAuthenticated;
595+
clientSocketStatus.isAuthenticated = !!scSocket.authToken;
596+
serverSocketStatus.isAuthenticated = clientSocketStatus.isAuthenticated;
588597

589-
if (self.pendingClients[id]) {
590-
delete self.pendingClients[id];
591-
self.pendingClientsCount--;
592-
}
593-
self.clients[id] = scSocket;
594-
self.clientsCount++;
598+
if (self.pendingClients[id]) {
599+
delete self.pendingClients[id];
600+
self.pendingClientsCount--;
601+
}
602+
self.clients[id] = scSocket;
603+
self.clientsCount++;
595604

596-
scSocket.state = scSocket.OPEN;
605+
scSocket.state = scSocket.OPEN;
597606

598-
scSocket.emit('connect', serverSocketStatus);
599-
scSocket.emit('_connect', serverSocketStatus);
607+
scSocket.emit('connect', serverSocketStatus);
608+
scSocket.emit('_connect', serverSocketStatus);
600609

601-
self.emit('_connection', scSocket, serverSocketStatus);
602-
self.emit('connection', scSocket, serverSocketStatus);
610+
self.emit('_connection', scSocket, serverSocketStatus);
611+
self.emit('connection', scSocket, serverSocketStatus);
603612

604-
if (clientSocketStatus.isAuthenticated) {
605-
scSocket.emit('authenticate', scSocket.authToken);
606-
self.emit('authentication', scSocket, scSocket.authToken);
607-
}
608-
// Treat authentication failure as a 'soft' error
609-
respond(null, clientSocketStatus);
613+
if (clientSocketStatus.isAuthenticated) {
614+
scSocket.emit('authenticate', scSocket.authToken);
615+
self.emit('authentication', scSocket, scSocket.authToken);
616+
}
617+
// Treat authentication failure as a 'soft' error
618+
respond(null, clientSocketStatus);
619+
});
610620
});
611621
});
612622
};
@@ -659,17 +669,17 @@ SCServer.prototype.verifyHandshake = function (info, cb) {
659669
}
660670

661671
if (ok) {
662-
var handshakeMiddleware = this._middleware[this.MIDDLEWARE_HANDSHAKE];
672+
var handshakeMiddleware = this._middleware[this.MIDDLEWARE_HANDSHAKE_WS];
663673
if (handshakeMiddleware.length) {
664674
var callbackInvoked = false;
665675
async.applyEachSeries(handshakeMiddleware, req, function (err) {
666676
if (callbackInvoked) {
667-
self.emit('warning', new InvalidActionError('Callback for ' + self.MIDDLEWARE_HANDSHAKE + ' middleware was already invoked'));
677+
self.emit('warning', new InvalidActionError('Callback for ' + self.MIDDLEWARE_HANDSHAKE_WS + ' middleware was already invoked'));
668678
} else {
669679
callbackInvoked = true;
670680
if (err) {
671681
if (err === true) {
672-
err = new SilentMiddlewareBlockedError('Action was silently blocked by ' + self.MIDDLEWARE_HANDSHAKE + ' middleware', self.MIDDLEWARE_HANDSHAKE);
682+
err = new SilentMiddlewareBlockedError('Action was silently blocked by ' + self.MIDDLEWARE_HANDSHAKE_WS + ' middleware', self.MIDDLEWARE_HANDSHAKE_WS);
673683
} else if (self.middlewareEmitWarnings) {
674684
self.emit('warning', err);
675685
}
@@ -872,6 +882,33 @@ SCServer.prototype._passThroughAuthenticateMiddleware = function (options, cb) {
872882
);
873883
};
874884

885+
SCServer.prototype._passThroughHandshakeSCMiddleware = function (options, cb) {
886+
var self = this;
887+
var callbackInvoked = false;
888+
889+
var request = {
890+
socket: options.socket
891+
};
892+
893+
async.applyEachSeries(this._middleware[this.MIDDLEWARE_HANDSHAKE_SC], request,
894+
function (err) {
895+
if (callbackInvoked) {
896+
self.emit('warning', new InvalidActionError('Callback for ' + self.MIDDLEWARE_HANDSHAKE_SC + ' middleware was already invoked'));
897+
} else {
898+
callbackInvoked = true;
899+
if (err) {
900+
if (err === true) {
901+
err = new SilentMiddlewareBlockedError('Action was silently blocked by ' + self.MIDDLEWARE_HANDSHAKE_SC + ' middleware', self.MIDDLEWARE_HANDSHAKE_SC);
902+
} else if (self.middlewareEmitWarnings) {
903+
self.emit('warning', err);
904+
}
905+
}
906+
cb(err);
907+
}
908+
}
909+
);
910+
};
911+
875912
SCServer.prototype.verifyOutboundEvent = function (socket, eventName, eventData, options, cb) {
876913
var self = this;
877914

0 commit comments

Comments
 (0)