Протокол синхронизации

Сборник чатов предоставляет новые возможности для каждого устройства. Теперь можно синхронизировать историю между устройствами, разделяя соответствующий хранилище.

Многие сценарии определены в проектодокументе Swarm, однако это не означает синхронизации разговоров между устройствами для одного и того же пользователя.

Старый метод

Синхронизация устройств была выполнена через DHT. Поскольку каждый значение не должен превышать 64k, разговоры не отправлялись в синхронизации устройств, ни в профилях членов, потому что это слишком тяжело.

В старой методике демона слушает на «inbox: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 проверит значение DeviceSync и:

    • Удалить контакты, если обнаруживает удаленные контакты

    • Добавить контакты, если он обнаруживает добавленные контакты

    • Удалить разговоры, если он обнаружит удаленные разговоры

    • Добавить разговоры, если он обнаруживает добавленные разговоры

    • Удалить запросы разговора, если запрос принят (сейчас в разговорах) /отклонен

    • Добавьте запросы разговора, если они обнаружены

Примечание

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 устройства.

  • Алиса создает разговор

  • Другие устройства должны принимать и синхронизировать созданный на одном из устройств разговор

Синхронизация для обнаружения новых запросов

  • Алиса получает запрос на разговор

  • Алиса добавляет новое устройство

  • Другие устройства должны получать запросы из устройства А

Синхронизация для принятых запросов

  • У Алисы 2 устройства.

  • Алиса принимает просьбу об общении

  • Другие устройства должны обнаружить принятое заявление

Синхронизация запросов отказа

  • У Алисы 2 устройства.

  • Алиса отказывается от просьбы поговорить

  • Другие устройства должны обнаружить отказ в обращении

Текущее осуществление

gerrit#15584 реализует эту страницу