التطبيقات المشابهة

RTCPeerConnection هي الواجهة المركزية في واجهة برمجة تطبيقات WebRTC. وهو يمثّل العلاقة بين النظراء المحليّين والبعيدين، ويوفّر جميع الوظائف والأحداث اللازمة لإنشاء الاتصال.

إنشاء اتصال بين الزملاء

تعتمد التطبيقات التي تنفّذ وظائف WebRTC عادةً على واجهة RTCPeerConnection. من جانب المتصل (أي الأقران الذي يبدأ الاتصال)، عادةً ما تتمثل عملية إنشاء اتصال في ما يلي:

  1. ويمكنك إنشاء مثيل RTCPeerConnection جديد باستخدام ضبط ICE المناسب.
  2. إنشاء وصف SDP محلي باستخدام RTCPeerConnection.createOffer()
  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. يمكنك إنشاء إجابة عن وصف SDP عن بُعد من خلال الاتصال RTCPeerConnection.createAnswer().
  4. انتقِل إلى خدمة البحث المشابهة (باستخدام خدمة إرسال الإشارات) عن بُعد.
  5. تسجيل أداة معالجة لفعاليات icecandidate على RTCPeerConnection
  6. بالنسبة إلى كل أحداث icecandidate، يُرجى نقلها (باستخدام خدمة الإشارة) إلى نظير الشبكة البعيد.
  7. انتظر وصول وحدات ICE المحفّزة عن بُعد الواردة من خدمة الإشارة وأضِفها باستخدام RTCPeerConnection.addIceCandidate()

وتكمن المشكلة في واجهة برمجة التطبيقات هذه في أن معظم هذه العمليات غير متزامنة، والتي كثيرًا ما تجعل التنفيذ الفعلي لتطبيق WebRTC معقّدًا. تعرض العديد من الدوال Promise التي يجب حلها قبل أن تستمر الخطوة التالية في العملية.

ننصح عند تنفيذ أحد التطبيقات باستخدام واجهة برمجة التطبيقات هذه أن يستفيد مطوّر البرامج من 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
    });
}