Когда я могу считать RTCPeerConnection отключенным?

Я пытаюсь определить, когда другая сторона RTCPeerConnection отключилась. В настоящее время я делаю следующее с моим объектом RTCPeerConnection:

rtcPeerConnection.oniceconnectionstatechange = () => {
        const state = rtcPeerConnection.iceConnectionState;

        if (state === "failed" || state === "closed") {
            // connection to the peer is lost and unsalvageable, run cleanup code
        } else if (state === "disconnected") {
            // do nothing in the "disconnected" state as it appears to be a transient 
            // state that can easily return to "connected" - I've seen this with Firefox
        }
    };

Кажется, это работает в моем ограниченном тестировании с очень простыми сетевыми условиями, но следующее из MDN заставляет меня задуматься о том, что он, вероятно, не будет работать в продакшене:

Конечно, «отключено» и «закрыто» не обязательно указывают на ошибки; это может быть результатом обычного согласования ICE, поэтому обязательно обработайте их правильно (если вообще обработайте).

Должен ли я вместо этого использовать RTCPeerConnection.onconnectionstatechange и считать соединение навсегда закрытым, если RTCPeerConnection.connectionState равно "closed", "failed" или "disconnected"?


person dbotha    schedule 14.02.2020    source источник


Ответы (1)


В спецификации есть очень тщательно продуманные советы по этой теме:

Выполнение перезапуска ICE рекомендуется, когда iceConnectionState переходит в "failed". Приложение может дополнительно прослушивать переход iceConnectionState в "disconnected", а затем использовать другие источники информации (например, использование getStats для измерения увеличения количества байтов, отправленных или полученных в течение следующих нескольких секунд), чтобы определить, является ли перезапуск ICE желательно.

См. спецификацию и PR, добавивший это

Имейте в виду, что из-за ошибок Chrome больше не выходит из строя в едином плане. close может произойти только в том случае, если ваш код вызывает pc.close(), поэтому он больше не запускается в iceconnectionstatechange с Chrome 80.

person Philipp Hancke    schedule 14.02.2020