Synchronizacja statusu dostawy
Kiedy wysyłamy wiadomość do konwersacji, status jej dostarczenia musi być jawny i zrozumiały dla użytkownika końcowego. Jami musi więc oferować możliwość sprawdzenia, czy wiadomość została dostarczona do innych członków konwersacji i zsynchronizować ten status (wysłany i wyświetlony) na różnych urządzeniach.
Jak to działa (zaplecze)
Status wiadomości jest przechowywany w warstwie konwersacji poprzez zmienną messagesStatus (map<string, map<string, string>) o następującej strukturze:
{uri, {
{"fetch", "commitId"},
{"fetched_ts", "timestamp"},
{"read", "commitId"},
{"read_ts", "timestamp"}
}
}
Status fetch to commitId ostatniej wiadomości pobranej przez członka. fetched_ts to znacznik czasu ostatniej wiadomości pobranej przez członka. Status read to commitId ostatniej wiadomości odczytanej przez członka. read_ts to znacznik czasu ostatniej wiadomości odczytanej przez członka.
Gdy członek pobiera wiadomość, status fetch jest aktualizowany o commitId wiadomości, a fetched_ts jest aktualizowany o znacznik czasu wiadomości. Gdy członek czyta wiadomość, status read jest aktualizowany o commitId wiadomości, a read_ts jest aktualizowany o znacznik czasu wiadomości. Informacje te są synchronizowane między urządzeniami, a inne urządzenia zaktualizują swoją wewnętrzną strukturę, jeśli znacznik czasu jest nowszy.
Informacje te są przechowywane w conversation_data/xxxxxxxxx/status.
API klienta
Klient powinien pobrać status z bieżącej struktury SwarmMessage podczas ładowania konwersacji i zaktualizować status poprzez AccountMessageStatusChanged. W AccountMessageStatusChanged klient będzie miał commitId, peer uri i nowy status. Będzie to więc odpowiadać message.status[uri].
Struktura statusu SwarmMessage to:
{
{uri, status},
{uri2, status2}
}
Gdzie uri jest uri peera, a status jest statusem wiadomości dla tego peera (z wyliczenia MessageStates).
Podczas wysyłania nowej wiadomości, mapa status może być pusta (ponieważ nikt jej nie pobrał). Domyślnie, jeśli nie ma informacji o pobraniu/odczycie wiadomości, wiadomość MUSI być uznana za wysłaną. Globalny status wiadomości jest maksymalnym statusem wszystkich członków z wyjątkiem nas samych. Na przykład, jeśli Alicja wysyła wiadomość i mamy:
status = {alice: displayed, bob: sending, carl: sent}
Globalny status to wysłane.
Uwagi dla klienta
Jeśli klient chce pokazać, która wiadomość jest ostatnią odczytaną wiadomością dla członka, musi sprawdzić indeks podczas odpowiadania na
AccountMessageStatusChanged. Ponieważ ten sygnał może emitować, że poprzednia wiadomość jest wyświetlana później.Status wiadomości może być wykorzystany do stworzenia szczegółowego widoku tego, kto otrzymał/wyświetlił daną wiadomość. Jednak znaczniki czasu tych zdarzeń nie są przechowywane, ponieważ stanowiłoby to zbyt dużą ilość danych.