Socket.io: как правильно входить и выходить из комнат

Я пытаюсь изучить Socket.io, создавая набор динамически создаваемых чатов, которые выдают «подключенные» и «отключенные» сообщения, когда пользователи входят и выходят. Посмотрев напара из вопросы Я собрал что-то функциональное, но большая часть ответов связана с людьми, которые признают, что они взломали вместе ответы, и я заметил, что есть более общая - и недавняя - дискуссия о правильном способе сделать это на Socket.io репо (особенноВот а такжеВот)

Поскольку я такой новичок, я не знаю, является ли работа, представленная ниже, приемлемым способом выполнения каких-либо действий, или это просто происходит случайно, но вызывает проблемы с производительностью или приводит к слишком большому количеству слушателей. Если есть идеальный - и официальный - способ присоединиться и покинуть комнаты, которые кажутся менее неуклюжими, чем этот, я бы хотел узнать об этом.

клиент

var roomId = ChatRoomData._id // comes from a factory


function init() {

    // Make sure the Socket is connected
    if (!Socket.socket) {
        Socket.connect();
    }

    // Sends roomId to server
    Socket.on('connect', function() {
        Socket.emit('room', roomId);
    });

    // Remove the event listener when the controller instance is destroyed
    $scope.$on('$destroy', function () {
        Socket.removeListener('connect');
    });

}

init();

сервер

  io.sockets.once('connection', function(socket){
    socket.on('room', function(room){     // take room variable from client side
      socket.join(room) // and join it

      io.sockets.in(room).emit('message', {      // Emits a status message to the connect room when a socket client is connected
        type: 'status',
        text: 'Is now connected',
        created: Date.now(),
        username: socket.request.user.username
      });

      socket.on('disconnect', function () {   // Emits a status message to the connected room when a socket client is disconnected
        io.sockets.in(room).emit({ 
          type: 'status',
          text: 'disconnected',
          created: Date.now(),
          username: socket.request.user.username
        });  
      })
  });

Ответы на вопрос(1)

Ваш ответ на вопрос