أسماء الحقول ورموز الأخطاء وأمثلة الشيفرة بالإنجليزية، كما تستخدمها في برنامجك.
الانضمام إلى الاجتماعات
روابط مستضافة، أو اجتماع مضمَّن داخل تطبيقك، أو واجهتك الخاصة — دائمًا بتشفير من طرف إلى طرف.
روابط الانضمام (واجهة ديوان)
يفتح رابط الانضمام صفحة اجتماع ديوان بالاسم والدور واللغة التي اخترتها. لا يحتاج الشخص إلى حساب ولا يمر بغرفة الانتظار. الروابط تنتهي صلاحيتها (ساعة افتراضيًا، وحتى سبعة أيام) وهي شخصية — لا تشارك رابطًا واحدًا بين عدة أشخاص.
const link = await deewan.rooms.createJoinLink(roomId, {
name: user.displayName,
role: user.isTeacher ? "host" : "participant",
user_id: user.id,
locale: "ar", // Arabic interface
});
return Response.redirect(link.url, 303);تضمين الاجتماع داخل تطبيقك
يمكن وضع الرابط نفسه داخل <iframe>، فيبقى المستخدم داخل منتجك ويحصل على تجربة اجتماع ديوان كاملة. يجب أن تسمح صفحتك بتمرير الكاميرا والمايك إلى الإطار.
<iframe
src="https://deewan.io/ar/j/TICKET"
allow="camera; microphone; display-capture; autoplay; clipboard-write; picture-in-picture"
style="width: 100%; height: 100%; border: 0"
></iframe>يمكن تضمين روابط الانضمام فقط، ولا يمكن تضمين لوحة التحكم أو عنوان الغرفة نفسه. كل إطار يحمل رابطًا موقَّعًا ومحدود المدة لشخص واحد، لذا فإن الاجتماع المضمَّن ليس أسهل دخولًا من الرابط ذاته.
واجهة مخصّصة (تصميمك أنت)
رمز الوسائط هو بيانات اتصال لشخص واحد في اجتماع واحد. اتصل عبر @deewan/client الذي يتولّى التشفير من طرف إلى طرف ويمنحك المشاركين والمسارات والأحداث لتعرضها كما تشاء.
const credentials = await deewan.rooms.createToken(roomId, {
name: "Omar",
user_id: "user_456",
});
// Send { server_url, token, e2ee_passphrase } to that one user's client.npm install @deewan/clientimport { joinMeeting } from "@deewan/client";
const c = await fetch("/api/meeting-token").then((r) => r.json());
const meeting = await joinMeeting(
{ serverUrl: c.server_url, token: c.token, e2eePassphrase: c.e2ee_passphrase },
{ publish: { camera: true, microphone: true } },
);
meeting.on("participants", (people) => renderTiles(people));
meeting.on("trackSubscribed", ({ attach, kind }) => {
const el = document.createElement(kind === "video" ? "video" : "audio");
el.autoplay = true;
el.playsInline = true;
attach(el);
stage.append(el);
});
// Chat and reactions travel end-to-end encrypted, like the media.
meeting.on("message", ({ name, text }) => showChat(name, text));
meeting.on("reaction", ({ name, emoji }) => floatEmoji(name, emoji));
await meeting.sendMessage("Hello everyone");
await meeting.sendReaction("👏");رمز الاتصال صالح عشر دقائق للاتصال، والاتصال القائم يستمر بعدها. اطلب رمزًا جديدًا لكل انضمام. وبدون عبارة التشفير لن يستقبل العميل سوى تشويش — وهذا دليل عمل التشفير.
الأدوار
| مضيف | مشارك | |
|---|---|---|
| الكاميرا والمايك | نعم | نعم |
| مشاركة الشاشة حين تكون للمضيفين فقط | نعم | لا |
| الدردشة والتفاعلات حين تكون مغلقة | يمكنه الكتابة | لا |
| بدء التسجيل (واجهة ديوان) | نعم | لا |
| إنشاء الاستطلاعات (واجهة ديوان) | نعم | لا |
تتم الإدارة (الكتم والإزالة والإنهاء وغرفة الانتظار) من خادمك عبر نقاط نهاية المشاركين، أو من مضيف ديوان المسجَّل داخل الاجتماع.
// Host powers for this meeting only; Deewan accounts only.
await deewan.rooms.makeCohost(roomId, identity);
await deewan.rooms.removeCohost(roomId, identity);
// Let people in (or not) from your own dashboard.
const { data: waiting } = await deewan.rooms.listWaiting(roomId);
for (const person of waiting) await deewan.rooms.admit(roomId, person.identity);الغرف ذات التشفير strict تحتفظ بمفتاحها على أجهزة المشاركين فقط، لذا يُرجع POST /rooms/{id}/tokens الرمز 409 لها — فلا توجد عبارة تشفير لإعطائها. أرسل الأشخاص إلى الغرفة برابط انضمام بدلًا من ذلك.
الغرف المقفلة
عندما تكون الغرفة مقفلة تُرفض الروابط والرموز الجديدة برمز 409 conflict، ولا يمكن الدخول بالروابط القديمة. ويظل بإمكان المضيفين الدخول لفتحها.