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 eventos necesarios para establecer la conexión.
Cómo establecer una conexión de par
Por lo general, las aplicaciones que implementan la funcionalidad de WebRTC dependen en gran medida de la interfaz RTCPeerConnection
. Desde el lado de los llamadores (es decir, el par que inicia una conexión), el proceso para establecer una conexión suele ser el siguiente:
- Crea una instancia
RTCPeerConnection
nueva con la configuración de ICE adecuada. - Crea una descripción de SDP local con
RTCPeerConnection.createOffer()
. - Establece la descripción SDP local con
RTCPeerConnection.setLocalDescription()
. - Transferir (con un servicio de señalización) la descripción SDP local al par remoto
- Registra un objeto de escucha para eventos
icecandidate
enRTCPeerConnection
. - Para cada evento
icecandidate
, transfiérelo (con un servicio de señalización) al participante remoto. - Espera a que el servicio de señalización envíe una descripción SDP remota entrante y configúrala con
RTCPeerConnection.setRemoteDescription()
. - Espera a que lleguen candidatos de ICE remotos del servicio de señalización y agrégalos con
RTCPeerConnection.addIceCandidate()
.
En el lado del llamado, el proceso es un poco diferente.
- Crea una instancia
RTCPeerConnection
nueva con la configuración de ICE adecuada. - Espera a que el servicio de señalización envíe una descripción SDP remota entrante y configúrala con
RTCPeerConnection.setRemoteDescription()
. - Llama a
RTCPeerConnection.createAnswer()
para crear una respuesta para la descripción SDP remota. - Transfiere (con un servicio de señalización) la respuesta al par remoto.
- Registra un objeto de escucha para eventos
icecandidate
enRTCPeerConnection
. - Para cada evento
icecandidate
, transfiérelo (con un servicio de señalización) al participante remoto. - Espera a que lleguen candidatos de ICE remotos del servicio de señalización y agrégalos con
RTCPeerConnection.addIceCandidate()
.
El desafío de 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 se debe resolver antes de que se pueda continuar con el siguiente paso del proceso.
Cuando se implementa una aplicación con esta API, se recomienda que 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
});
}