Socket.io: como entrar e sair corretamente dos quartos

Estou tentando aprender o Socket.io criando um conjunto de salas de bate-papo criadas dinamicamente que emitem mensagens 'conectadas' e 'desconectadas' quando os usuários entram e saem. Depois de olhar para umcasal do questões Reuni algo funcional, mas a maioria das respostas vinculadas são de pessoas que admitem ter hackeado as respostas e notei que há uma discussão mais geral - e recente - sobre a maneira correta de fazer isso no Socket.io repo (principalmenteaqui eaqui)

Como eu sou um novato, não sei se o trabalho abaixo é uma maneira aceitável de fazer as coisas ou simplesmente funciona acidentalmente, mas causará problemas de desempenho ou resultará em muitos ouvintes. Se houver uma maneira ideal - e oficial - de entrar e sair de salas que pareçam menos desajeitadas do que isso, eu adoraria aprender sobre isso.

Cliente

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();

Servidor

  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
        });  
      })
  });

questionAnswers(1)

yourAnswerToTheQuestion