بروتوكول التزامن

يتيح المحادثة السحرية إمكانيات جديدة لكل جهاز. الآن، من الممكن مزامنة التاريخ بين الأجهزة من خلال مشاركة مخزن ذات الصلة. يجب إعادة تعريف مزامنة الأجهزة لتتبع تلك التغييرات.

يتم تعريف العديد من السيناريوهات في وثيقة تصميم Swarm ، ومع ذلك ، لا يعني هذا مزامنة المحادثات بين الأجهزة لنفس المستخدم. يجب كتابة بعض السيناريوهات الجديدة.

الطريقة القديمة

تم تم مزامنة الجهاز عبر DHT. لأن كل قيمة لا يجب أن تتجاوز 64k، لم يتم إرسال المحادثات في مزامنة الجهاز، ولا ملفات تعريف الأعضاء، لأنه ثقيل جدا. هذه مشكلة ويجب تحسينها.

في الطريقة القديمة، يستمع الديمون إلى "البصيرة: DEVICE_ID" لقيم DeviceSync التي تحتوي على قائمة الاتصالات المزامنة (راجع AccountManager::startSync() );

ملاحظة

The current DeviceSync value present on the DHT is deprecated with this draft.

الطريقة الجديدة

Since Jami has the ConnectionManager, using p2p socket is possible to perform sync quickly with big values (cause the socket is not limited in data).

الآن، هذا هو السيناريو المستخدم لتزامن:

  1. When the device (A) goes online, it announces its presence via a DeviceAnnouncement like the OldMethod.

  2. ستكتشف الأجهزة الأخرى (!A) الإعلانات وستطلب من هذا الجهاز من خلال ConnectionManager فتح قناة جديدة تسمى "sync://DEVICE_ID_A". (لاحظة: سوف تحصل A على إعلانات من الأجهزة الأخرى ، لذلك سوف تطلب قنوات المزامنة أيضًا).

  3. بمجرد فتح هذه القناة، سيتم إرسال جهاز يطلب هذه القناة قيمة DeviceSync (راجع الجزء التالي) التي تحتوي على محادثاتها والاتصالات المعروفة.

  4. A will check the DeviceSync value and:

    • إزالة الاتصالات إذا اكتشفت الاتصالات المزودة

    • إضافة جهات الاتصال إذا اكتشفت جهات الاتصال المضافة

    • إزالة المحادثات إذا اكتشفت المحادثات المزولة

    • إضافة المحادثات إذا اكتشفت المحادثات المضافة

    • إزالة طلبات المحادثة إذا تم قبول الطلب (الآن في المحادثات) / رفض

    • إضافة طلبات المحادثة إذا تم اكتشافها

ملاحظة

If A detects new conversations, it will asks the device which announced that conversation to clone the repository through a git channel (so like described in Swarm chat design).

المزامنة مع الجهاز

هذه القيمة هي JSON تحتوي على:

{
    "contacts": [/* Contacts (TODO) */],
    "conversation": [
        { "id":"convID", "created":"<TIMESTAMP>", "removed":"<OPTIONAL_TIMESTAMP>" },
        { "id":"convID2", "created":"<TIMESTAMP2>", "removed":"<OPTIONAL_TIMESTAMP2>" }
        /* ... */
    ],

    "conversationsRequests": [

        { "id":"convID", "received":"<TIMESTAMP>", "declined":"<OPTIONAL_TIMESTAMP>",
          "members":[], "metadatas":[] },
        { "id":"convID2", "received":"<TIMESTAMP2>", "declined":"<OPTIONAL_TIMESTAMP2>",
          "members":[], "metadatas":[] }
        /* ... */
    ],
}

قصص المستخدم

المزامنة عند إضافة الجهاز

  • أليس تخلق محادثة

  • (اختياري) أليس إضافة بعض الرسائل

  • أليس تضيف جهاز آخر

  • يجب أن يستقبل الجهاز الآخر وتمزيق المحادثة التي تم إنشاؤها سابقاً

المزامنة عند توصيل الجهاز

  • أليس تخلق محادثة

  • (اختياري) أليس إضافة بعض الرسائل

  • "أليس" تربط جهاز آخر

  • يجب أن يستقبل الجهاز الآخر وتمزيق المحادثة التي تم إنشاؤها سابقاً

المزامنة بين أجهزة متعددة

  • أليس حصلت على 2 أجهزة

  • أليس تخلق محادثة

  • يجب أن يتلقى الجهاز الآخر وتمزق المحادثة التي تم إنشاؤها على أحد الأجهزة

المزامنة للكشف عن الطلبات الجديدة

  • (أليس) تتلقى طلباً للحوار

  • أليس تضيف جهاز جديد

  • يجب على الجهاز الآخر استرداد الطلبات من الجهاز A

المزامنة للطلبات المقبولة

  • أليس لديها جهازين

  • (أليس) تقبل طلب المحادثة

  • يجب أن يكتشف الجهاز الآخر الطلب المقبول

المزامنة لطلبات الرفض

  • أليس لديها جهازين

  • (أليس) ترفض طلب المحادثة

  • يجب أن يكتشف الجهاز الآخر طلب رفض

التنفيذ الحالي

gerrit#15584 تنفيذ هذه الصفحة