Protocolo de sincronização

A conversação do swarm oferece novas possibilidades para cada dispositivo. Agora, é possível sincronizar o histórico entre dispositivos através da partilha do repositório relacionado. A sincronização de dispositivos precisa de ser redefinida para acompanhar estas alterações.

Muitos cenários estão definidos no Swarm design document, no entanto, isto não implica a sincronização de conversas entre dispositivos para o mesmo utilizador. É necessário escrever alguns cenários novos.

Método antigo

A sincronização de dispositivos foi feita através do DHT. Como cada valor NÃO DEVE exceder 64k, as conversas não foram enviadas na sincronização de dispositivos, nem os perfis de membros, porque é demasiado pesado. Isto é um problema e DEVE ser melhorado.

No método antigo, o daemon está à escuta em «inbox:DEVICE_ID» para os valores DeviceSync que contêm a lista de contactos a sincronizar (cf. AccountManager::startSync());

Nota

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

Novo método

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

Agora, este é o cenário utilizado para sincronizar:

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

  2. Outros dispositivos (!A) detetarão esse anúncio e pedirão a este dispositivo, através do ConnectionManager, que abra um novo canal com o nome “sync://DEVICE_ID_A”. (Nota: A receberá anúncios de outros dispositivos, pelo que também pedirá canais de sincronização).

  3. Logo que este canal seja aberto, o dispositivo que o solicita enviará um valor DeviceSync (cf. parte seguinte) contendo as suas conversas e contactos conhecidos.

  4. A verificará o valor de DeviceSync e:

    • Remover contactos se detetar contactos removidos

    • Adicionar contactos se detetar contactos adicionados

    • Remover conversas se detetar conversas removidas

    • Adicionar conversas se detetar conversas adicionadas

    • Remover os pedidos de conversação se o pedido for aceite (agora em conversations)/declined

    • Adicionar pedidos de conversação se detetados

Nota

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

Sincronização de dispositivos

Este valor é um JSON que contém:

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

Histórias de utilizadores

Sincronizar ao adicionar um dispositivo

  • Alice cria uma conversa

  • (Opcional) Alice adiciona algumas mensagens

  • Alice adiciona outro dispositivo

  • O outro dispositivo deve receber e sincronizar a conversa criada anteriormente

Sincronizar quando conectar um dispositivo

  • Alice cria uma conversa

  • (Opcional) Alice adiciona algumas mensagens

  • Alice conecta outro dispositivo

  • O outro dispositivo deve receber e sincronizar a conversa criada anteriormente

Sincronização entre vários dispositivos

  • Alice tem 2 dispositivos

  • Alice cria uma conversa

  • O outro dispositivo deve receber e sincronizar a conversa criada num dos dispositivos

Sincronização para detetar novos pedidos

  • Alice recebe o pedido de uma conversa

  • Alice adiciona um novo dispositivo

  • O outro dispositivo deve obter os pedidos do dispositivo A

Sincronização de pedidos aceites

  • Alice tem 2 dispositivos

  • Alice aceita o pedido de uma conversa

  • O outro dispositivo deve detetar o pedido aceite

Sincronização para recusas de pedidos

  • Alice tem 2 dispositivos

  • Alice recusa o pedido de uma conversa

  • O outro dispositivo deve detetar o pedido recusado

Implementação atual

gerrit#15584 implementa esta página