У вас на сервере id это глобальная переменная. Вы правда не видите в этом проблемы?
На сервере одновременно могут обрабатываться сообщения от тысяч клиентов, но из-за использования глобальной переменной все ответы уйдут тому, кто подключился последним.
id = Object.keys(clients).length + 1;
А эта, на первый взгляд, безобидная строка будет присваивать существующие id c последующей потерей активных соединений из объекта clients.