@@ -54,7 +54,8 @@ var SCServer = function (options) {
54
54
55
55
this . options = opts ;
56
56
57
- this . MIDDLEWARE_HANDSHAKE = 'handshake' ;
57
+ this . MIDDLEWARE_HANDSHAKE_WS = 'handshakeWS' ;
58
+ this . MIDDLEWARE_HANDSHAKE_SC = 'handshakeSC' ;
58
59
this . MIDDLEWARE_EMIT = 'emit' ;
59
60
this . MIDDLEWARE_SUBSCRIBE = 'subscribe' ;
60
61
this . MIDDLEWARE_PUBLISH_IN = 'publishIn' ;
@@ -65,7 +66,8 @@ var SCServer = function (options) {
65
66
this . MIDDLEWARE_PUBLISH = this . MIDDLEWARE_PUBLISH_IN ;
66
67
67
68
this . _middleware = { } ;
68
- this . _middleware [ this . MIDDLEWARE_HANDSHAKE ] = [ ] ;
69
+ this . _middleware [ this . MIDDLEWARE_HANDSHAKE_WS ] = [ ] ;
70
+ this . _middleware [ this . MIDDLEWARE_HANDSHAKE_SC ] = [ ] ;
69
71
this . _middleware [ this . MIDDLEWARE_EMIT ] = [ ] ;
70
72
this . _middleware [ this . MIDDLEWARE_SUBSCRIBE ] = [ ] ;
71
73
this . _middleware [ this . MIDDLEWARE_PUBLISH_IN ] = [ ] ;
@@ -557,56 +559,64 @@ SCServer.prototype._handleSocketConnection = function (wsSocket, upgradeReq) {
557
559
var signedAuthToken = data . authToken || null ;
558
560
clearTimeout ( scSocket . _handshakeTimeoutRef ) ;
559
561
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 ) ;
562
567
return ;
563
568
}
569
+ self . _processAuthToken ( scSocket , signedAuthToken , function ( err , isBadToken ) {
570
+ if ( scSocket . state == scSocket . CLOSED ) {
571
+ return ;
572
+ }
564
573
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
+ } ;
580
582
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
+ }
583
593
}
584
594
}
585
- }
586
- clientSocketStatus . isAuthenticated = ! ! scSocket . authToken ;
587
- serverSocketStatus . isAuthenticated = clientSocketStatus . isAuthenticated ;
595
+ clientSocketStatus . isAuthenticated = ! ! scSocket . authToken ;
596
+ serverSocketStatus . isAuthenticated = clientSocketStatus . isAuthenticated ;
588
597
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 ++ ;
595
604
596
- scSocket . state = scSocket . OPEN ;
605
+ scSocket . state = scSocket . OPEN ;
597
606
598
- scSocket . emit ( 'connect' , serverSocketStatus ) ;
599
- scSocket . emit ( '_connect' , serverSocketStatus ) ;
607
+ scSocket . emit ( 'connect' , serverSocketStatus ) ;
608
+ scSocket . emit ( '_connect' , serverSocketStatus ) ;
600
609
601
- self . emit ( '_connection' , scSocket , serverSocketStatus ) ;
602
- self . emit ( 'connection' , scSocket , serverSocketStatus ) ;
610
+ self . emit ( '_connection' , scSocket , serverSocketStatus ) ;
611
+ self . emit ( 'connection' , scSocket , serverSocketStatus ) ;
603
612
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
+ } ) ;
610
620
} ) ;
611
621
} ) ;
612
622
} ;
@@ -659,17 +669,17 @@ SCServer.prototype.verifyHandshake = function (info, cb) {
659
669
}
660
670
661
671
if ( ok ) {
662
- var handshakeMiddleware = this . _middleware [ this . MIDDLEWARE_HANDSHAKE ] ;
672
+ var handshakeMiddleware = this . _middleware [ this . MIDDLEWARE_HANDSHAKE_WS ] ;
663
673
if ( handshakeMiddleware . length ) {
664
674
var callbackInvoked = false ;
665
675
async . applyEachSeries ( handshakeMiddleware , req , function ( err ) {
666
676
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' ) ) ;
668
678
} else {
669
679
callbackInvoked = true ;
670
680
if ( err ) {
671
681
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 ) ;
673
683
} else if ( self . middlewareEmitWarnings ) {
674
684
self . emit ( 'warning' , err ) ;
675
685
}
@@ -872,6 +882,33 @@ SCServer.prototype._passThroughAuthenticateMiddleware = function (options, cb) {
872
882
) ;
873
883
} ;
874
884
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
+
875
912
SCServer . prototype . verifyOutboundEvent = function ( socket , eventName , eventData , options , cb ) {
876
913
var self = this ;
877
914
0 commit comments