RTCPeerConnection est l'interface centrale de l'API WebRTC. Il représente la connexion entre le pair local et le pair distant, et fournit toutes les fonctions et tous les événements nécessaires pour établir la connexion.
Établir une connexion peer-to-peer
Les applications qui implémentent la fonctionnalité WebRTC s'appuient généralement beaucoup sur l'interface RTCPeerConnection. Du côté de l'appelant (c'est-à-dire le pair qui initie une connexion), le processus d'établissement d'une connexion est généralement le suivant :
- Créez une instance
RTCPeerConnectionavec la configuration ICE appropriée. - Créez une description SDP locale à l'aide de
RTCPeerConnection.createOffer(). - Définissez la description SDP locale à l'aide de
RTCPeerConnection.setLocalDescription(). - Transférez (à l'aide d'un service de signalisation) la description SDP locale au pair distant.
- Enregistrez un écouteur pour les événements
icecandidatesurRTCPeerConnection. - Pour chaque événement
icecandidate, transférez-le (à l'aide d'un service de signalisation) au pair distant. - Attendez une description SDP distante entrante du service de signalisation et définissez-la à l'aide de
RTCPeerConnection.setRemoteDescription(). - Attendez de recevoir les candidats ICE distants entrants du service de signalisation et ajoutez-les à l'aide de
RTCPeerConnection.addIceCandidate().
Du côté de l'appelé, le processus est légèrement différent.
- Créez une instance
RTCPeerConnectionavec la configuration ICE appropriée. - Attendez une description SDP distante entrante du service de signalisation et définissez-la à l'aide de
RTCPeerConnection.setRemoteDescription(). - Créez une réponse pour la description SDP distante en appelant
RTCPeerConnection.createAnswer(). - Transférez (à l'aide d'un service de signalisation) la réponse au pair distant.
- Enregistrez un écouteur pour les événements
icecandidatesurRTCPeerConnection. - Pour chaque événement
icecandidate, transférez-le (à l'aide d'un service de signalisation) au pair distant. - Attendez de recevoir les candidats ICE distants entrants du service de signalisation et ajoutez-les à l'aide de
RTCPeerConnection.addIceCandidate().
Le problème avec cette API est que la plupart de ces opérations sont asynchrones, ce qui complique souvent l'implémentation réelle d'une application WebRTC.
De nombreuses fonctions renvoient un Promise qui doit être résolu avant que l'étape suivante du processus puisse se poursuivre.
Lorsque vous implémentez une application à l'aide de cette API, il est recommandé que le développeur utilise async et await au lieu d'enregistrer des écouteurs (à l'aide de Promise.then()), car cela rend votre code plus facile à suivre. Prenons l'exemple suivant :
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Lorsque nous écrivons le code ci-dessus à l'aide de async et await, nous obtenons ce qui suit :
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}