RTCPeerConnection, WebRTC API'deki merkezi arayüzdür. Yerel ve uzak eş arasındaki bağlantıyı temsil eder ve bağlantıyı kurmak için gereken tüm işlevleri ve etkinlikleri sağlar.
Eş bağlantısı kurma
WebRTC işlevini uygulayan uygulamalar genellikle RTCPeerConnection arayüzünü yoğun bir şekilde kullanır. Arayan tarafında (yani bağlantı başlatan eş) bağlantı kurma süreci genellikle şu şekildedir:
- Uygun ICE yapılandırmasıyla yeni bir
RTCPeerConnectionörneği oluşturun. RTCPeerConnection.createOffer()kullanarak yerel bir SDP açıklaması oluşturun.- Yerel SDP açıklamasını
RTCPeerConnection.setLocalDescription()kullanarak ayarlayın. - Yerel SDP açıklamasını uzak tarafa (bir sinyal hizmeti kullanarak) aktarın.
RTCPeerConnectionüzerindekiicecandidateetkinlikleri için bir işleyici kaydedin.- Her
icecandidateetkinliği için bunu (bir sinyal hizmeti kullanarak) uzak eşe aktarın. - Sinyal hizmetinden gelen uzaktan SDP açıklamasını bekleyin ve
RTCPeerConnection.setRemoteDescription()kullanarak ayarlayın. - Sinyal hizmetinden gelen uzak ICE adaylarının gelmesini bekleyin ve bunları
RTCPeerConnection.addIceCandidate()kullanarak ekleyin.
Aranan tarafında ise süreç biraz farklıdır.
- Uygun ICE yapılandırmasıyla yeni bir
RTCPeerConnectionörneği oluşturun. - Sinyal hizmetinden gelen uzaktan SDP açıklamasını bekleyin ve
RTCPeerConnection.setRemoteDescription()kullanarak ayarlayın. RTCPeerConnection.createAnswer()işlevini çağırarak uzak SDP açıklaması için bir yanıt oluşturun.- Yanıtı uzak tarafa aktarın (sinyal hizmeti kullanarak).
RTCPeerConnectionüzerindekiicecandidateetkinlikleri için bir işleyici kaydedin.- Her
icecandidateetkinliği için bunu (bir sinyal hizmeti kullanarak) uzak eşe aktarın. - Sinyal hizmetinden gelen uzak ICE adaylarının gelmesini bekleyin ve bunları
RTCPeerConnection.addIceCandidate()kullanarak ekleyin.
Bu API'nin zorluğu, bu işlemlerin çoğunun eşzamansız olmasıdır. Bu durum, WebRTC uygulamasının gerçek uygulamasını genellikle karmaşık hale getirir.
İşlevlerin çoğu, süreçteki bir sonraki adımın devam edebilmesi için çözülmesi gereken bir Promise döndürür.
Bu API'yi kullanarak bir uygulama uygularken geliştiricinin, dinleyicileri kaydetmek (Promise.then() kullanarak) yerine async ve await kullanması önerilir. Bu, kodunuzun daha kolay anlaşılmasını sağlar. Aşağıdaki örneği inceleyin:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Yukarıdaki kodu async ve await kullanarak yazdığımızda aşağıdaki sonuçları elde ederiz:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}