RTCPeerConnection は WebRTC API の中心的なインターフェースです。ローカル ピアとリモート ピア間の接続を表し、接続の確立に必要なすべての関数とイベントを提供します。
ピア接続の確立
WebRTC 機能を実装するアプリケーションは、通常 RTCPeerConnection インターフェースに大きく依存します。呼び出し元(接続を開始するピア)側から見ると、接続を確立するプロセスは通常次のようになります。
- 適切な ICE 構成で新しい
RTCPeerConnectionインスタンスを作成します。 RTCPeerConnection.createOffer()を使用してローカル SDP 説明を作成します。RTCPeerConnection.setLocalDescription()を使用してローカル SDP 説明を設定します。- ローカル SDP 説明を(シグナリング サービスを使用して)リモート ピアに転送します。
RTCPeerConnectionのicecandidateイベントのリスナーを登録します。- 各
icecandidateイベントを(シグナリング サービスを使用して)リモート ピアに転送します。 - シグナリング サービスからのリモート SDP 説明の受信を待機し、
RTCPeerConnection.setRemoteDescription()を使用して設定します。 - シグナリング サービスからのリモート ICE 候補を待機し、
RTCPeerConnection.addIceCandidate()を使用して追加します。
呼び出し側では、プロセスが若干異なります。
- 適切な ICE 構成で新しい
RTCPeerConnectionインスタンスを作成します。 - シグナリング サービスからのリモート SDP 説明の受信を待機し、
RTCPeerConnection.setRemoteDescription()を使用して設定します。 RTCPeerConnection.createAnswer()を呼び出して、リモート SDP 説明の回答を作成します。- (シグナリング サービスを使用して)回答をリモート ピアに転送します。
RTCPeerConnectionのicecandidateイベントのリスナーを登録します。- 各
icecandidateイベントを(シグナリング サービスを使用して)リモート ピアに転送します。 - シグナリング サービスからのリモート ICE 候補を待機し、
RTCPeerConnection.addIceCandidate()を使用して追加します。
この API の課題は、これらのオペレーションのほとんどが非同期であることです。これにより、WebRTC アプリケーションの実際の実装が複雑になることがよくあります。多くの関数は Promise を返します。この Promise は、プロセスの次のステップを続行する前に解決する必要があります。
この API を使用してアプリを実装する場合は、リスナー(Promise.then() を使用)を登録する代わりに async と await を使用することをおすすめします。これにより、コードの追跡が容易になります。次の例を考えてみましょう。
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
上記のコードを async と await を使用して記述すると、次のようになります。
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}