O RTCPeerConnection
é a interface central na API WebRTC. Ele representa a conexão entre o ponto local e remoto, e fornece todas as funções e eventos necessários para estabelecer a conexão.
Estabelecendo uma conexão de par
Os pedidos de aplicação funcionalidade WebRTC geralmente dependem muito do RTCPeerConnection
interface. Do lado dos chamadores (ou seja, o par iniciando uma conexão), o processo para estabelecer uma conexão é geralmente o seguinte:
- Criar um novo
RTCPeerConnection
instância com a configuração ICE apropriado. - Criar uma descrição SDP local usando
RTCPeerConnection.createOffer()
. - Definir a descrição SDP local usando
RTCPeerConnection.setLocalDescription()
. - Transfira (usando um serviço de sinalização) a descrição SDP local para o par remoto.
- Registrar um ouvinte para
icecandidate
eventos noRTCPeerConnection
. - Para cada
icecandidate
eventos, transferi-lo (usando um serviço de sinalização) para o peer remoto. - Espere por uma descrição SDP remota de entrada do serviço de sinalização e configurá-lo usando
RTCPeerConnection.setRemoteDescription()
. - Espere por candidatos ICE remoto de entrada do serviço de sinalização e adicioná-los usando
RTCPeerConnection.addIceCandidate()
Do lado do receptor, o processo é ligeiramente diferente.
- Criar um novo
RTCPeerConnection
instância com a configuração ICE apropriado. - Espere por uma descrição SDP remota de entrada do serviço de sinalização e configurá-lo usando
RTCPeerConnection.setRemoteDescription()
. - Criar uma resposta para a descrição SDP remota chamando
RTCPeerConnection.createAnswer()
. - Transfira (usando um serviço de sinalização) a resposta para o par remoto.
- Registrar um ouvinte para
icecandidate
eventos noRTCPeerConnection
. - Para cada
icecandidate
eventos, transferi-lo (usando um serviço de sinalização) para o peer remoto. - Espere por candidatos ICE remoto de entrada do serviço de sinalização e adicioná-los usando
RTCPeerConnection.addIceCandidate()
O desafio dessa API é que a maioria dessas operações é assíncrona, o que muitas vezes torna a implementação real de um aplicativo WebRTC complicada. Muitas das funções retornar uma Promise
que tem de ser resolvido antes que o próximo passo no processo pode continuar.
Recomenda-se que ao implementar um aplicativo usando esta API, o uso desenvolvedor marca de async
e await
em vez de registrar ouvintes (usando Promise.then()
), pois isso torna o código mais fácil de seguir. Considere o seguinte exemplo:
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
});
}