SuperYegorius
New Member
Я работаю над браузерным WebRTC приложением для видео конференций. На моей локальной машине все работает отлично, но когда я пытаюсь затестить приложение в реальный условиях на нескольких компах через интернет RTCPeerConnection.onconnectionstatechange выстреливает RTCPeerConnection.connectionState = 'disconnected' без какой либо причины после 20-30 секунд успешной работы. Еще одна очень странная деталь это то что если например у меня есть peer2 и peer3 открытые в разных вкладках одного браузера и к ним подключен peer1 и peer1 раздает им видеопоток то после 20-30 секунд успешной коммуникации RTCPeerConnection.connectionState = 'disconnected' может выстрелить у peer2 и в то же время peer3 будет продолжать получать видеопоток от peer1. Я гуглил не одну неделю - самое вменяемое из того что нашел так это вот такую проверку (которая к сожалению не работает):
b2-b1 всегда равны 0. Буду благодарен если поможете разобраться с этой проблемой!
Заранее благодарен за любую помощь!
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
}
Заранее благодарен за любую помощь!