RTCPeerConnection
è l'interfaccia centrale nell'API WebRTC. Rappresenta la connessione tra il peer locale e quello remoto e fornisce tutte le funzioni e gli eventi necessari per stabilire la connessione.
Stabilire una connessione peer
Le applicazioni che implementano la funzionalità WebRTC di solito si basano molto sull'interfaccia RTCPeerConnection
. Dal lato dei chiamanti (cioè il peer che avvia una connessione), il processo per stabilire una connessione è solitamente il seguente:
- Crea una nuova istanza
RTCPeerConnection
con la configurazione ICE appropriata. - Creare una descrizione SDP locale utilizzando
RTCPeerConnection.createOffer()
. - Impostare la descrizione SDP locale utilizzando
RTCPeerConnection.setLocalDescription()
. - Trasferire (utilizzando un servizio di segnalazione) la descrizione SDP locale al peer remoto.
- Registra un listener per eventi
icecandidate
suRTCPeerConnection
. - Per ogni evento
icecandidate
, trasferiscilo (utilizzando un servizio di segnalazione) al peer remoto. - Attendi una descrizione SDP remota in arrivo dal servizio di segnalazione e
RTCPeerConnection.setRemoteDescription()
utilizzandoRTCPeerConnection.setRemoteDescription()
. - Attendi i candidati ICE remoti in arrivo dal servizio di segnalazione e aggiungili utilizzando
RTCPeerConnection.addIceCandidate()
Sul lato callee, il processo è leggermente diverso.
- Crea una nuova istanza
RTCPeerConnection
con la configurazione ICE appropriata. - Attendi una descrizione SDP remota in arrivo dal servizio di segnalazione e
RTCPeerConnection.setRemoteDescription()
utilizzandoRTCPeerConnection.setRemoteDescription()
. - Creare una risposta per la descrizione SDP remota chiamando
RTCPeerConnection.createAnswer()
. - Trasferire (utilizzando un servizio di segnalazione) la risposta al peer remoto.
- Registra un listener per eventi
icecandidate
suRTCPeerConnection
. - Per ogni evento
icecandidate
, trasferirlo (tramite un servizio di segnalazione) al peer remoto. - Attendi i candidati ICE remoti in arrivo dal servizio di segnalazione e aggiungili utilizzando
RTCPeerConnection.addIceCandidate()
La sfida con questa API è che la maggior parte di queste operazioni sono asincrone, il che spesso complica l'effettiva implementazione di un'applicazione WebRTC. Molte delle funzioni restituiscono una Promise
che deve essere risolta prima che il passaggio successivo del processo possa continuare.
Si consiglia che durante l'implementazione di un'applicazione utilizzando questa API, lo sviluppatore utilizzi async
e await
invece di registrare ascoltatori (utilizzando Promise.then()
), poiché ciò rende il codice più facile da seguire. Considera il seguente esempio:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Quando si scrive il codice sopra utilizzando async
e await
, si ottiene quanto segue:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}