I need to be able to construct and destruct socket.io namespaces on-the-fly. It is easily to find information how to create a namespace, but I find nothing about how I remove/disconnect the namespace to release its memory.
Say I got the following code already running:
var nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');
How do I disconnect/remove the socket.io namespace created above?
socket.io rooms are a lightweight data structure. They are simply an array of connections that are associated with that room. You can have as many as you want (within normal memory usage limits). There is no heavyweight thing that makes a room expensive in terms of resources.
close([callback]) Closes the socket.io server. The callback argument is optional and will be called when all connections are closed.
You don't need to store this data in database. It can be stored in memory as arrays of objects or map of objects.
As some have commented below, this is only applicable to Socket.IO version <3
Actually, by just deleting the namespace from the server nsps
array you will not free any memory and sockets will still remain connected since there are still pointers to the Namespace in memory, so it will not be Garbage Collected... If what you want is to completely empty the resource you should
For example
const MyNamespace = io.of('/my-namespace'); // Get Namespace
const connectedNameSpaceSockets = Object.keys(MyNamespace.connected); // Get Object with Connected SocketIds as properties
connectedNameSpaceSockets.forEach(socketId => {
MyNamespace.connected[socketId].disconnect(); // Disconnect Each socket
});
MyNamespace.removeAllListeners(); // Remove all Listeners for the event emitter
delete io.nsps['/my-namespace']; // Remove from the server namespaces
The io.of
method just creates an array element:
Server.prototype.of = function(name, fn){
if (String(name)[0] !== '/') name = '/' + name;
if (!this.nsps[name]) {
debug('initializing namespace %s', name);
var nsp = new Namespace(this, name);
this.nsps[name] = nsp;
}
if (fn) this.nsps[name].on('connect', fn);
return this.nsps[name];
};
So I assume you could just delete it from the array in socket io. I tested it pretty quick and it seems to work. Sockets that are already connected, keep connected.
delete io.nsps['/my-namespace'];
Connecting to /my-namespace
then falls back to the default namespace. I don't know if this is a good solution, but maybe you can play with this a little..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With