Conexiones entre pares

RTCPeerConnection es la interfaz central de la API de WebRTC. Integra representa la conexión entre el par local y remoto, y proporciona todos los y los eventos necesarios para establecer la conexión.

Estableciendo una conexión de par

Por lo general, las aplicaciones que implementan la funcionalidad de WebRTC dependerán en gran medida del RTCPeerConnection. Del lado del llamador (es decir, el intercambio de tráfico iniciar una conexión), el proceso para establecer una conexión suele ser lo siguiente:

  1. Crea una instancia RTCPeerConnection nueva con el ICE adecuado configuración.
  2. Crea una descripción de SDP local con RTCPeerConnection.createOffer().
  3. Establece la descripción del SDP local con RTCPeerConnection.setLocalDescription()
  4. Transfiere (con un servicio de señalización) la descripción del SDP local al dispositivo remoto intercambio de tráfico.
  5. Registra un objeto de escucha para eventos icecandidate en RTCPeerConnection.
  6. Para cada evento icecandidate, transfiérelo (mediante un servicio de señalización) a el par remoto.
  7. Espera una descripción SDP remota entrante del servicio de señalización y configúralo con RTCPeerConnection.setRemoteDescription().
  8. Espera a los candidatos remotos ICE entrantes del servicio de señalización y agrega con RTCPeerConnection.addIceCandidate()

En el lado del destinatario, el proceso es un poco diferente.

  1. Crea una instancia RTCPeerConnection nueva con el ICE adecuado configuración.
  2. Espera una descripción SDP remota entrante del servicio de señalización y configúralo con RTCPeerConnection.setRemoteDescription().
  3. Crea una respuesta para la descripción del SDP remoto llamando RTCPeerConnection.createAnswer()
  4. Transfiere (con un servicio de señalización) la respuesta al par remoto.
  5. Registra un objeto de escucha para eventos icecandidate en RTCPeerConnection.
  6. Para cada evento icecandidate, transfiérelo (mediante un servicio de señalización) a el par remoto.
  7. Espera a los candidatos remotos ICE entrantes del servicio de señalización y agrega con RTCPeerConnection.addIceCandidate()

El desafío con esta API es que la mayoría de estas operaciones son asíncronas, lo que a menudo complica la implementación real de una aplicación de WebRTC. Muchas de las funciones muestran un Promise que debe resolverse antes de la el siguiente paso en el proceso puede continuar.

Se recomienda que, al implementar una aplicación con esta API, el el desarrollador usa async y await en lugar de registrar objetos de escucha (usando Promise.then()), ya que esto hace que tu código sea más fácil de seguir. Reflexiona el siguiente ejemplo:

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

Cuando escribimos el código anterior con async y await, obtenemos lo siguiente:

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