ارتباطات همتا

RTCPeerConnection رابط مرکزی در WebRTC API است. این رابط، ارتباط بین همتای محلی و راه دور را نشان می‌دهد و تمام عملکردها و رویدادهای لازم برای برقراری ارتباط را فراهم می‌کند.

ایجاد ارتباط همتا

برنامه‌هایی که قابلیت WebRTC را پیاده‌سازی می‌کنند، معمولاً به شدت به رابط RTCPeerConnection متکی هستند. از طرف تماس‌گیرنده‌ها (یعنی، همتای آغازکننده اتصال)، فرآیند ایجاد اتصال معمولاً به شرح زیر است:

  1. یک نمونه جدید RTCPeerConnection با پیکربندی ICE مناسب ایجاد کنید.
  2. با استفاده از RTCPeerConnection.createOffer() یک شرح SDP محلی ایجاد کنید.
  3. توضیحات محلی SDP را با استفاده از RTCPeerConnection.setLocalDescription() تنظیم کنید.
  4. انتقال (با استفاده از یک سرویس سیگنالینگ) توضیحات SDP محلی به نظیر راه دور.
  5. یک شنونده برای رویدادهای icecandidate در RTCPeerConnection ثبت کنید.
  6. برای هر رویداد icecandidate ، آن را (با استفاده از یک سرویس سیگنالینگ) به همتای راه دور منتقل کنید.
  7. منتظر دریافت توضیحات SDP از راه دور از سرویس سیگنالینگ باشید و آن را با استفاده از RTCPeerConnection.setRemoteDescription() تنظیم کنید.
  8. منتظر نامزدهای ICE از راه دور ورودی از سرویس سیگنالینگ باشید و آنها را با استفاده از RTCPeerConnection.addIceCandidate() اضافه کنید.

در سمت پذیرنده تماس، روند کمی متفاوت است.

  1. یک نمونه جدید RTCPeerConnection با پیکربندی ICE مناسب ایجاد کنید.
  2. منتظر دریافت توضیحات SDP از راه دور از سرویس سیگنالینگ باشید و آن را با استفاده از RTCPeerConnection.setRemoteDescription() تنظیم کنید.
  3. با فراخوانی RTCPeerConnection.createAnswer() یک پاسخ برای توضیحات SDP از راه دور ایجاد کنید.
  4. پاسخ را (با استفاده از یک سرویس سیگنالینگ) به همتای راه دور منتقل کنید.
  5. یک شنونده برای رویدادهای icecandidate در RTCPeerConnection ثبت کنید.
  6. برای هر رویداد icecandidate ، آن را (با استفاده از یک سرویس سیگنالینگ) به همتای راه دور منتقل کنید.
  7. منتظر نامزدهای ICE از راه دور ورودی از سرویس سیگنالینگ باشید و آنها را با استفاده از RTCPeerConnection.addIceCandidate() اضافه کنید.

چالش این API این است که بیشتر این عملیات ناهمزمان هستند، که اغلب پیاده‌سازی واقعی یک برنامه WebRTC را پیچیده می‌کند. بسیاری از توابع یک 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
    });
}