SyncEngine
SyncEngine -- هو المكون المركزي لبنية العمل دون اتصال في tikento. وهو مسؤول عن:
- حفظ التغييرات في قاعدة البيانات المحلية (IndexedDB عبر Dexie.js)
- تتبع التغييرات المعلقة للمزامنة (
pendingSync=true) - إرسال التغييرات إلى الخادم عند استعادة الاتصال
- استلام التحديثات من الخادم (delta sync)
- إزالة التكرار لمنع الازدواجية
دورة حياة التغيير
1. إنشاء التغيير
عند تنفيذ إجراء (مثل تسجيل حضور مشارك)، يقوم SyncEngine بـ:
- كتابة التغيير في IndexedDB مع علامة
pendingSync=true - تعيين طابع وقت
clientTs(الوقت الحالي على الجهاز) - زيادة عدّاد التغييرات المعلقة في المؤشر
- عرض التغيير فوراً في الواجهة (تحديث متفائل)
2. الإرسال إلى الخادم
عند توفر الاتصال يقوم SyncEngine بـ:
- استخراج جميع السجلات ذات
pendingSync=true - ترتيبها حسب
clientTs(من الأقدم إلى الأحدث) - إرسالها كحزمة إلى الخادم
- انتظار التأكيد من الخادم
3. التأكيد
بعد استجابة الخادم الناجحة:
- تُزال علامة
pendingSync(false) لكل سجل مُرسل - ينخفض عدّاد التغييرات المعلقة
- إذا أُرسلت جميع التغييرات، ينتقل المؤشر إلى الأخضر
4. معالجة الأخطاء
عند حدوث خطأ في الإرسال:
- تبقى التغييرات مع
pendingSync=true - تتم إعادة المحاولة بعد 30 ثانية
- بحد أقصى 5 محاولات، بعدها يتم إشعار المستخدم
المزامنة التفاضلية (Delta sync)
تسمح المزامنة التفاضلية بالحصول من الخادم على البيانات التي تغيرت بعد آخر مزامنة فقط، بدلاً من تحميل مجموعة البيانات بالكامل.
كيف تعمل
- يحتفظ SyncEngine بطابع وقت آخر مزامنة ناجحة في جدول
meta. - عند المزامنة يُرسل طلب مع معامل
since:
GET /sync/delta?since=2026-07-15T10:30:00Z&entities=registrations,payments
- يُرجع الخادم السجلات التي تغيرت بعد الوقت المحدد فقط.
- يُحدّث SyncEngine قاعدة البيانات المحلية ويحفظ طابع الوقت الجديد.
معاملات الطلب
| المعامل | الوصف |
|---|---|
since | طابع وقت ISO 8601 لآخر مزامنة ناجحة |
entities | قائمة أنواع الكيانات مفصولة بفواصل: registrations، payments، events |
المزايا
- توفير حركة البيانات. يتم نقل التغييرات فقط وليس جميع البيانات
- السرعة. تستغرق المزامنة ثوانٍ وليس دقائق
- الموثوقية. إذا انقطعت المزامنة، تبدأ المحاولة التالية من نفس
since
المزامنة التلقائية
يتتبع SyncEngine حالة الشبكة ويشغّل المزامنة تلقائياً في الحالات التالية:
عند استعادة الاتصال
عندما ينتقل الجهاز من غير متصل إلى متصل:
- يُكتشف حدث
online(Network Information API) - يتحقق SyncEngine من توفر الخادم (ping)
- تُرسل التغييرات المعلقة (upload)
- تُطلب التحديثات من الخادم (download عبر delta sync)
المزامنة الدورية
في وضع الاتصال يتحقق SyncEngine دورياً من وجود تحديثات على الخادم، لتبقى البيانات محدّثة (مثلاً إذا سجّل عضو آخر في الفريق حضوراً من جهاز آخر).
إزالة التكرار
لمنع تكرار التغييرات يُستخدم مفتاح مركب:
clientTs + userId
يتم تعريف كل تغيير بشكل فريد من خلال مزيج طابع وقت الإنشاء على العميل ومعرّف المستخدم. إذا أُعيد إرسال نفس التغيير (مثلاً بسبب انتهاء مهلة الشبكة)، يتعرف الخادم على النسخة المكررة بهذا المفتاح ويُرجع تأكيداً دون تطبيقه مرة أخرى.
هذا يضمن العطالة (idempotency) -- إعادة إرسال نفس مجموعة التغييرات لا تؤدي إلى أخطاء أو تكرار البيانات.
ترتيب المزامنة
تُرسل التغييرات بالترتيب الزمني الصارم حسب clientTs. هذا أمر بالغ الأهمية للصحة:
- تسجيل حضور مشارك في 10:05 لا يمكن أن يُكتب فوقه بإلغاء تسجيل حضور في 10:03
- تسجيل دفع يدوي في 11:00 يُطبق بعد تغيير الحالة في 10:55
إذا اختلفت ساعة الجهاز عن وقت الخادم، يعوّض SyncEngine الفرق عند أول مزامنة ناجحة.
حجم التخزين المحلي
قاعدة بيانات IndexedDB المحلية لها حدود تعتمد على المتصفح والجهاز:
| المنصة | الحد النموذجي |
|---|---|
| Chrome / Edge | حتى 80% من المساحة الفارغة على القرص |
| Safari | حتى 1 جيجابايت |
| Firefox | حتى 2 جيجابايت |
بالنسبة لفعالية نموذجية (حتى 2,000 مشارك) يبلغ حجم البيانات 5-20 ميجابايت، وهو بعيد جداً عن حدود أي متصفح.
عند الاقتراب من حد التخزين يعرض SyncEngine تحذيراً ويقترح مسح بيانات الفعاليات المنتهية.