WebRTC - RTCPeerConnection.onconnectionstatechange выстреливает RTCPeerConnection.connectionState = 'disconnected' без какой либо причины

SuperYegorius

New Member
Я работаю над браузерным WebRTC приложением для видео конференций. На моей локальной машине все работает отлично, но когда я пытаюсь затестить приложение в реальный условиях на нескольких компах через интернет RTCPeerConnection.onconnectionstatechange выстреливает RTCPeerConnection.connectionState = 'disconnected' без какой либо причины после 20-30 секунд успешной работы. Еще одна очень странная деталь это то что если например у меня есть peer2 и peer3 открытые в разных вкладках одного браузера и к ним подключен peer1 и peer1 раздает им видеопоток то после 20-30 секунд успешной коммуникации RTCPeerConnection.connectionState = 'disconnected' может выстрелить у peer2 и в то же время peer3 будет продолжать получать видеопоток от peer1. Я гуглил не одну неделю - самое вменяемое из того что нашел так это вот такую проверку (которая к сожалению не работает):
Code:
this.myRTCMediaMediatorConnections[id][hash].onconnectionstatechange=async function(e){
    log('onSignalingServerMediaMediatorOfferFunc.myRTCMediaMediatorConnections['+id+']['+hash+'].onconnectionstatechange('+This.myRTCMediaMediatorConnections[id][hash].connectionState+')',10,true)
    switch(This.myRTCMediaMediatorConnections[id][hash].connectionState){
        case "failed":
            This.disconnectMeFromMediatorConnection(targetId,logicGroupName,streamerId,streamerHash,id,hash)
            break
        case "closed":
            This.disconnectMeFromMediatorConnection(targetId,logicGroupName,streamerId,streamerHash,id,hash)
            break
        case "disconnected":
            if(await This.confirmPeerDisconnection(This.myRTCMediaMediatorConnections[id][hash]))This.disconnectMeFromConnection(targetId,logicGroupName,streamerId,streamerHash,id,hash)
            break
    }
    log('onSignalingServerMediaMediatorOfferFunc.myRTCMediaMediatorConnections['+id+']['+hash+'].onconnectionstatechange',10,false)
}   

this.confirmPeerDisconnection=async function(connectionObject){
    log('confirmPeerDisconnection',10,true)
    var b1=await this.confirmPeerDisconnectionFunc(connectionObject);
    await new Promise(resolve=>setTimeout(resolve,2000));
    var b2=await this.confirmPeerDisconnectionFunc(connectionObject);
    log('confirmPeerDisconnection=>'+(b2-b1),10,false)
    if(b2-b1>0)return false
    return true;
}

this.confirmPeerDisconnectionFunc=async function(connectionObject){
    var b=0
    await connectionObject.getStats(null).then(function(stats){
        stats.forEach((report)=>{if(report.type=='transport')Object.keys(report).forEach((statName)=>{if(statName==='bytesReceived')b=parseInt(report[statName])})})
    })
    return b
}
b2-b1 всегда равны 0. Буду благодарен если поможете разобраться с этой проблемой!

Заранее благодарен за любую помощь!
 
Top