perfectnogation #20
|
@ -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,6 +337,8 @@ export default class WebRTC
|
||||||
}
|
}
|
||||||
public async eventNogationNeeded()
|
public async eventNogationNeeded()
|
||||||
{
|
{
|
||||||
|
try{
|
||||||
|
this.makingOffer = true;
|
||||||
let offer = await this.rtc.createOffer({
|
let offer = await this.rtc.createOffer({
|
||||||
iceRestart: true,
|
iceRestart: true,
|
||||||
offerToReceiveAudio: true,
|
offerToReceiveAudio: true,
|
||||||
|
@ -308,6 +349,12 @@ export default class WebRTC
|
||||||
type: 'offer',
|
type: 'offer',
|
||||||
value: offer
|
value: offer
|
||||||
});
|
});
|
||||||
|
}catch(error){
|
||||||
|
console.error(`Nogation Error:`, error)
|
||||||
|
}
|
||||||
|
finally{
|
||||||
|
this.makingOffer = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public eventSignalingState()
|
public eventSignalingState()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue