IEnumerator SendAnswerCoroutine(string connectionId, PeerConnection pc) { pc.makingAnswer = true; var opLocalDesc = pc.peer.SetLocalDescription(); yield return(opLocalDesc); if (opLocalDesc.IsError) { Debug.LogError($"{pc} {opLocalDesc.Error.message}"); pc.makingAnswer = false; yield break; } Assert.AreEqual(pc.peer.LocalDescription.type, RTCSdpType.Answer, $"{pc} onmessage SLD worked"); Assert.AreEqual(pc.peer.SignalingState, RTCSignalingState.Stable, $"{pc} onmessage not racing with negotiationneeded"); pc.makingAnswer = false; _signaling.SendAnswer(connectionId, pc.peer.LocalDescription); }
IEnumerator GotOfferCoroutine(string connectionId, PeerConnection pc, string sdp) { RTCSessionDescription description; description.type = RTCSdpType.Offer; description.sdp = sdp; var isStable = pc.peer.SignalingState == RTCSignalingState.Stable || (pc.peer.SignalingState == RTCSignalingState.HaveLocalOffer && pc.srdAnswerPending); pc.ignoreOffer = !pc.polite && (pc.makingOffer || !isStable); if (pc.ignoreOffer || pc.makingAnswer) { Debug.LogWarning($"{pc} glare - ignoreOffer {nameof(pc.peer.SignalingState)}:{pc.peer.SignalingState}"); yield break; } // waiting other setRemoteDescription process yield return(new WaitWhile(() => pc.srdAnswerPending)); pc.waitingAnswer = false; var opRemoteDesc = pc.peer.SetRemoteDescription(ref description); yield return(opRemoteDesc); if (opRemoteDesc.IsError) { Debug.LogError($"{pc} {opRemoteDesc.Error.message}"); yield break; } Assert.AreEqual(pc.peer.RemoteDescription.type, RTCSdpType.Offer, $"{pc} SRD worked"); Assert.AreEqual(pc.peer.SignalingState, RTCSignalingState.HaveRemoteOffer, $"{pc} Remote offer"); onGotOffer?.Invoke(connectionId, sdp); }