RTCPeerConnection es la interfaz central de la API de WebRTC. Representa la conexión entre el par local y el remoto, y proporciona todas las funciones y los eventos necesarios para establecer la conexión.
Cómo establecer una conexión de pares
Las aplicaciones que implementan la funcionalidad de WebRTC suelen depender en gran medida de la interfaz RTCPeerConnection. Desde el lado de la persona que llama (es decir, el par que inicia una conexión), el proceso para establecer una conexión suele ser el siguiente:
- Crea una instancia de
RTCPeerConnectionnueva con la configuración de ICE adecuada. - Crea una descripción de SDP local con
RTCPeerConnection.createOffer(). - Establece la descripción del SDP local con
RTCPeerConnection.setLocalDescription(). - Transfiere (con un servicio de señalización) la descripción del SDP local al par remoto.
- Registra un objeto de escucha para los eventos
icecandidateen elRTCPeerConnection. - Para cada evento
icecandidate, transfiérelo (con un servicio de señalización) al par remoto. - Espera una descripción de SDP remota entrante del servicio de señalización y configúrala con
RTCPeerConnection.setRemoteDescription(). - Espera a que lleguen candidatos ICE remotos del servicio de señalización y agrégalos con
RTCPeerConnection.addIceCandidate().
En el lado del destinatario, el proceso es un poco diferente.
- Crea una instancia de
RTCPeerConnectionnueva con la configuración de ICE adecuada. - Espera una descripción de SDP remota entrante del servicio de señalización y configúrala con
RTCPeerConnection.setRemoteDescription(). - Llama a
RTCPeerConnection.createAnswer()para crear una respuesta para la descripción del SDP remoto. - Transfiere (con un servicio de señalización) la respuesta al par remoto.
- Registra un objeto de escucha para los eventos
icecandidateen elRTCPeerConnection. - Para cada evento
icecandidate, transfiérelo (con un servicio de señalización) al par remoto. - Espera a que lleguen candidatos ICE remotos del servicio de señalización y agrégalos 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 devuelven un Promise que se debe resolver antes de que pueda continuar el siguiente paso del proceso.
Se recomienda que, cuando se implemente una aplicación con esta API, el desarrollador use async y await en lugar de registrar objetos de escucha (con Promise.then()), ya que esto facilita la comprensión del código. Considera 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
});
}