diff --git a/app/providers/CallProvider/CallProvider.tsx b/app/providers/CallProvider/CallProvider.tsx index b6c61d2..f5781fb 100644 --- a/app/providers/CallProvider/CallProvider.tsx +++ b/app/providers/CallProvider/CallProvider.tsx @@ -92,10 +92,27 @@ export function CallProvider(props : CallProviderProps) { * Другая сторона отправила нам ICE кандидата для установления WebRTC соединения */ const candidate = JSON.parse(packet.getSdpOrCandidate()); + console.info(candidate); await peerConnectionRef.current?.addIceCandidate(new RTCIceCandidate(candidate)); info("Received WebRTC ICE candidate and added to peer connection"); return; } + if(signalType == WebRTCSignalType.OFFER){ + /** + * SFU сервер отправил нам оффер, например при renegotiation, нам нужно его принять и + * отправить ответ (ANSWER) + */ + const sdp = JSON.parse(packet.getSdpOrCandidate()); + await peerConnectionRef.current?.setRemoteDescription(new RTCSessionDescription(sdp)); + let answer = await peerConnectionRef.current?.createAnswer(); + await peerConnectionRef.current?.setLocalDescription(answer); + let answerSignal = new PacketWebRTC(); + answerSignal.setSignalType(WebRTCSignalType.ANSWER); + answerSignal.setSdpOrCandidate(JSON.stringify(answer)); + send(answerSignal); + info("Received WebRTC offer, set remote description and sent answer"); + return; + } }, [activeCall, sessionKeys, callState]); usePacket(26, async (packet: PacketSignalPeer) => { @@ -201,6 +218,34 @@ export function CallProvider(props : CallProviderProps) { { urls: 'stun:stun.l.google.com:19302' } ] }); + /** + * Подписываемся на ICE кандидат + */ + peerConnectionRef.current.onicecandidate = (event) => { + if(event.candidate){ + let candidateSignal = new PacketWebRTC(); + candidateSignal.setSignalType(WebRTCSignalType.ICE_CANDIDATE); + candidateSignal.setSdpOrCandidate(JSON.stringify(event.candidate)); + send(candidateSignal); + } + } + /** + * Соединение установлено, можно начинать звонок, переходим в активное состояние звонка + */ + peerConnectionRef.current.onconnectionstatechange = () => { + console.info("Peer connection state changed: " + peerConnectionRef.current?.connectionState); + if(peerConnectionRef.current?.connectionState == "connected"){ + setCallState(CallState.ACTIVE); + info("WebRTC connection established, call is active"); + } + } + + peerConnectionRef.current.ontrack = (event) => { + /** + * При получении медиа-трека с другой стороны + */ + console.info("TRACK RECV!!!!!"); + } /** * Запрашиваем Аудио поток с микрофона и добавляем его в PeerConnection, чтобы другая сторона могла его получить и воспроизвести, * когда мы установим WebRTC соединение