Skip to main content
تتيح لك Calling SDK إجراء مكالمات صوتيّة حقيقيّة واستقبالها في المتصفّح عبر WebRTC — دون إضافات. تُضمّن سكربتًا واحدًا، وتمنحه مفتاح API، ثمّ تستدعي connect() ثمّ initCall(). يتولّى Wave تسجيل SIP والوسائط وبيانات الجلسة قصيرة العمر نيابةً عنك.
يستخدم الاتّصال عبر الويب نطاق webrtc:write. في sandbox تكون المكالمات مقيّدة بالأصل (origin) وبوجهة رقم تسجيلك؛ ويزيل مفتاح production (sk_live_) قيد الوجهة.

التثبيت

قبل البدء

  1. اسمح بأصلك. في لوحة تحكّم Wave، أضِف الأصل الذي يعمل عليه تطبيقك (مثل https://app.example.com) إلى الأصول المسموح بها لمشروعك. تجلب الـ SDK جلستها من /v1/webrtc/config التي ترفض أيّ أصل ليس على القائمة.
  2. استخدم مفتاح webrtc:write. يُرسَل المفتاح من المتصفّح، لذا فهو مقيّد بالأصل بحكم التصميم.
المفتاح المُضمَّن في المتصفّح مرئيّ لأيّ شخص يحمّل صفحتك. يقيّده Wave بالأصل (وبالوجهة في sandbox) لاحتواء الأثر — لكن في production عامِل المفتاح المُضمَّن كأنّه عامّ واقصره على webrtc:write فقط.

بداية سريعة

جلسات الوكيل وجلسات المتّصل

كلّ جلسة متصفّح من أحد نوعين. يحدّد الخيار identity النوع. قواعد الهويّة
  • من 1 إلى 64 حرفًا من A–Z a–z 0–9 . _ -.
  • استخدم الهويّة نفسها في كلّ مكان: في الـ SDK، وفي POST /v1/queues/agents/login، وفي <Dial> داخل مسار المكالمة.
  • البادئتان p_ (أعضاء البوّابة) وc_ (جلسات المتّصل) محجوزتان. الهويّة التي تبدأ بإحداهما تُعيد 400 INVALID_IDENTITY.
  • إذا كان لدى المستأجر مستخدم SIP بهذا الاسم لم ينشئه Wave (مثل هاتف مكتبيّ)، فلا يغيّره Wave ويُعيد 409 IDENTITY_CONFLICT. استخدم هويّة أخرى.
  • ينشئ Wave مستخدم SIP عند أوّل استخدام، ويضبط كلمة مرور جديدة لكلّ جلسة. لا تدير أنت مستخدمي SIP.
  • جلسة واحدة لكلّ هويّة. إذا فتحت الهويّة نفسها جلسة ثانية (مثل تبويب ثانٍ)، تفوز الجلسة الأحدث. تتلقّى الجلسة الأقدم onSessionEnded("revoked") عند تحديث بياناتها التالي، وتتوقّف عن الرنين.
  • تحتاج جلسات الوكيل إلى مفتاح production (sk_live_). يتجاهل مفتاح sandbox الخيار identity ويفتح جلسة متّصل.

استقبال المكالمات

اضبط identity وأضِف مُعالِج onIncomingCall. يتلقّى المُعالِج كائن مكالمة:
  • مكالمة واحدة في كلّ مرّة. أثناء مكالمة نشطة أو رنين، تتلقّى أيّ مكالمة واردة جديدة 486 Busy Here، ولا تصل إلى onIncomingCall.
  • إذا أنهى المتّصل المكالمة قبل القبول أو الرفض، يُطلَق onIncomingCallCancelled(). بعد ذلك يرمي accept() وreject() على كائن المكالمة هذا الخطأ NO_ACTIVE_CALL.
  • إذا رُفض الميكروفون، يرمي accept() الخطأ MICROPHONE_UNAVAILABLE ويستمرّ رنين المكالمة. يمكنك عندها استدعاء reject().
  • إذا ضبطت onIncomingCall دون identity، يرمي الـ constructor الخطأ INCOMING_REQUIRES_IDENTITY.

جودة المكالمة

أثناء اتّصال المكالمة وعدم تعليقها، ترسل الـ SDK الحدث onQualityReport(metrics) كلّ 5 ثوانٍ. يغطّي كلّ تقرير آخر 5 ثوانٍ: تتوقّف التقارير عند انتهاء المكالمة أو تعليقها، وتبدأ من جديد عند استئنافها. للاسترشاد: قيمة mos من 4.0 فأكثر جيّدة، ومن 3.6 إلى 4.0 متوسّطة، وأقلّ من 3.6 ضعيفة. تبقى قيم الجودة في المتصفّح؛ لا يستلمها Wave.

الإعدادات

new WaveSDK(config, events)

الدوالّ

الأحداث

مرّر المُعالِجات في الوسيط الثاني للـ constructor.
لا تتعامل أنت مع كلمة مرور SIP أو رمز الجلسة. تجلبها الـ SDK، وتُبقي المكالمة حيّة، وتدوّرها تلقائيًّا قبل انتهائها بنحو دقيقة.

رموز الأخطاء

يمنحك onFailed(error) قيمة error.code: قد يفشل طلب الجلسة (POST /v1/webrtc/config) أيضًا بأخطاء الـ API هذه. تُبلغ عنها الـ SDK بالرمز CONFIG_FAILED، مع حالة HTTP في الرسالة:

الـ Webhooks

عند انتهاء مكالمة من المتصفّح، يرسل Wave الـ webhook المعتاد call.ended لها (راجِع الـ Webhooks).

الخطوات التالية

كيف يعمل الصوت

أين تقع مكالمة المتصفّح في دورة حياة المكالمة.

المكالمات والتسجيلات

اقرأ السجلّ واجلب تسجيلًا.