@@ -27,6 +27,7 @@ var requestTypes = {
2727 remoteJoin : 3 ,
2828 remoteLeave : 4 ,
2929 customRequest : 5 ,
30+ remoteDisconnect : 6
3031} ;
3132
3233/**
@@ -259,6 +260,20 @@ function adapter(uri, opts) {
259260 socket . leave ( request . room , sendAck ) ;
260261 break ;
261262
263+ case requestTypes . remoteDisconnect :
264+
265+ var socket = this . nsp . connected [ request . sid ] ;
266+ if ( ! socket ) { return ; }
267+
268+ socket . disconnect ( request . close ) ;
269+
270+ var response = JSON . stringify ( {
271+ requestid : request . requestid
272+ } ) ;
273+
274+ pub . publish ( self . responseChannel , response ) ;
275+ break ;
276+
262277 case requestTypes . customRequest :
263278 var data = this . customHook ( request . data ) ;
264279
@@ -345,6 +360,7 @@ function adapter(uri, opts) {
345360
346361 case requestTypes . remoteJoin :
347362 case requestTypes . remoteLeave :
363+ case requestTypes . remoteDisconnect :
348364 clearTimeout ( request . timeout ) ;
349365 if ( request . callback ) process . nextTick ( request . callback . bind ( null , null ) ) ;
350366 delete self . requests [ request . requestid ] ;
@@ -717,6 +733,46 @@ function adapter(uri, opts) {
717733 pub . publish ( self . requestChannel , request ) ;
718734 } ;
719735
736+ /**
737+ * Makes the socket with the given id to be disconnected forcefully
738+ * @param {String } socket id
739+ * @param {Boolean } close if `true`, closes the underlying connection
740+ * @param {Function } callback
741+ */
742+
743+ Redis . prototype . remoteDisconnect = function ( id , close , fn ) {
744+ var self = this ;
745+ var requestid = uid2 ( 6 ) ;
746+
747+ var socket = this . nsp . connected [ id ] ;
748+ if ( socket ) {
749+ socket . disconnect ( close ) ;
750+ if ( fn ) process . nextTick ( fn . bind ( null , null ) ) ;
751+ return ;
752+ }
753+
754+ var request = JSON . stringify ( {
755+ requestid : requestid ,
756+ type : requestTypes . remoteDisconnect ,
757+ sid : id ,
758+ close : close
759+ } ) ;
760+
761+ // if there is no response for x second, return result
762+ var timeout = setTimeout ( function ( ) {
763+ if ( fn ) process . nextTick ( fn . bind ( null , new Error ( 'timeout reached while waiting for remoteDisconnect response' ) ) ) ;
764+ delete self . requests [ requestid ] ;
765+ } , self . requestsTimeout ) ;
766+
767+ self . requests [ requestid ] = {
768+ type : requestTypes . remoteDisconnect ,
769+ callback : fn ,
770+ timeout : timeout
771+ } ;
772+
773+ pub . publish ( self . requestChannel , request ) ;
774+ } ;
775+
720776 /**
721777 * Sends a new custom request to other nodes
722778 *
0 commit comments