Heartbeat-сигналы WebSocket в браузере требуют прикладного протокола
Спроектируйте согласованный прикладной heartbeat, когда JavaScript в браузере не может напрямую отправлять кадры WebSocket Ping.
WebSocket API браузера имеет send(). Он не предоставляет общий метод ping(), которым JavaScript мог бы отправлять кадры Ping протокола.
Если ваше приложение отправляет текстовое сообщение, например {"type":"heartbeat"}, это прикладные данные. Сервер должен понимать сообщение и определять ответ. Сервер, не реализующий этот контракт, не обязан отвечать протокольным Pong только потому, что в тексте есть слово ping.
Определите, что означает подтверждение, как оно идентифицирует ожидающий heartbeat и когда старое подтверждение приходит слишком поздно. Держите это отдельно от подтверждения бизнес-операции.
У таймера JavaScript тоже есть ограничения планирования. Фоновые вкладки и занятые главные потоки могут задерживать обратные вызовы. Не трактуйте пропущенную точную границу таймера как решающее доказательство того, что прокси перестал пересылать данные.
Браузер может обрабатывать управляющие кадры протокола внутри себя, но это не даёт прикладному коду переносимого представления о каждом Ping или Pong. Если странице нужно собственное решение о живости, используйте явный прикладной контракт и политику восстановления.
Сокет, у которого readyState равно OPEN, локально считается открытым; это не независимое измерение того, что удалённое приложение обработало ваше последнее сообщение. Используйте доказательства, соответствующие вопросу, на который вам действительно нужно ответить.