RTCPeerConnection
to główny interfejs API WebRTC. Odzwierciedla połączenie między lokalnym a zdalnym peerem oraz zapewnia wszystkie funkcje i zdarzenia niezbędne do nawiązania połączenia.
Nawiązuję połączenie równorzędne
Aplikacje implementujące funkcje WebRTC zwykle bazują na interfejsie RTCPeerConnection
. Po stronie dzwoniącego (tzn. przez peera, który nawiązuje połączenie) proces nawiązywania połączenia jest zwykle taki:
- Utwórz nową instancję
RTCPeerConnection
z odpowiednią konfiguracją ICE. - Utwórz opis lokalnego pliku SDP za pomocą funkcji
RTCPeerConnection.createOffer()
. - Ustaw opis lokalnego SDP za pomocą
RTCPeerConnection.setLocalDescription()
. - Przenieś (z użyciem usługi sygnalizacyjnej) lokalny opis SDP do zdalnego peera.
- Zarejestruj detektor zdarzeń
icecandidate
wRTCPeerConnection
. - Dla każdego zdarzenia
icecandidate
przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego peera. - Poczekaj, aż opis usługi SDP poczty przychodzącej pojawi się w usłudze sygnalizacji i skonfiguruj ją za pomocą
RTCPeerConnection.setRemoteDescription()
. - Poczekaj, aż kandydujący do usługi zdalnej ICE (z usługi sygnalizacyjnej) doda je za pomocą
RTCPeerConnection.addIceCandidate()
.
Ten proces wygląda nieco inaczej po stronie rozmówcy.
- Utwórz nową instancję
RTCPeerConnection
z odpowiednią konfiguracją ICE. - Poczekaj, aż opis usługi SDP poczty przychodzącej pojawi się w usłudze sygnalizacji i skonfiguruj ją za pomocą
RTCPeerConnection.setRemoteDescription()
. - Utwórz odpowiedź na opis zdalnego zarządzania SDP, wywołując
RTCPeerConnection.createAnswer()
. - Przenieś odpowiedź (korzystając z usługi sygnalizacyjnej) do zdalnego peera.
- Zarejestruj detektor zdarzeń
icecandidate
wRTCPeerConnection
. - Dla każdego zdarzenia
icecandidate
przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnego peera. - Poczekaj, aż kandydujący do usługi zdalnej ICE (z usługi sygnalizacyjnej) doda je za pomocą
RTCPeerConnection.addIceCandidate()
.
Problem z interfejsem API polega na tym, że większość z nich jest asynchroniczna, co często utrudnia rzeczywistą implementację aplikacji WebRTC.
Wiele funkcji zwraca błąd Promise
, który musi rozwiązać, zanim będzie można przejść do następnego kroku procesu.
Zaleca się, aby przy implementacji aplikacji przy użyciu tego interfejsu API deweloper korzystał z metod async
i await
, zamiast rejestrować detektory (korzystając z metody Promise.then()
), co ułatwia śledzenie kodu. Przyjrzyj się temu przykładowi:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Podczas pisania powyższego kodu przy użyciu async
i await
otrzymujemy:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}