RTCPeerConnection to centralny interfejs w API WebRTC. Reprezentuje połączenie między lokalnym i zdalnym węzłem oraz udostępnia wszystkie funkcje i zdarzenia niezbędne do nawiązania połączenia.
Nawiązywanie połączenia równorzędnego
Aplikacje korzystające z funkcji WebRTC zwykle w dużym stopniu bazują na interfejsie RTCPeerConnection. Po stronie dzwoniącego (czyli osoby inicjującej połączenie) proces nawiązywania połączenia wygląda zwykle tak:
- Utwórz nową instancję
RTCPeerConnectionz odpowiednią konfiguracją ICE. - Utwórz lokalny opis SDP za pomocą
RTCPeerConnection.createOffer(). - Ustaw lokalny opis SDP za pomocą polecenia
RTCPeerConnection.setLocalDescription(). - Przesyłanie (za pomocą usługi sygnalizacyjnej) lokalnego opisu SDP do zdalnego urządzenia.
- Zarejestruj detektor zdarzeń
icecandidatena obiekcieRTCPeerConnection. - W przypadku każdego zdarzenia
icecandidateprzenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego elementu równorzędnego. - Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacyjnej i ustaw go za pomocą
RTCPeerConnection.setRemoteDescription(). - Poczekaj na przychodzące zdalne kandydaty ICE z usługi sygnalizacyjnej i dodaj je za pomocą
RTCPeerConnection.addIceCandidate().
Po stronie osoby odbierającej połączenie proces wygląda nieco inaczej.
- Utwórz nową instancję
RTCPeerConnectionz odpowiednią konfiguracją ICE. - Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacyjnej i ustaw go za pomocą
RTCPeerConnection.setRemoteDescription(). - Utwórz odpowiedź na opis SDP zdalnego urządzenia, wywołując funkcję
RTCPeerConnection.createAnswer(). - Przekaż (za pomocą usługi sygnalizacyjnej) odpowiedź do zdalnego urządzenia.
- Zarejestruj detektor zdarzeń
icecandidatena obiekcieRTCPeerConnection. - W przypadku każdego zdarzenia
icecandidateprzenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego elementu równorzędnego. - Poczekaj na przychodzące zdalne kandydaty ICE z usługi sygnalizacyjnej i dodaj je za pomocą
RTCPeerConnection.addIceCandidate().
Problem z tym interfejsem API polega na tym, że większość tych operacji jest asynchroniczna, co często komplikuje rzeczywistą implementację aplikacji WebRTC.
Wiele funkcji zwraca wartość Promise, którą należy rozwiązać, zanim będzie można przejść do następnego kroku procesu.
Podczas wdrażania aplikacji za pomocą tego interfejsu API zalecamy używanie funkcji async i await zamiast rejestrowania odbiorników (za pomocą funkcji Promise.then()), ponieważ dzięki temu kod jest łatwiejszy do śledzenia. Rozważ ten przykład:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Jeśli powyższy kod napiszemy za pomocą znaków async i await, otrzymamy:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}