Сервер socket.io очень задерживается при регистрации отключений клиента

У меня есть соединение с socket.io, использующее xhr в качестве единственного транспорта. Когда я загружаю приложение в браузер (проверено в chrome и ff), сокет подключается, и все работает хорошо, пока я не ухожу со страницы. Если я перезагружу браузер, я вижу «отключение»; событие отправляется клиентом, но событие отключения сервера не срабатывает в течение очень долгого времени (предположительно, когда истекает периодичность пульса клиента). Это проблема, потому что я выполняю некоторую работу по очистке на сервере, когда клиент отключается. Если клиент перезагружается, я получаю несколько событий подключения, прежде чем отключение будет запущено. Я пытался вручную выдать сообщение об отключении от клиента в окне "до загрузки". Событие тоже, но безрезультатно. Есть идеи?

Я отладил сервер socket.io и могу подтвердить, что Manager.prototype.onClientDisconnect получает удар только по «истечению времени ожидания». причины.

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

Решение Вопроса

е менеджера socket.io:

blacklist : ['disconnect']

Это приводит к тому, что эта ветка из namespace.js не обрабатывает событие:

case 'event':
  // check if the emitted event is not blacklisted
  if (-~manager.get('blacklist').indexOf(packet.name)) {
    this.log.debug('ignoring blacklisted event `' + packet.name + '`');
  } else {
    var params = [packet.name].concat(packet.args);

    if (dataAck) {
      params.push(ack);
    }

    socket.$emit.apply(socket, params);
}

Изменение подробно описано в этом запросеhttps://github.com/LearnBoost/socket.io/pull/569, Я понимаю, почему это происходит для XHR, поскольку любой может отправить HTTP-запрос со случайными идентификаторами сеанса, пытаясь отключить других пользователей от сервера.

Вместо этого я планирую проверять каждое новое соединение на наличие существующего идентификатора сеанса на сервере и обязательно запускать мою логику отключения, прежде чем продолжать логику подключения.

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