Правильная обработка SDPOffer при renegotiation от SFU

This commit is contained in:
RoyceDa
2026-03-16 19:27:16 +02:00
parent ab57303eb6
commit 2c026d596d

View File

@@ -81,30 +81,7 @@ export function CallProvider(props : CallProviderProps) {
*/
let packet = new PacketIceServers();
send(packet);
//debug
setInterval(async () => {
if(callState == CallState.ACTIVE){
if(peerConnectionRef.current){
const stats = await peerConnectionRef.current.getStats();
stats.forEach((report) => {
if (report.type === "inbound-rtp" && !report.isRemote) {
const kind = (report as any).kind || (report as any).mediaType;
const bytesReceived = (report as any).bytesReceived ?? 0;
const packetsReceived = (report as any).packetsReceived ?? 0;
const packetsLost = (report as any).packetsLost ?? 0;
console.log(
`[inbound ${kind}] bytesReceived=${bytesReceived}, packetsReceived=${packetsReceived}, packetsLost=${packetsLost}`
);
}
});
}
}
}, 2000);
}, [callState, peerConnectionRef]);
}, []);
usePacket(28, async (packet: PacketIceServers) => {
let iceServers = packet.getIceServers();
@@ -130,7 +107,7 @@ export function CallProvider(props : CallProviderProps) {
}, []);
usePacket(27, async (packet: PacketWebRTC) => {
if(!activeCall || callState != CallState.WEB_RTC_EXCHANGE){
if(callState != CallState.WEB_RTC_EXCHANGE && callState != CallState.ACTIVE){
/**
* Нет активного звонка или мы не на стадии обмена WebRTC сигналами, игнорируем
*/
@@ -178,18 +155,18 @@ export function CallProvider(props : CallProviderProps) {
* 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;
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]);
}, [activeCall, sessionKeys, callState, roomIdRef]);
usePacket(26, async (packet: PacketSignalPeer) => {
const signalType = packet.getSignalType();