Skip to content

Commit 11ab62b

Browse files
overflowzdarrachequesne
authored andcommitted
[feature] Implement remoteDisconnect method (#177)
1 parent df7cc77 commit 11ab62b

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

index.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*

test/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,15 @@ var socket1, socket2, socket3;
242242
done();
243243
});
244244
});
245+
246+
it('makes a given socket disconnect', function(done){
247+
client1.on('disconnect', function(err){
248+
expect(err).to.be('io server disconnect');
249+
done();
250+
});
251+
252+
namespace2.adapter.remoteDisconnect(socket1.id, false);
253+
});
245254
});
246255
});
247256
});

0 commit comments

Comments
 (0)