Ответ 1
Ошибка времени подключения WebSocket
вызывает отправленное событие, а не сброшенное значение. Это связано с тем, что операции throw
должны быть синхронными. Чтобы обрабатывать все ошибки времени соединения в качестве ошибочных ошибок, конструктор WebSocket
должен был бы полностью приостановить все действия script и взаимодействие с пользовательским интерфейсом до тех пор, пока не будет завершено все рукопожатие WebSocket. Вместо этого процесс соединения выполняется асинхронно, тем самым позволяя потоку браузера продолжать работать, пока соединение WebSocket инициализируется в фоновом режиме. Из-за асинхронного характера соединения WebSocket
должен сообщать об ошибках через события error
, так как синхронная операция new WebSocket
уже завершена к тому моменту, когда задача асинхронного подключения обнаруживает ошибку.
Сообщение ERR_CONNECTION_REFUSED
, которое вы видите, предназначено исключительно для разработчиков; он не доступен для script каким-либо образом. Он не имеет никакого представления в среде JavaScript. Это просто красноватое сообщение, которое появляется на консоли, чтобы сообщить вам, человеку, смотрящему в браузере, об ошибке.
Событие обработчика error
- это правильное место для ответа на сбой, но недостаток script - доступная информация об ошибках времени соединения - по дизайну. Из спецификации WHATWG для API WebSocket:
Пользовательские агенты не должны передавать информацию о сбоях в сценарии таким образом, чтобы позволить script различать следующие ситуации:
- Сервер, имя хоста которого не может быть разрешено.
- Сервер, на который пакеты не могут быть успешно перенаправлены.
- Сервер, который отказался от соединения на указанном порту.
- Сервер, который не смог правильно выполнить рукопожатие TLS (например, сертификат сервера не может быть проверен).
- Сервер, который не завершил начальное рукопожатие (например, потому что это не сервер WebSocket).
- Сервер WebSocket, который отправил правильное начальное рукопожатие, но указанные параметры, которые заставили клиента отказаться от соединения (например, сервер указал подпротокол, который клиент не предлагал).
- Сервер WebSocket, который внезапно закрыл соединение после успешного завершения открытия рукопожатия.
[...] Разрешение script отличать эти случаи позволило бы script исследовать локальную сеть пользователя при подготовке к атаке.
В браузере умышленно отсутствует какая-либо полезная информация, требуемая спецификацией. Авторы спецификаций обеспокоены тем, что доступ к этой информации может позволить злонамеренной веб-странице получать информацию о вашей сети, поэтому они требуют, чтобы браузеры сообщали о всех ошибках времени соединения неразличимым способом.