Можно ли конвертировать предложение WebRTC SDP в ответ? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть два партнера, которые хотят соединиться друг с другом через 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, но, похоже, это невместо этого я просто получаю новое исключение.

Итак, вопрос в том, поддерживается ли этот вариант использования одновременного подключения / предложения каким-либо образом - или мне нужно закрыть одну сторону / узел RTCPeerConnection и создать новую, используя RTCPeerConnection.createAnswer на этот раз?

1 Ответ

0 голосов
/ 01 января 2019

Эта ситуация известна как «сигнальный блик».API WebRTC на самом деле не определяет, как с этим справиться (за исключением того, что называется «откат», но он еще не реализован ни в одном браузере, и пока никто его не пропустил), поэтому вам следует избегать этой ситуации самостоятельно.

Простая замена установки a = не будет работать, поскольку базовый механизм DTLS все еще нуждается в концепции клиента и сервера.

...