O RTCPeerConnection é a interface central na API WebRTC. Ele
representa a conexão entre o peer local e o remoto e fornece 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. Do lado do chamador (ou seja, o peer
que inicia uma conexão), o processo para estabelecer uma conexão geralmente é o
seguinte:
- Crie uma nova instância
RTCPeerConnectioncom a configuração ICE adequada. - 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 peer remoto.
- Registre um listener para eventos
icecandidatenoRTCPeerConnection. - Para cada evento
icecandidate, transfira-o (usando um serviço de sinalização) para o peer remoto. - Aguarde uma descrição SDP remota do serviço de sinalização e
defina-a usando
RTCPeerConnection.setRemoteDescription(). - Aguarde os candidatos ICE remotos recebidos do serviço de sinalização e adicione
usando
RTCPeerConnection.addIceCandidate()
No lado do destinatário, o processo é um pouco diferente.
- Crie uma nova instância
RTCPeerConnectioncom a configuração ICE adequada. - Aguarde uma descrição SDP remota do serviço de sinalização e
defina-a usando
RTCPeerConnection.setRemoteDescription(). - Crie uma resposta para a descrição do SDP remoto chamando
RTCPeerConnection.createAnswer(). - Transfira (usando um serviço de sinalização) a resposta para o peer remoto.
- Registre um listener para eventos
icecandidatenoRTCPeerConnection. - Para cada evento
icecandidate, transfira-o (usando um serviço de sinalização) para o peer remoto. - Aguarde os candidatos ICE remotos recebidos do serviço de sinalização e adicione
usando
RTCPeerConnection.addIceCandidate()
O problema 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, é recomendável que o desenvolvedor use async e await em vez de registrar listeners (usando Promise.then()), já que isso facilita o acompanhamento do código. Confira
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
});
}