Protokoł synchronizacji

W tym czasie, w przypadku, gdy system jest w stanie przejść do systemu, można przeprowadzić synchronizację między urządzeniami poprzez udostępnienie odpowiedniego rejestru.

W dokumencie projektowym Swarm design document zdefiniowane jest wiele scenariuszy, jednak nie oznacza to synchronizacji rozmów między urządzeniami dla tego samego użytkownika.

Stara metoda

Z powodu tego, że każda wartość nie musi przekraczać 64k, nie wysyłane są rozmowy w synchronizacji urządzeń ani profily członków, ponieważ jest to zbyt ciężkie.

W starej metody, daemon słucha w „inbox:DEVICE_ID” dla wartości DeviceSync, który zawiera listę kontaktów do synchronizowania (por. AccountManager::startSync() );

Informacja

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

Nowy sposób

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).

Oto scenariusz używany do synchronizacji:

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

  2. Inne urządzenia (!A) wykryją ogłoszenie i poproszą urządzenie przez ConnectionManager o otwarcie nowego kanału o nazwie „sync://DEVICE_ID_A”. (Uwaga: A otrzyma ogłoszenie z innych urządzeń, więc również poprosi o kanały synchronizacji).

  3. Po otwarciu kanału urządzenie, które prosi o ten kanał, wysyła wartość DeviceSync (por. następna część), zawierającą znane rozmowy i kontakty.

  4. A sprawdzi wartość DeviceSync i:

    • Usunięcie kontaktów, jeśli wykryje usunięte kontakty

    • Dodaj kontakty, jeśli wykryje dodane kontakty

    • Usunięcie rozmów, jeśli wykryje usunięte rozmowy

    • Dodaj rozmowy, jeśli wykryje dodane rozmowy

    • Usunięcie żądań rozmowy, jeśli wniosek został zaakceptowany (obecnie w rozmowach) / odrzucony

    • Dodaj żądania rozmowy, jeśli zostaną wykryte

Informacja

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).

Synchronizacja urządzeń

Wartość ta jest JSON zawierająca:

{
    "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:[] } /* ... */
    ],
}

Historia użytkownika

Synchronizacja przy dodawaniu urządzenia

  • Alice tworzy rozmowę

  • (Wybór) Alice dodać kilka wiadomości

  • Alice doda kolejne urządzenie

  • Inne urządzenie powinno odbierać i synchronizować wcześniej utworzoną rozmowę

Synchronizacja przy podłączeniu urządzenia

  • Alice tworzy rozmowę

  • (Wybór) Alice dodać kilka wiadomości

  • Alice podłączy inne urządzenie

  • Inne urządzenie powinno odbierać i synchronizować wcześniej utworzoną rozmowę

Synchronizacja między wieloma urządzeniami

  • Alice ma 2 urządzenia.

  • Alice tworzy rozmowę

  • Inne urządzenie powinno odbierać i synchronizować rozmowę utworzoną na jednym z urządzeń

Synchronizacja do wykrywania nowych żądań

  • Alice otrzymuje prośbę o rozmowę

  • Alice doda nowe urządzenie

  • Inne urządzenie powinno odbierać żądania z urządzenia A

Synchronizacja przyjmujących wniosków

  • Alice ma 2 urządzenia.

  • Alice przyjmuje prośbę o rozmowę

  • Inne urządzenie powinno wykryć przyjęte wnioski

Synchronizacja wniosków o odmowę

  • Alice ma 2 urządzenia.

  • Alice odmawia prośby o rozmowę

  • Inne urządzenie powinno wykryć odmowę zgłoszenia

Obecne wdrożenie

gerrit#15584 wdraża tę stronę