From 76442c4161e4cdc8900a2e5d9b681075bba675e1 Mon Sep 17 00:00:00 2001 From: RoyceDa Date: Sat, 14 Mar 2026 20:23:29 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=82=D1=80=D0=B5=D0=BA=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?IceCandidates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/providers/CallProvider/CallProvider.tsx | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) 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 соединение