Принялся за изучение JS, решил начать с простого чата. Собственно возникла проблема.
Итак, у меня есть объект ChatServer, в котором реализуется создаётся объект socket.io, и реализуется работа с подключением и отключением клиентов.
"use strict";
var SocketServer = require('socket.io')
, Client = require('./Client.js');
class ChatServer {
constructor(app, http) {
var io = SocketServer(http)
, clients = {};
io.on('connection', function(socket) {
console.log('Client ' + socket.id + ' connected');
clients[socket.id] = new Client(app, socket);
socket.on('disconnect', function() {
console.log('Client ' + socket.id + ' disconnected');
clients[socket.id] = undefined;
delete clients[socket.id];
});
});
}
}
module.exports = ChatServer;
При подключении клиента создаётся объект Client, в котором реализуется обработка сообщений, для этого, конкретного клиента.
"use strict";
class Client {
constructor(app, socket) {
this.app = app;
this.socket = socket;
this.app.on('chat.sendMessage', this.sendMessage.bind(this));
}
sendMessage(message) {
console.log('Client ' + this.socket.id + ' on chat.sendMessage');
this.socket.emit('chat.sendMessage', message);
}
}
module.exports = Client;
app - это EventEmitter, из которого периодически приходят сообщения chat.sendMessage (для тестирования), в клиентах сообщения принимаются и отправляются в браузер.
Однако при одключении клиента объект клиента никуда не девается, и продолжает ловить сообщения, и слать в отключенный сокет. Я так понимаю, что отключенный сокет тоже никуда не девается и отличается только свойствами connected/disconnected.
Client ZbEFj8ykXba9CxLiAAAA connected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA disconnected
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Client ZbEFj8ykXba9CxLiAAAA on chat.sendMessage
Я, видимо, не до конца понимаю механику прибивания объектов, знаю что для этого нужно удалить все ссылки на него, что, тут и сделано.
clients[socket.id] = undefined;
delete clients[socket.id];
Однако, судя по всему, этого мало. Вот собственно и вопрос - что можно сделать с этим?