Conexões de peering

O RTCPeerConnection é a interface central na API WebRTC. Ele representa a conexão entre o peering local e o remoto, e oferece todas as funções e eventos necessários para estabelecer a conexão.

Como estabelecer uma conexão de peering

Os aplicativos que implementam a funcionalidade WebRTC geralmente dependem muito da interface RTCPeerConnection. No lado do autor da chamada (ou seja, o ponto de início de uma conexão), o processo para estabelecer uma conexão geralmente é o seguinte:

  1. Crie uma nova instância RTCPeerConnection com a configuração correta do ICE.
  2. Crie uma descrição de SDP local usando RTCPeerConnection.createOffer().
  3. Defina a descrição do SDP local usando RTCPeerConnection.setLocalDescription().
  4. Transfira (usando um serviço de sinalização) a descrição do SDP local para o peering remoto.
  5. Registre um listener para eventos icecandidate no RTCPeerConnection.
  6. Para cada evento icecandidate, transfira-o (usando um serviço de sinalização) para o peering remoto.
  7. Espere uma descrição de SDP remota recebida do serviço de sinalização e a defina usando RTCPeerConnection.setRemoteDescription().
  8. Aguarde os candidatos ICE remoto recebidos do serviço de sinalização e adicione-os usando RTCPeerConnection.addIceCandidate()

No lado do recebedor da chamada, o processo é um pouco diferente.

  1. Crie uma nova instância RTCPeerConnection com a configuração correta do ICE.
  2. Espere uma descrição de SDP remota recebida do serviço de sinalização e a defina usando RTCPeerConnection.setRemoteDescription().
  3. Crie uma resposta para a descrição da SDP remota chamando RTCPeerConnection.createAnswer().
  4. Transfira a resposta para o terminal remoto usando um serviço de sinalização.
  5. Registre um listener para eventos icecandidate no RTCPeerConnection.
  6. Para cada evento icecandidate, transfira-o (usando um serviço de sinalização) para o peering remoto.
  7. Aguarde os candidatos ICE remoto recebidos do serviço de sinalização e adicione-os usando RTCPeerConnection.addIceCandidate()

O desafio dessa API é que a maioria dessas operações é assíncrona, o que geralmente dificulta a implementação real de um aplicativo WebRTC. Muitas das funções retornam um Promise, que precisa ser resolvido antes que a próxima etapa do processo possa continuar.

Ao implementar um aplicativo usando essa API, recomendamos que o desenvolvedor use async e await em vez de registrar listeners (usando Promise.then()), porque isso facilita o acompanhamento do seu código. Veja o exemplo a seguir:

function createAndSendOffer(peerConnection, signallingService) {
    peerConnection.createOffer()
                  .then(offer => {
                      signallingService.send({
                          type: 'offer',
                          data: offer
                      });
                  });
}

Ao escrever o código acima usando async e await, temos o seguinte:

async function createAndSendOffer(peerConnection, signallingService) {
    const offer = await peerConnection.createOffer();
    signallingService.send({
        type: 'offer',
        data: offer
    });
}