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

Сварм чатът предоставя нови възможности за всяко устройство. Сега е възможно да синхронизирате историята между устройствата чрез споделяне на съответния репозиторий.

Много сценарии са дефинирани в проекта на {doc}`Swarm, но това не означава синхронизиране на разговорите между устройствата за един и същи потребител.

Стария метод

С синхронизиране на устройствата се извършва чрез DHT. Тъй като всяка стойност не трябва да надвишава 64k, разговорите не са изпращани в синхронизиране на устройствата, нито в профилите на членовете, защото е твърде тежко.

В стария метод, демона слуша на „inbox:DEVICE_ID“ за стойностите на DeviceSync, който съдържа списъка с контакти, за да се синхронизира (вж. AccountManager::startSync() );

Note

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 и:

    • Изтрийте контакти, ако открие изтрити контакти

    • Добавете контакти, ако открие добавени контакти

    • Изтрийте разговорите, ако открие изтрити разговори

    • Добавете разговори, ако открие допълнителни разговори

    • Изтрийте исканията на разговора, ако искането е прието (сега в разговорите) / отхвърлено

    • Добавете исканията на разговора, ако се открие

Note

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 прилага тази страница