O RTCPeerConnection
é a interface central da API WebRTC. Ele
representa a conexão entre o peer local e remoto e fornece todas as
funções e eventos necessários para estabelecer a conexão.
Como estabelecer uma conexão de peer
Os aplicativos que implementam a funcionalidade do WebRTC geralmente dependem muito da
interface RTCPeerConnection
. Do lado dos autores da chamada (ou seja, o peer
que inicia uma conexão), o processo para estabelecer uma conexão geralmente é o
seguinte:
- Crie uma nova instância
RTCPeerConnection
com 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()
. - Transfere (usando um serviço de sinalização) a descrição do SDP local para o peer remoto.
- Registre um listener para eventos
icecandidate
noRTCPeerConnection
. - 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-os
usando
RTCPeerConnection.addIceCandidate()
.
Do lado do cliente, o processo é um pouco diferente.
- Crie uma nova instância
RTCPeerConnection
com a configuração ICE adequada. - Aguarde uma descrição de SDP remoto 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()
. - Transfere (usando um serviço de sinalização) a resposta para o peer remoto.
- Registre um listener para eventos
icecandidate
noRTCPeerConnection
. - 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 os adicione
usando
RTCPeerConnection.addIceCandidate()
O desafio com essa API é que a maioria dessas operações é assíncrona,
o que geralmente complica 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 que usa essa API, é recomendável que o
desenvolvedor use async
e await
em vez de registrar listeners
(usando Promise.then()
), porque isso facilita o acompanhamento do código. Confira
este 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
});
}