Fala Owner, tudo bem contigo?
Eu já desenvolvi algumas aplicações utilizando de WebSockets, também usando o socket.io, e uma delas inclui coisas parecidas com o que você está mencionando.
Era um jogo, exemplo Wordle, porém competitivo, um dependia do outro, projeto da faculdade mesmo. Todos os membros estão logados e quando eles faziam alguma ação, o socket precisava enviar isso para o servidor e existia um namespace para a sala, e todos os sockets com aquele namespace eram "broadcastados" sobre a nova medida.
Seu problema primeiramente: O que pode estar acontecendo contigo é um timeout da conexão, as vezes, o ws fecha num timeout, e existe uma propriedade chamada de heartbeat, que mantém o socket ativo mesmo com a demora do retorno, também tem o (ping e pong) no socket.io.
Agora vem minhas sugestões, eu utilizava um servidor no Express e relacionava a sessão do usuário com o socketio, via Redis, para guardar os estados sempre. Porém, localmente tudo funcionava certinho e eu hospedava numa plataforma (Cyclic) pelo que eu me lembro, que não permitia o uso do protocolo ws, portanto acabei usando um negócio chamado pooling, que simula um websocket, porém, ele gera muitos requests e minha conta foi para as alturas, foi incompetência minha, não tinha me ligado que estava com o pooling habilitado.
Melhor coisa que fiz, utilizei o redis-store no expressjs, fiquei meio perdido tentando relacionar sessão e socket via banco de dados por um tempo, mas valeu o apreendizado.
Abraço grande! Qualquer ajuda só mandar aqui, eu abro o tabnews com alguma frequência.