المشكلة
احتاجت IT-Plus إلى فصول دراسية مباشرة عبر الإنترنت، لا إلى مقاطع مسجّلة. كان على المعلّم والفصل بأكمله تبادل الصوت والصورة والتفاعل داخل الجلسة نفسها ومن المتصفح مباشرة، دون مطالبة المدارس بتثبيت أي برنامج. والفصول الدراسية لا تحتمل التأخير الزمني: تأخير ثانيتين مقبول في بث أحادي الاتجاه، لكنه يقتل أي حوار. وكان على النظام أن يصمد مع امتلاء القاعة، لا أن يتدهور أداؤه بمجرد انضمام أكثر من حفنة طلاب.
دوري في المشروع
هندست طبقة الزمن الحقيقي في تطبيق Testat من البداية إلى النهاية: تدفق الوسائط، وخادم الإشارات، وحالة الجلسة، وواجهة Angular التي استخدمها المعلّمون والطلاب فعليًا. والزمن الحقيقي من المجالات التي يسهل فيها العرض التجريبي ويصعب فيها النظام الإنتاجي، ولذلك ذهب معظم الجهد إلى حالات الفشل لا إلى المسار المثالي.
البنية المعمارية
- يتولى WebRTC نقل الصوت والفيديو، فتنتقل الوسائط بين المشاركين مباشرة بدل المرور عبر خادم تطبيقات كان سيتحول إلى عنق زجاجة بمجرد اتساع الفصل.
- يتكفل Socket.io بكل ما يتركه WebRTC غير محدد عمدًا: تبادل الإشارات، واكتشاف الأطراف، وحالة الجلسة — من في القاعة، ومن يعرض حاليًا، ومن انضم متأخرًا ويحتاج إلى تحديث وضعه.
- خدمة Node.js تملك دورة حياة القاعة وتحتفظ بالمرجع الموثوق لحالة الجلسة، فيعود الاتصال المنقطع إلى قاعة صحيحة لا إلى صورة قديمة عنها. فالمتصفحات تنقطع لأسباب خارجة عن سيطرتك، ويجب أن يبقى الخادم الجهة الوحيدة التي تعرف حقيقة الجلسة.
- بث حي إلى جانب الجلسة التفاعلية، لمن يحتاج إلى المشاهدة لا المشاركة — وهو نمط استهلاك مختلف عن مكالمة ثنائية الاتجاه، ويستحق الفصل بدل افتراض أن وضعًا واحدًا يناسب الحالتين.
- واجهة الفصل مبنية بـ Angular وتقودها أحداث الزمن الحقيقي مباشرة، بدل استطلاع دوري لنقطة نهاية على أمل أن تكون الفترة قصيرة بما يكفي.
التقنيات
Node.js و Socket.io و WebRTC و Angular.
النتيجة
استوعب Testat أكثر من 50 مستخدمًا متزامنًا في الجلسة المباشرة الواحدة مع بث حي — فصل دراسي حقيقي، لا مكالمة تجريبية بين جهازين. والأجزاء التي حسمت نجاح النظام كانت أقلها بريقًا: معالجة إعادة الاتصال، وإبقاء حالة الجلسة مرجعًا موثوقًا على الخادم، والتعامل مع تبادل الإشارات باعتباره اهتمامًا مستقلًا لا إضافة ملحقة بطبقة الوسائط. وما زال هذا المشروع هو ما أشير إليه حين يسألني عميل إن كان الزمن الحقيقي داخل المتصفح خيارًا عمليًا فعلًا لحالته.