Conexões de peering

O RTCPeerConnection é a interface central na API WebRTC. Ela representa a conexão entre o ponto local e remoto e fornece todos os função 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 do interface RTCPeerConnection. Do lado do autor da chamada (ou seja, o peer iniciar uma conexão), o processo para estabelecer uma conexão geralmente é o seguinte:

  1. Criar uma nova instância de RTCPeerConnection com o ICE apropriado configuração do Terraform.
  2. Crie uma descrição de SDP local usando RTCPeerConnection.createOffer().
  3. Defina a descrição do SDP local usando: RTCPeerConnection.setLocalDescription():
  4. Transferir (usando um serviço de sinalização) a descrição do SDP local para o controle remoto peering.
  5. Registre um listener para eventos icecandidate no RTCPeerConnection.
  6. Transfira cada evento icecandidate (usando um serviço de sinalização) para: no terminal remoto.
  7. Aguarde a descrição de SDP remoto recebida do serviço de sinalização e defina-o usando RTCPeerConnection.setRemoteDescription().
  8. Aguarde os candidatos ICE remotos do serviço de sinalização e adicione usando RTCPeerConnection.addIceCandidate()

Para o beneficiário, o processo é um pouco diferente.

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

O desafio dessa API é que a maioria das operações são assíncronas, 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 o e a próxima etapa do processo pode continuar.

Recomenda-se que, ao implementar um aplicativo usando essa API, os o desenvolvedor usa async e await em vez de registrar listeners. (usando Promise.then()), já que isso facilita o acompanhamento do código. Considere 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, recebemos o seguinte:

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