# 09 — الطبقة الحية (Realtime) ## التقنية - **Socket.IO** عبر `@nestjs/websockets` Gateway. - **`@socket.io/redis-adapter`** للتوسع الأفقي — **مفعّل** عبر `RedisIoAdapter` في `main.ts` (قنوات ببادئة `tripz:sio`). يسمح بتشغيل عدة نسخ تتشارك اتصالات الويب سوكت عبر Redis. - **Redis** للحضور (presence) والمطابقة الجغرافية (GEO commands). ## المصادقة على الاتصال - كل socket يحمل JWT + `tenant_id` → يُتحقق في `handleConnection`. - ينضم تلقائياً لغرف مُنطَّقة بالمستأجر: `tenant:{id}:...` — **لا تسريب بين المستأجرين**. ## القنوات (Namespaces / Rooms) | القناة | من ← إلى | المحتوى | التردد | |--------|---------|---------|--------| | `driver:location` | السائق → الخادم | إحداثيات السائق | مجمّع كل 3–5 ثوانٍ | | `trip:offers` | الخادم → السائقين المرشحين | عرض طلب جديد + مؤقت | عند الطلب | | `trip:track` | الخادم → الراكب | موقع السائق + حالة الرحلة | عند التحديث | | `dispatch:live` | الخادم → لوحة المشغّل | كل الطلبات/السائقين النشطين | مستمر | | `trip:chat` | ثنائي | رسائل الدردشة | فوري | ## المطابقة (Matching) — أقرب سائق مؤهل ``` 1. موقع كل سائق متصل → Redis: GEOADD tenant:{id}:drivers 2. عند طلب: GEOSEARCH ضمن نصف قطر متزايد 3. فلترة: service_class مطابق + متصل + غير مشغول + مؤهل 4. ترتيب: الأقرب زمنياً (ETA من routing انطلق) لا مسافة خطية 5. بث العرض تسلسلياً/بالدفعات عبر trip:offers مع مؤقت قبول 6. أول قبول يفوز → trip.assign() → إلغاء بقية العروض ``` ## الحضور (Presence) - `is_online` وموقع السائق الجاري في **Redis فقط** (TTL) — لا Postgres. - عند الفصل: تنظيف من فهرس GEO ومن غرف الرحلة النشطة. - إعادة الاتصال: يستعيد الحالة من مصدر الحقيقة (Postgres) + يعيد الانضمام للغرف. ## التكامل مع آلة حالة الرحلة - أحداث الـ socket تُترجم لأحداث في **TripBloc** (راكب) و**OffersBloc** (سائق) على الموبايل — [03](03-mobile-plan.md). - كل انتقال حالة يُكتب في `trip_events` [08](08-data-model.md) قبل البث — مصدر الحقيقة أولاً، ثم الإشعار. ## المهام غير المتزامنة (BullMQ) تُشغّل خارج مسار الـ realtime لتخفيف الضغط: - انتهاء صلاحية العروض غير المقبولة (timeout). - الإشعارات (FCM/SMS). - التسويات، تجميع usage للفوترة، التقارير. ## قواعد - **الخادم مصدر الحقيقة للحالة** — العميل يعرض ما يصله، لا يقرر. - **تجميع مواقع السائقين** (batch) لتقليل الضغط — لا بث لكل إحداثية. - **إعادة المحاولة والانقطاع الآمن** — الشبكات الإقليمية متقلبة؛ تصميم offline-tolerant. ← السابق: [08-data-model](08-data-model.md) · التالي: [10-roadmap](10-roadmap.md)