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: o valor atual de DeviceSync presente no DHT está obsoleto com este rascunho.

Novo método

Como o Jami tem o ConnectionManager, é possível usar o soquete p2p para realizar a sincronização rapidamente com valores grandes (porque o soquete não tem limite de dados)

Este é o cenário usado para sincronizar:

  1. Quando o dispositivo (A) entra em funcionamento, anuncia a sua presença através de um Anúncio de dispositivo como o 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: se A detectar novas conversas, ele pedirá ao dispositivo que anunciou essa conversa para clonar o repositório por meio de um canal git (como descrito em 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