Обнаружение того, что браузер-сверстник закрыт в видеочате webrtc

Я использую видеочат webrtc.

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

Я пытался обработать это событие, реализовав встроенный обратный вызов удаленного медиа-потока. Хотя этот обратный вызов, похоже, никогда не называется.

Как я могу обнаружить, что браузер-сверстник закрыт или соединение завершено с другой стороны?

Ответ 1

Чтобы определить это, вы можете использовать статус соединения ICE. Если вы отключите один одноранговый узел, требуется несколько секунд (~ 5?) Для его повторной генерации, но он работает даже без сервера сигнализации.

(предполагая, что вы вызвали ваше одноранговое соединение pc)

pc.oniceconnectionstatechange = function() {
    if(pc.iceConnectionState == 'disconnected') {
        console.log('Disconnected');
    }
}

Ответ 2

Использовать шлюз сигнализации для отправки сообщения всем подключенным одноранговым узлам, которые вы оставляете; например:

window.addEventListener('beforeunload', function () {
    userLeft();
}, false);

window.addEventListener('keyup', function (e) {
    if (e.keyCode == 116)
        userLeft();
}, false);

function userLeft() {
    signalingGateway.send({
        userLeft: true,
        whoLeft: 'user-id'
    });
}

signalingGateway.on('message', function (signal) {
    if (signal.userLeft && signal.whoLeft != 'current-user-id') {
        var relevantPeer = listOfPeers[signal.whoLeft];
        if (relevantPeer) {
            relevantPeer.close();
            relevantPeer = null;
        }

        var relevantLocalStreams = listOfLocalStreams[signal.whoLeft];
        if (relevantLocalStreams.length) {
            for (var i = 0; i < relevantLocalStreams.length; i++) {
                if (relevantLocalStreams[i].stop) {
                    relevantLocalStreams[i].stop();
                }

                // it is suggested to stop media tracks instead!
            }
        }
    }
});

Ответ 3

Просто используйте

 connection.onclose = function(event){
    event.useid // gives the connection closed userid
 }