diff --git a/src/status_im/data_store/realm/schemas/account/core.cljs b/src/status_im/data_store/realm/schemas/account/core.cljs index df3cb88759..53297e55ca 100644 --- a/src/status_im/data_store/realm/schemas/account/core.cljs +++ b/src/status_im/data_store/realm/schemas/account/core.cljs @@ -2,7 +2,8 @@ (:require [status-im.data-store.realm.schemas.account.v1.core :as v1] [status-im.data-store.realm.schemas.account.v2.core :as v2] - [status-im.data-store.realm.schemas.account.v3.core :as v3])) + [status-im.data-store.realm.schemas.account.v3.core :as v3] + [status-im.data-store.realm.schemas.account.v4.core :as v4])) ;; TODO(oskarth): Add failing test if directory vXX exists but isn't in schemas. @@ -15,4 +16,7 @@ :migration v2/migration} {:schema v3/schema :schemaVersion 3 - :migration v3/migration}]) + :migration v3/migration} + {:schema v4/schema + :schemaVersion 4 + :migration v4/migration}]) diff --git a/src/status_im/data_store/realm/schemas/account/v3/core.cljs b/src/status_im/data_store/realm/schemas/account/v3/core.cljs index b6446b3572..c9cb072340 100644 --- a/src/status_im/data_store/realm/schemas/account/v3/core.cljs +++ b/src/status_im/data_store/realm/schemas/account/v3/core.cljs @@ -8,10 +8,7 @@ [status-im.data-store.realm.schemas.account.v1.user-status :as user-status] [status-im.data-store.realm.schemas.account.v1.local-storage :as local-storage] [status-im.data-store.realm.schemas.account.v1.browser :as browser] - [goog.object :as object] - [taoensso.timbre :as log] - [cljs.reader :as reader] - [clojure.string :as string])) + [taoensso.timbre :as log])) (def schema [chat/schema transport/schema diff --git a/src/status_im/data_store/realm/schemas/account/v4/core.cljs b/src/status_im/data_store/realm/schemas/account/v4/core.cljs new file mode 100644 index 0000000000..ac7b9350f4 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/account/v4/core.cljs @@ -0,0 +1,24 @@ +(ns status-im.data-store.realm.schemas.account.v4.core + (:require [status-im.data-store.realm.schemas.account.v3.chat :as chat] + [status-im.data-store.realm.schemas.account.v4.transport :as transport] + [status-im.data-store.realm.schemas.account.v1.contact :as contact] + [status-im.data-store.realm.schemas.account.v1.message :as message] + [status-im.data-store.realm.schemas.account.v1.request :as request] + [status-im.data-store.realm.schemas.account.v1.user-status :as user-status] + [status-im.data-store.realm.schemas.account.v1.local-storage :as local-storage] + [status-im.data-store.realm.schemas.account.v2.mailserver :as mailserver] + [status-im.data-store.realm.schemas.account.v1.browser :as browser] + [taoensso.timbre :as log])) + +(def schema [chat/schema + transport/schema + contact/schema + message/schema + request/schema + mailserver/schema + user-status/schema + local-storage/schema + browser/schema]) + +(defn migration [old-realm new-realm] + (log/debug "migrating v4 account database: " old-realm new-realm)) diff --git a/src/status_im/data_store/realm/schemas/account/v4/transport.cljs b/src/status_im/data_store/realm/schemas/account/v4/transport.cljs new file mode 100644 index 0000000000..d74ffab020 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/account/v4/transport.cljs @@ -0,0 +1,17 @@ +(ns status-im.data-store.realm.schemas.account.v4.transport) + +(def schema {:name :transport + :primaryKey :chat-id + :properties {:chat-id :string + :ack :string + :seen :string + :pending-ack :string + :pending-send :string + :topic :string + :fetch-history? {:type :bool + :default false} + :sym-key-id {:type :string + :optional true} + ;;TODO (yenda) remove once go implements persistence + :sym-key {:type :string + :optional true}}}) diff --git a/src/status_im/data_store/realm/schemas/base/core.cljs b/src/status_im/data_store/realm/schemas/base/core.cljs index 3a2e651e05..6c08f5466a 100644 --- a/src/status_im/data_store/realm/schemas/base/core.cljs +++ b/src/status_im/data_store/realm/schemas/base/core.cljs @@ -1,6 +1,7 @@ (ns status-im.data-store.realm.schemas.base.core (:require [status-im.data-store.realm.schemas.base.v1.core :as v1] - [status-im.data-store.realm.schemas.base.v2.core :as v2])) + [status-im.data-store.realm.schemas.base.v2.core :as v2] + [status-im.data-store.realm.schemas.base.v3.core :as v3])) ;; put schemas ordered by version (def schemas [{:schema v1/schema @@ -8,4 +9,7 @@ :migration v1/migration} {:schema v2/schema :schemaVersion 2 - :migration v2/migration}]) + :migration v2/migration} + {:schema v3/schema + :schemaVersion 3 + :migration v3/migration}]) diff --git a/src/status_im/data_store/realm/schemas/base/v3/account.cljs b/src/status_im/data_store/realm/schemas/base/v3/account.cljs new file mode 100644 index 0000000000..532314ada0 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/base/v3/account.cljs @@ -0,0 +1,27 @@ +(ns status-im.data-store.realm.schemas.base.v3.account) + +(def schema {:name :account + :primaryKey :address + :properties {:address :string + :public-key :string + :name {:type :string :optional true} + :email {:type :string :optional true} + :status {:type :string :optional true} + :debug? {:type :bool :default false} + :photo-path :string + :signing-phrase {:type :string} + :mnemonic {:type :string :optional true} + :last-updated {:type :int :default 0} + :last-sign-in {:type :int :default 0} + :signed-up? {:type :bool + :default false} + :network :string + :networks {:type :list + :objectType :network} + :last-request {:type :int :optional true} + :settings {:type :string} + :sharing-usage-data? {:type :bool :default false} + :dev-mode? {:type :bool :default false} + :seed-backed-up? {:type :bool :default false} + :wallet-set-up-passed? {:type :bool + :default false}}}) diff --git a/src/status_im/data_store/realm/schemas/base/v3/core.cljs b/src/status_im/data_store/realm/schemas/base/v3/core.cljs new file mode 100644 index 0000000000..3c7ad481d0 --- /dev/null +++ b/src/status_im/data_store/realm/schemas/base/v3/core.cljs @@ -0,0 +1,10 @@ +(ns status-im.data-store.realm.schemas.base.v3.core + (:require [status-im.data-store.realm.schemas.base.v1.network :as network] + [status-im.data-store.realm.schemas.base.v3.account :as account] + [taoensso.timbre :as log])) + +(def schema [network/schema + account/schema]) + +(defn migration [old-realm new-realm] + (log/debug "migrating base database v3: " old-realm new-realm)) diff --git a/src/status_im/network/events.cljs b/src/status_im/network/events.cljs index b707e9487f..f6afd8eada 100644 --- a/src/status_im/network/events.cljs +++ b/src/status_im/network/events.cljs @@ -31,7 +31,7 @@ (fn [{{:keys [network-status mailserver-status] :as db} :db :as cofx} [is-connected?]] (cond-> (handlers-macro/merge-fx cofx {:db (assoc db :network-status (if is-connected? :online :offline))} - (inbox/request-messages {:discover? true})) + (inbox/request-messages)) is-connected? (assoc :drain-mixpanel-events nil)))) diff --git a/src/status_im/transport/db.cljs b/src/status_im/transport/db.cljs index 03c2eaf94b..2ba0b9e2e1 100644 --- a/src/status_im/transport/db.cljs +++ b/src/status_im/transport/db.cljs @@ -9,6 +9,7 @@ (spec/def ::pending-ack (spec/coll-of string? :kind vector?)) (spec/def ::pending-send (spec/coll-of string? :kind vector?)) (spec/def ::topic string?) +(spec/def ::fetch-history? boolean?) ;; optional (spec/def ::sym-key-id string?) @@ -16,7 +17,7 @@ (spec/def ::sym-key string?) (spec/def ::filter any?) -(spec/def :transport/chat (allowed-keys :req-un [::ack ::seen ::pending-ack ::pending-send ::topic] +(spec/def :transport/chat (allowed-keys :req-un [::ack ::seen ::pending-ack ::pending-send ::topic ::fetch-history?] :opt-un [::sym-key-id ::sym-key ::filter])) (spec/def :transport/chats (spec/map-of :global/not-empty-string :transport/chat)) @@ -26,8 +27,9 @@ "Initialize datastructure for chat representation at the transport level Currently only :topic is actually used" [topic] - {:ack [] - :seen [] - :pending-ack [] - :pending-send [] - :topic topic}) + {:ack [] + :seen [] + :pending-ack [] + :pending-send [] + :fetch-history? true + :topic topic}) diff --git a/src/status_im/transport/handlers.cljs b/src/status_im/transport/handlers.cljs index 55fcf32b93..f9a33904f7 100644 --- a/src/status_im/transport/handlers.cljs +++ b/src/status_im/transport/handlers.cljs @@ -97,7 +97,7 @@ {:db (assoc-in db [:transport/chats chat-id :sym-key-id] sym-key-id) - :dispatch [:inbox/request-messages {:topics [topic] :discover? false}] + :dispatch [:inbox/request-chat-history chat-id] :shh/add-filter {:web3 web3 :sym-key-id sym-key-id :topic topic @@ -156,7 +156,7 @@ fx {:db (assoc-in db [:transport/chats chat-id :sym-key-id] sym-key-id) - :dispatch [:inbox/request-messages {:topics [topic]}] + :dispatch [:inbox/request-chat-history chat-id] :shh/add-filter {:web3 web3 :sym-key-id sym-key-id :topic topic diff --git a/src/status_im/transport/inbox.cljs b/src/status_im/transport/inbox.cljs index f8b9824aa3..2f804c2e69 100644 --- a/src/status_im/transport/inbox.cljs +++ b/src/status_im/transport/inbox.cljs @@ -12,16 +12,40 @@ [status-im.utils.utils :as utils] [status-im.i18n :as i18n] [status-im.constants :as constants] - [status-im.utils.handlers-macro :as handlers-macro])) + [status-im.data-store.accounts :as accounts-store] + [status-im.utils.handlers-macro :as handlers-macro] + [status-im.data-store.core :as data-store] + [status-im.ui.screens.accounts.events :as accounts] + [status-im.data-store.transport :as transport-store])) + +;; How does offline inboxing work ? +;; +;; - We send a request to the mailserver, we are only interested in the +;; messages since `last-request`, the time of the last successful request, +;; and the last 7 days for topics that were just joined +;; - The mailserver doesn't directly respond to the request and +;; instead we start receiving messages in the filters for the requested +;; topics. +;; - These messages are expired that is how we differentiate them from +;; normal whisper messages to update last-received +;; - After fetching-timeout is reached since the last mailserver message +;; was received without a connection incident, we consider the request +;; successfull and update `last-request` and `fetch-history?` fields of each +;; topic to false +;; - If the mailserver was not ready when we tried for instance to request +;; the history of a topic after joining a chat, the request will be done +;; as soon as the mailserver becomes available (def connection-timeout "Time after which mailserver connection is considered to have failed" 60000) -(def fetching-messages-notification-timeout - "Time after which we consider mailserver is done fetching messages and we can - stop showing notification to user" - 5000) +(def fetching-timeout + "Time we should wait after last message was fetch from mailserver before we + consider it done + Needs to be at least 10 seconds because that is the time it takes for the app + to realize it was disconnected" + 10000) (defn- parse-json ;; NOTE(dmitryn) Expects JSON response like: @@ -102,7 +126,7 @@ (mark-trusted-peer web3 wnode #(re-frame/dispatch [:inbox/mailserver-trusted %]) - #(re-frame/dispatch [:inbox/connection-check])))) + #(re-frame/dispatch [:inbox/check-connection])))) (re-frame/reg-fx ::request-messages @@ -116,9 +140,23 @@ #(log/info "offline inbox: request-messages response" %) #(log/error "offline inbox: request-messages error" %1 %2 to from)))) +(re-frame/reg-fx + ::request-history + (fn [{:keys [wnode topics to from sym-key-id web3]}] + (request-inbox-messages web3 + wnode + topics + to + from + sym-key-id + #(log/info "offline inbox: request-messages response" %) + #(log/error "offline inbox: request-messages error" %1 %2 to from)))) + (defn update-mailserver-status [transition {:keys [db]}] (let [state transition] - {:db (assoc db :mailserver-status state)})) + {:db (assoc db + :mailserver-status state + :inbox/fetching? false)})) (defn generate-mailserver-symkey [{:keys [db] :as cofx}] (when-not (:inbox/sym-key-id db) @@ -149,7 +187,7 @@ (handlers-macro/merge-fx cofx {::add-peer {:wnode wnode} :utils/dispatch-later [{:ms connection-timeout - :dispatch [:inbox/connection-check]}]} + :dispatch [:inbox/check-connection]}]} (update-mailserver-status :connecting) (generate-mailserver-symkey)))))) @@ -166,8 +204,10 @@ wnode) mailserver-is-registered? (registered-peer? peers-summary wnode) + ;; the mailserver just connected mailserver-connected? (and mailserver-is-registered? (not mailserver-was-registered?)) + ;; the mailserver just disconnected mailserver-disconnected? (and mailserver-was-registered? (not mailserver-is-registered?))] (cond @@ -178,40 +218,69 @@ {::mark-trusted-peer {:web3 (:web3 db) :wnode wnode}})))) -(defn get-topics - [db topics discover?] - (let [inbox-topics (:inbox/topics db) - discovery-topic (transport.utils/get-topic constants/contact-discovery) - topics (or topics - (map #(:topic %) (vals (:transport/chats db))))] - (cond-> (apply conj inbox-topics topics) - discover? (conj discovery-topic)))) +(defn inbox-ready? [{:keys [db]}] + (let [mailserver-status (:mailserver-status db) + sym-key-id (:inbox/sym-key-id db)] + (and (= :connected mailserver-status) + sym-key-id))) + +(defn get-request-messages-topics + "Returns topics for which full history has already been recovered" + [db] + (conj (mapv :topic + (remove :fetch-history? + (vals (:transport/chats db)))) + (transport.utils/get-topic constants/contact-discovery))) + +(defn get-request-history-topics + "Returns topics for which full history has not been recovered" + [db] + (mapv :topic + (filter :fetch-history? + (vals (:transport/chats db))))) (defn request-messages - ([cofx] - (request-messages {} cofx)) - ([{:keys [topics discover? should-recover?] - :or {should-recover? true - discover? true}} - {:keys [db] :as cofx}] - (let [mailserver-status (:mailserver-status db) - sym-key-id (:inbox/sym-key-id db) - wnode (get-current-wnode-address db) - inbox-topics (get-topics db topics discover?) - inbox-ready? (and (= :connected mailserver-status) - sym-key-id)] - (when should-recover? - (if inbox-ready? - {::request-messages {:wnode wnode - :topics (into [] inbox-topics) - :sym-key-id sym-key-id - :web3 (:web3 db)} - :db (assoc db - :inbox/fetching? true - :inbox/topics #{}) - :dispatch-later [{:ms fetching-messages-notification-timeout - :dispatch [:inbox/remove-fetching-notification]}]} - {:db (assoc db :inbox/topics (into #{} inbox-topics))}))))) + ([{:keys [db now] :as cofx}] + (let [wnode (get-current-wnode-address db) + web3 (:web3 db) + sym-key-id (:inbox/sym-key-id db) + now-in-s (quot now 1000) + last-request (get-in db [:account/account :last-request] + (- now-in-s (* 3600 24))) + request-messages-topics (get-request-messages-topics db) + request-history-topics (get-request-history-topics db)] + (when (inbox-ready? cofx) + {::request-messages {:wnode wnode + :topics request-messages-topics + :from last-request + :to now-in-s + :sym-key-id sym-key-id + :web3 web3} + ::request-history {:wnode wnode + :topics request-history-topics + :sym-key-id sym-key-id + :web3 web3} + :db (assoc db :inbox/fetching? true) + :dispatch-later [{:ms fetching-timeout + :dispatch [:inbox/check-fetching now-in-s]}]}))) + ([should-recover? {:keys [db] :as cofx}] + (when should-recover? + (request-messages cofx)))) + +(defn request-chat-history [chat-id {:keys [db now] :as cofx}] + (let [wnode (get-current-wnode-address db) + web3 (:web3 db) + sym-key-id (:inbox/sym-key-id db) + topic (get-in db [:transport/chats chat-id :topic]) + now-in-s (quot now 1000)] + (when (inbox-ready? cofx) + {::request-history {:wnode wnode + :topics [topic] + :sym-key-id sym-key-id + :web3 web3} + :db (assoc db :inbox/fetching? true) + :dispatch-later [{:ms fetching-timeout + :dispatch [:inbox/check-fetching now-in-s chat-id]}]}))) ;;;; Handlers @@ -239,20 +308,68 @@ (request-messages)))) (handlers/register-handler-fx - :inbox/request-messages - (fn [cofx [_ args]] - (request-messages args cofx))) + :inbox/request-chat-history + (fn [{:keys [db] :as cofx} [_ chat-id]] + (request-chat-history chat-id cofx))) (handlers/register-handler-fx - :inbox/connection-check + :inbox/check-connection (fn [{:keys [db] :as cofx} [_ _]] (when (= :connecting (:mailserver-status db)) (update-mailserver-status :error cofx)))) +(defn update-last-request [last-request {:keys [db]}] + (let [chats (:transport/chats db) + transport-txs (reduce (fn [txs [chat-id chat]] + (if (:fetch-history? chat) + (conj txs + (transport-store/save-transport-tx + {:chat-id chat-id + :chat (assoc chat + :fetch-history? false)})) + txs)) + [] + chats) + chats-update (reduce (fn [acc [chat-id chat]] + (if (:fetch-history? chat) + (assoc acc chat-id (assoc chat :fetch-history? false)) + (assoc acc chat-id chat))) + {} + chats)] + {:db (-> db + (assoc :transport/chats chats-update) + (assoc-in [:account/account :last-request] + last-request)) + :data-store/base-tx [(accounts-store/save-account-tx + (assoc (:account/account db) + :last-request last-request))] + :data-store/tx transport-txs})) + +(defn update-fetch-history [chat-id {:keys [db]}] + {:db (assoc-in db + [:transport/chats chat-id :fetch-history?] + false) + :data-store/tx [(transport-store/save-transport-tx + {:chat-id chat-id + :chat (assoc (get-in db [:transport/chats chat-id]) + :fetch-history? false)})]}) + (handlers/register-handler-fx - :inbox/remove-fetching-notification - (fn [{:keys [db] :as cofx} [_ _]] - {:db (dissoc db :inbox/fetching?)})) + :inbox/check-fetching + (fn [{:keys [db now] :as cofx} [_ last-request chat-id]] + (when (:inbox/fetching? db) + (let [time-since-last-received (- now (:inbox/last-received db))] + (if (> time-since-last-received fetching-timeout) + (if chat-id + (handlers-macro/merge-fx cofx + {:db (assoc db :inbox/fetching? false)} + (update-fetch-history chat-id)) + (handlers-macro/merge-fx cofx + {:db (assoc db :inbox/fetching? false)} + (update-last-request last-request))) + {:dispatch-later [{:ms (- fetching-timeout + time-since-last-received) + :dispatch [:inbox/check-fetching last-request chat-id]}]}))))) (handlers/register-handler-fx :inbox/reconnect diff --git a/src/status_im/transport/message/v1/public_chat.cljs b/src/status_im/transport/message/v1/public_chat.cljs index 3e525ff4c9..a99c3e8671 100644 --- a/src/status_im/transport/message/v1/public_chat.cljs +++ b/src/status_im/transport/message/v1/public_chat.cljs @@ -30,7 +30,7 @@ (fn [{:keys [db] :as cofx} [_ {:keys [sym-key-id sym-key chat-id]}]] (let [{:keys [web3]} db topic (transport.utils/get-topic chat-id)] - {:db (assoc-in db [:transport/chats chat-id :sym-key-id] sym-key-id) + {:db (assoc-in db [:transport/chats chat-id :sym-key-id] sym-key-id) :shh/add-filter {:web3 web3 :sym-key-id sym-key-id :topic topic @@ -41,6 +41,4 @@ (assoc :sym-key-id sym-key-id) ;;TODO (yenda) remove once go implements persistence (assoc :sym-key sym-key))})] - :dispatch [:inbox/request-messages {:topics [topic] - :discover? false - :from 0}]}))) + :dispatch [:inbox/request-chat-history chat-id]}))) diff --git a/src/status_im/ui/screens/accounts/db.cljs b/src/status_im/ui/screens/accounts/db.cljs index d733e6446b..c7ef1c350f 100644 --- a/src/status_im/ui/screens/accounts/db.cljs +++ b/src/status_im/ui/screens/accounts/db.cljs @@ -18,6 +18,7 @@ (spec/def :account/signed-up? (spec/nilable boolean?)) (spec/def :account/last-updated (spec/nilable int?)) (spec/def :account/last-sign-in (spec/nilable int?)) +(spec/def :account/last-request (spec/nilable int?)) (spec/def :account/photo-path (spec/nilable string?)) (spec/def :account/debug? (spec/nilable boolean?)) (spec/def :account/status (spec/nilable string?)) @@ -40,7 +41,7 @@ :account/networks :account/settings :account/wnode :account/last-sign-in :account/sharing-usage-data? :account/dev-mode? :account/seed-backed-up? :account/mnemonic - :account/wallet-set-up-passed?])) + :account/wallet-set-up-passed? :account/last-request])) (spec/def :accounts/accounts (spec/nilable (spec/map-of :account/address :accounts/account))) diff --git a/src/status_im/ui/screens/db.cljs b/src/status_im/ui/screens/db.cljs index fa924feb62..77191fe1ca 100644 --- a/src/status_im/ui/screens/db.cljs +++ b/src/status_im/ui/screens/db.cljs @@ -42,7 +42,6 @@ :notifications {} :network constants/default-network :networks/networks constants/default-networks - :inbox/topics #{} :inbox/wnodes constants/default-wnodes :inbox/password constants/inbox-password :my-profile/editing? false @@ -72,7 +71,6 @@ (spec/def ::network-status (spec/nilable keyword?)) (spec/def ::mailserver-status (spec/nilable keyword?)) -(spec/def :inbox/topics set?) ;;;;NODE @@ -175,10 +173,8 @@ :node/after-start :node/after-stop :inbox/wnodes - :inbox/topics :inbox/password :inbox/sym-key-id - :inbox/last-request :inbox/last-received :inbox/fetching? :browser/browsers diff --git a/src/status_im/ui/screens/events.cljs b/src/status_im/ui/screens/events.cljs index f2ad89bd88..fdc970d52e 100644 --- a/src/status_im/ui/screens/events.cljs +++ b/src/status_im/ui/screens/events.cljs @@ -456,8 +456,7 @@ (let [app-coming-from-background? (= state "active")] (handlers-macro/merge-fx cofx {::app-state-change-fx state} - (inbox/request-messages {:should-recover? app-coming-from-background? - :discover? true}))))) + (inbox/request-messages app-coming-from-background?))))) (handlers/register-handler-fx :request-permissions diff --git a/src/status_im/ui/screens/offline_messaging_settings/db.cljs b/src/status_im/ui/screens/offline_messaging_settings/db.cljs index c7512f4519..f6af44a79a 100644 --- a/src/status_im/ui/screens/offline_messaging_settings/db.cljs +++ b/src/status_im/ui/screens/offline_messaging_settings/db.cljs @@ -17,5 +17,4 @@ (spec/def :inbox/password ::not-blank-string) (spec/def :inbox/wnodes (spec/nilable (spec/map-of keyword? (spec/map-of :wnode/id :wnode/wnode)))) (spec/def :inbox/sym-key-id string?) -(spec/def :inbox/last-request integer?) (spec/def :inbox/last-received integer?) diff --git a/test/cljs/status_im/test/transport/inbox.cljs b/test/cljs/status_im/test/transport/inbox.cljs index b2fb907fa3..0778c97dfa 100644 --- a/test/cljs/status_im/test/transport/inbox.cljs +++ b/test/cljs/status_im/test/transport/inbox.cljs @@ -3,40 +3,6 @@ [status-im.transport.inbox :as inbox] [status-im.constants :as constants])) -(deftest request-messages - (testing "mailserver not connected" - (is (= (inbox/request-messages {} {:db {:mailserver-status :connecting :inbox/sym-key-id :sym-key}}) - {:db - {:mailserver-status :connecting, - :inbox/sym-key-id :sym-key, - :inbox/topics #{"0xf8946aac"}}})) - (is (= (inbox/request-messages {:discover? false :topics ["Oxaaaaaaaa"]} {:db {:mailserver-status :connecting :inbox/sym-key-id :sym-key}}) - {:db - {:mailserver-status :connecting, - :inbox/sym-key-id :sym-key, - :inbox/topics #{"Oxaaaaaaaa"}}}))) - (testing "mailserver is connected" - (is (= (inbox/request-messages {} {:db {:mailserver-status :connected :inbox/sym-key-id :sym-key}}) - {:status-im.transport.inbox/request-messages - {:wnode nil, :topics ["0xf8946aac"], :sym-key-id :sym-key, :web3 nil}, - :db - {:mailserver-status :connected, - :inbox/sym-key-id :sym-key, - :inbox/fetching? true, - :inbox/topics #{}}, - :dispatch-later - [{:ms 5000, :dispatch [:inbox/remove-fetching-notification]}]}) - (= (inbox/request-messages {:discover? false :topics ["Oxaaaaaaaa"]} {:db {:mailserver-status :connected :inbox/sym-key-id :sym-key}}) - {:status-im.transport.inbox/request-messages - {:wnode nil, :topics ["Oxaaaaaaaa"], :sym-key-id :sym-key, :web3 nil}, - :db - {:mailserver-status :connected, - :inbox/sym-key-id :sym-key, - :inbox/fetching? true, - :inbox/topics #{}}, - :dispatch-later - [{:ms 5000, :dispatch [:inbox/remove-fetching-notification]}]})))) - (defn cofx-fixtures [sym-key registered-peer?] {:db {:mailserver-status :connected :inbox/sym-key-id sym-key