O RTCPeerConnection
é a interface central na API WebRTC. Ele
representa a conexão entre o peering local e o remoto, e oferece todas as
funções 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 da
interface RTCPeerConnection
. No lado do autor da chamada (ou seja, o ponto de início de uma conexão), o processo para estabelecer uma conexão geralmente é o seguinte:
- Crie uma nova instância
RTCPeerConnection
com a configuração correta do ICE. - Crie uma descrição de SDP local usando
RTCPeerConnection.createOffer()
. - Defina a descrição do SDP local usando
RTCPeerConnection.setLocalDescription()
. - Transfira (usando um serviço de sinalização) a descrição do SDP local para o peering remoto.
- Registre um listener para eventos
icecandidate
noRTCPeerConnection
. - Para cada evento
icecandidate
, transfira-o (usando um serviço de sinalização) para o peering remoto. - Espere uma descrição de SDP remota recebida do serviço de sinalização e
a defina usando
RTCPeerConnection.setRemoteDescription()
. - Aguarde os candidatos ICE remoto recebidos do serviço de sinalização e adicione-os
usando
RTCPeerConnection.addIceCandidate()
No lado do recebedor da chamada, o processo é um pouco diferente.
- Crie uma nova instância
RTCPeerConnection
com a configuração correta do ICE. - Espere uma descrição de SDP remota recebida do serviço de sinalização e
a defina usando
RTCPeerConnection.setRemoteDescription()
. - Crie uma resposta para a descrição da SDP remota chamando
RTCPeerConnection.createAnswer()
. - Transfira a resposta para o terminal remoto usando um serviço de sinalização.
- Registre um listener para eventos
icecandidate
noRTCPeerConnection
. - Para cada evento
icecandidate
, transfira-o (usando um serviço de sinalização) para o peering remoto. - Aguarde os candidatos ICE remoto recebidos do serviço de sinalização e adicione-os
usando
RTCPeerConnection.addIceCandidate()
O desafio dessa API é que a maioria dessas operações é assíncrona, 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 a
próxima etapa do processo possa continuar.
Ao implementar um aplicativo usando essa API, recomendamos que o desenvolvedor use async
e await
em vez de registrar listeners (usando Promise.then()
), porque isso facilita o acompanhamento do seu código. Veja o 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
, temos o seguinte:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}