Perfect nogation try

This commit is contained in:
abdussamedulutas 2025-07-13 15:10:29 +03:00
parent cbe424f3e3
commit 7756caa0f8
1 changed files with 57 additions and 10 deletions

View File

@ -32,6 +32,12 @@ export default class WebRTC
rtcpMuxPolicy:"require", rtcpMuxPolicy:"require",
}; };
public isPolite() : boolean
{
let myId = this.peer?.mwse.peer('me').socketId as string;
let peerId = this.peer?.socketId as string;
return myId < peerId;
}
public static defaultICEServers : RTCIceServer[] = [{ public static defaultICEServers : RTCIceServer[] = [{
urls: "stun:stun.l.google.com:19302" urls: "stun:stun.l.google.com:19302"
@ -49,6 +55,11 @@ export default class WebRTC
public FileTransportChannel? : P2PFileSender; public FileTransportChannel? : P2PFileSender;
public makingOffer = false;
public ignoreOffer = false;
public isSettingRemoteAnswerPending = false;
constructor( constructor(
rtcConfig?: RTCConfiguration, rtcConfig?: RTCConfiguration,
rtcServers?: RTCIceServer[] rtcServers?: RTCIceServer[]
@ -105,7 +116,23 @@ export default class WebRTC
break; break;
} }
case "offer":{ case "offer":{
let readyForOffer = !this.makingOffer && (this.rtc.signalingState == "stable" || this.isSettingRemoteAnswerPending);
const offerCollision = !readyForOffer;
this.ignoreOffer = !this.isPolite() && offerCollision;
if(this.ignoreOffer){
return;
}
this.isSettingRemoteAnswerPending = false;
await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value)); await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));
this.isSettingRemoteAnswerPending = false;
let answer = await this.rtc.createAnswer({ let answer = await this.rtc.createAnswer({
offerToReceiveAudio: true, offerToReceiveAudio: true,
offerToReceiveVideo: true offerToReceiveVideo: true
@ -118,7 +145,19 @@ export default class WebRTC
break; break;
} }
case "answer":{ case "answer":{
let readyForOffer = !this.makingOffer && (this.rtc.signalingState == "stable" || this.isSettingRemoteAnswerPending);
const offerCollision = !readyForOffer;
this.ignoreOffer = !this.isPolite() && offerCollision;
if(this.ignoreOffer){
return;
}
this.isSettingRemoteAnswerPending = true;
await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value)) await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))
this.isSettingRemoteAnswerPending = false;
break; break;
} }
case "streamInfo":{ case "streamInfo":{
@ -298,16 +337,24 @@ export default class WebRTC
} }
public async eventNogationNeeded() public async eventNogationNeeded()
{ {
let offer = await this.rtc.createOffer({ try{
iceRestart: true, this.makingOffer = true;
offerToReceiveAudio: true, let offer = await this.rtc.createOffer({
offerToReceiveVideo: true iceRestart: true,
}); offerToReceiveAudio: true,
await this.rtc.setLocalDescription(offer); offerToReceiveVideo: true
this.send({ });
type: 'offer', await this.rtc.setLocalDescription(offer);
value: offer this.send({
}); type: 'offer',
value: offer
});
}catch(error){
console.error(`Nogation Error:`, error)
}
finally{
this.makingOffer = false;
}
} }
public eventSignalingState() public eventSignalingState()
{ {