Javascript 是否可以将WebRTC SDP报价转换为应答?

Javascript 是否可以将WebRTC SDP报价转换为应答?,javascript,webrtc,sdp,Javascript,Webrtc,Sdp,我有两个对等点希望通过WebRTC相互连接。通常,第一个对等方将创建一个报价并通过一个信令通道/服务器将其发送给第二个对等方,第二个对等方将用应答进行响应。这个场景很好用 然而,是否可能支持两个对等方碰巧尝试通过信令服务器同时彼此连接两个同时向另一个发送SDP提供的情况 // Both peers do this simultaneously: const conn = new RTCPeerConnection(null); const sdpOffer = await conn.create

我有两个对等点希望通过WebRTC相互连接。通常,第一个对等方将创建一个报价并通过一个信令通道/服务器将其发送给第二个对等方,第二个对等方将用应答进行响应。这个场景很好用

然而,是否可能支持两个对等方碰巧尝试通过信令服务器同时彼此连接两个同时向另一个发送SDP提供的情况

// Both peers do this simultaneously:
const conn = new RTCPeerConnection(null);
const sdpOffer = await conn.createOffer();
await conn.setLocalDescription(sdpOffer);
signalingService.send(peerId, sdpOffer);

// At some point in the future both peers also receive an SDP offer 
// (rather than answer) from the other peer whom they sent an offer to 
// via the signaling service. If this was an answer we'd call 
// RTCPeerConnection.setRemoteDescription, however this doesn't work for an 
// offer: 

conn.setRemoteDescription(peerSDPOffer); 
// In Chrome results in "DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer"
我甚至试图通过将SDP类型从
offer
改写为
answer
setup:actpass
改写为
setup:active
将收到的对等报价“转换”为答案,但这似乎不起作用,相反,我只得到了一个新的异常


所以问题是,这种同步连接/提供用例是否以某种方式得到支持?或者我是否应该关闭一侧/对等RTPeerConnection并使用
RTPeerConnection.createAnswer
实例化一个新的

这种情况称为“信号眩光”。WebRTC API并没有真正定义如何处理这个问题(除了称为“回滚”的东西,但它还没有在任何浏览器中实现,到目前为止没有人错过它),所以您必须自己避免这种情况


简单地替换a=设置是行不通的,因为底层DTLS机制仍然需要客户端和服务器的概念。

我的信令服务器本质上为每个对等方分配一个会话id;我避免双重报价的简单策略是,id较高的对等方开始报价。你需要这样的协调。谢谢@deceze-这正是我要做的Firefox实现“回滚”FWIW。根据规范,它不会触发所有它应该触发的事件,但在这种简单的情况下,回滚其中一个对等连接的初始报价应该可以正常工作。拥有“客户端”和“服务器”的核心基础知识真是太好笑了在一个固有的P2P系统中,对于那些来这里寻找眩光避免/完美协商解决方案的人来说:下一个Chrome版本(M80)也将处理回滚(当时可以在Chrome Canary中测试)。最新的webrtc规范进行了一些更改以避免竞争情况,还包括一个示例,请参见: