Protocolo de sincronização

O chat swarm oferece novas possibilidades para cada dispositivo. Agora, é possível sincronizar o histórico entre dispositivos compartilhando o repositório relacionado.

Muitos cenários estão definidos no documento de design do enxame, mas isso não implica a sincronização de conversas entre dispositivos para o mesmo usuário. Alguns novos cenários devem ser escritos.

Método antigo

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

No antigo método, o daemon está ouvindo em “inbox:DEVICE_ID” para valores DeviceSync que contém a lista de contatos para 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).

Este é o cenário usado para sincronizar:

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

  2. Outros dispositivos (!A) detectarão esse anúncio e solicitarão a esse dispositivo, por meio do ConnectionManager, que abra um novo canal chamado “sync://DEVICE_ID_A”. (Nota: A receberá anúncios de outros dispositivos, portanto, também solicitará canais de sincronização).

  3. Assim que este canal for aberto, o dispositivo que está a solicitar este canal enviará um valor DeviceSync (cf. parte seguinte) contendo as suas conversas e contatos conhecidos.

  4. A verificará o valor de DeviceSync e:

    • Remover contatos se detectar contatos removidos

    • Adicionar contatos se detectar contatos adicionados

    • Remover conversas se ele detectar conversas removidas

    • Adicionar conversas se detecta conversas adicionadas

    • Remover as solicitações da conversa se a solicitação for aceita (agora em conversas) / recusada

    • Adicionar as solicitações da conversa se detectadas

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

{
    "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 usuários

Sincronização ao adicionar 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 ligar 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 em um dos dispositivos

Sincronização para detecção de novas solicitações

  • Alice recebe um pedido de conversa

  • Alice adiciona um novo dispositivo

  • O outro dispositivo deve recuperar as solicitações do dispositivo A

Sincronização de pedidos aceitos

  • Alice tem 2 dispositivos

  • Alice aceita a solicitação de uma conversa

  • O outro dispositivo deve detectar o pedido aceito

Sincronização para pedidos de recusa

  • Alice tem 2 dispositivos

  • Alice recusa a solicitação de uma conversa

  • O outro dispositivo deve detectar o pedido recusado

Implementação atual

gerrit#15584 implementa esta página