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

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، توسعه‌دهنده از async استفاده کند و به جای ثبت شنوندگان await (با استفاده از Promise.then() )، زیرا این کار باعث می‌شود کد شما را آسان‌تر دنبال کنید. به مثال زیر توجه کنید:

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
    });
}