Skip to content

Commit

Permalink
Remove mailserver logic
Browse files Browse the repository at this point in the history
  • Loading branch information
cammellos committed Feb 9, 2022
1 parent fa4099b commit 2f0c907
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 247 deletions.
263 changes: 18 additions & 245 deletions src/status_im/mailserver/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -60,69 +60,6 @@
current-fleet
vals)))))

(defn get-selected-mailserver
"Use the preferred mailserver if set & exists"
[db]
(let [preference (preferred-mailserver-id db)]
(when (and preference
(fetch db preference))
preference)))

;; We now wait for a confirmation from the mailserver before marking the message
;; as sent.
(defn update-mailservers! [enodes on-success]
(json-rpc/call
{:method (json-rpc/call-ext-method "updateMailservers")
:params [enodes]
:on-success #(do
(log/debug "mailserver: update-mailservers success" %)
(when on-success
(on-success)))
:on-error #(log/error "mailserver: update-mailservers error" %)}))

(defn remove-peer! [enode]
(let [args {:jsonrpc "2.0"
:id 2
:method "admin_removePeer"
:params [enode]}
payload (.stringify js/JSON (clj->js args))]
(when enode
(status/call-private-rpc payload
(handlers/response-handler
#(log/info "mailserver: remove-peer success" %)
#(log/error "mailserver: remove-peer error" %))))))

(re-frame/reg-fx
:mailserver/remove-peer
(fn [enode]
(remove-peer! enode)))

(re-frame/reg-fx
:mailserver/update-mailservers
(fn [[enodes on-success]]
(update-mailservers! enodes on-success)))

(defn registered-peer?
"truthy if the enode is a registered peer"
[peers enode]
(let [registered-enodes (into #{} (map :enode) peers)]
(contains? registered-enodes enode)))

(defn update-mailserver-state [db state]
(assoc db :mailserver/state state))

(fx/defn add-peer
[{:keys [db now] :as cofx}]
(let [{:keys [address] :as mailserver}
(fetch-current db)]
{:db (assoc
(update-mailserver-state db :connecting)
:mailserver/last-connection-attempt now)
;; Any message sent before this takes effect will not be marked as sent
;; probably we should improve the UX so that is more transparent to the
;; user
:mailserver/update-mailservers [[address]]}))

(fx/defn disconnect-from-mailserver
{:events [::disconnect-from-mailserver]}
[{:keys [db] :as cofx}]
Expand All @@ -139,52 +76,10 @@
(defn pool-size [fleet-size]
(.ceil js/Math (/ fleet-size 4)))

(fx/defn get-mailservers-latency
[{:keys [db] :as cofx}]
(let [current-fleet (node/current-fleet-key db)
addresses (mapv :address (-> db
:mailserver/mailservers
current-fleet
vals))]
{::json-rpc/call [{:method "mailservers_ping"
:params [{:addresses addresses
:timeoutMs 500}]
:on-success
#(re-frame/dispatch [::get-latency-callback %])}]}))

(fx/defn log-mailserver-failure [{:keys [db now]}]
(when-let [mailserver (fetch-current db)]
{:db (assoc-in db [:mailserver/failures (:address mailserver)] now)}))

(defn sort-mailservers
"Sort mailservers sorts the mailservers by recent failures, and by rtt
for breaking ties"
[{:keys [now db]} mailservers]
(let [mailserver-failures (:mailserver/failures db)
sort-fn (fn [a b]
(let [failures-a (get mailserver-failures (:address a))
failures-b (get mailserver-failures (:address b))
has-a-failed? (boolean
(and failures-a (<= (- now failures-a) constants/cooloff-period)))
has-b-failed? (boolean
(and failures-b (<= (- now failures-b) constants/cooloff-period)))]
;; If both have failed, or none of them, then compare rtt
(cond
(= has-a-failed? has-b-failed?)
(compare (:rttMs a) (:rttMs b))
;; Otherwise prefer the one that has not failed recently
has-a-failed? 1
has-b-failed? -1)))]
(sort sort-fn mailservers)))

(defn get-mailserver-when-ready
"return the mailserver if the mailserver is ready"
[{:keys [db]}]
(let [mailserver (fetch-current db)
mailserver-state (:mailserver/state db)]
(when (= :connected mailserver-state)
mailserver)))

(fx/defn handle-successful-request
{:events [::request-success]}
[{:keys [db] :as cofx} response-js]
Expand All @@ -199,97 +94,23 @@
(mobile-network-utils/syncing-allowed? cofx)
(fetch-use-mailservers? cofx)
(not (:mailserver/current-request db)))
(when-let [mailserver (get-mailserver-when-ready cofx)]
{:db (assoc db :mailserver/current-request true)
::json-rpc/call [{:method "wakuext_requestAllHistoricMessages2"
:params []
:js-response true
:on-success #(do
(log/info "fetched historical messages")
(re-frame/dispatch [::request-success %]))
:on-error #(do
(log/error "failed retrieve historical messages" %)
(re-frame/dispatch [::disconnect-from-mailserver]))}]})))
{:db (assoc db :mailserver/current-request true)
::json-rpc/call [{:method "wakuext_requestAllHistoricMessages2"
:params []
:js-response true
:on-success #(do
(log/info "fetched historical messages")
(re-frame/dispatch [::request-success %]))
:on-error #(do
(log/error "failed retrieve historical messages" %)
(re-frame/dispatch [::disconnect-from-mailserver]))}]}))

(fx/defn connected-to-mailserver
[{:keys [db] :as cofx}]
(let [{:keys [address]} (fetch-current db)]
(fx/merge
cofx
{:db (update-mailserver-state db :connected)
:mailserver/update-mailservers [[address] #(re-frame/dispatch [::request-messages])]})))

(fx/defn connect-to-mailserver
"Add mailserver as a peer using `::add-peer` cofx and generate sym-key when
it doesn't exists
Peer summary will change and we will receive a signal from status go when
this is successful
A connection-check is made after `connection timeout` is reached and
mailserver-state is changed to error if it is not connected by then
No attempt is made if mailserver usage is disabled"
{:events [:mailserver.ui/reconnect-mailserver-pressed]}
[{:keys [db] :as cofx}]
(let [{:keys [address]} (fetch-current db)
{:keys [peers-summary]} db
use-mailservers? (fetch-use-mailservers? cofx)
added? (registered-peer? peers-summary address)]
(when use-mailservers?
(fx/merge cofx
{:db (dissoc db :mailserver/current-request)}
(if added?
(connected-to-mailserver)
(add-peer))))))

(fx/defn set-current-mailserver-with-lowest-latency
"Picks a random mailserver amongs the ones with the lowest latency
The results with error are ignored
The pool size is 1/4 of the mailservers were pinged successfully"
{:events [::get-latency-callback]}
[{:keys [db] :as cofx} latency-results]
(let [successful-pings (remove :error latency-results)]
(when (seq successful-pings)
(let [address (-> (take (pool-size (count successful-pings))
(sort-mailservers cofx successful-pings))
rand-nth
:address)
mailserver-id (mailserver-address->id db address)]
(fx/merge cofx
{:db (assoc db :mailserver/current-id mailserver-id)}
(connect-to-mailserver))))))

(fx/defn set-current-mailserver
[{:keys [db] :as cofx}]
(if-let [mailserver-id (get-selected-mailserver db)]
(fx/merge cofx
{:db (assoc db :mailserver/current-id mailserver-id)}
(connect-to-mailserver))
(get-mailservers-latency cofx)))

(fx/defn peers-summary-change
"There is only 2 summary changes that require mailserver action:
- mailserver disconnected: we try to reconnect
- mailserver connected: we mark the mailserver as trusted peer"
[{:keys [db] :as cofx} previous-summary]
(when (:multiaccount db)
(if (:mailserver/current-id db)
(let [{:keys [peers-summary peers-count]} db
{:keys [address] :as mailserver} (fetch-current db)
mailserver-was-registered? (registered-peer? previous-summary
address)
mailserver-is-registered? (registered-peer? peers-summary
address)
mailserver-added? (and mailserver-is-registered?
(not mailserver-was-registered?))
mailserver-removed? (and mailserver-was-registered?
(not mailserver-is-registered?))]
(cond
mailserver-added?
(connected-to-mailserver cofx)
mailserver-removed?
(connect-to-mailserver cofx)))
;; if there is no current mailserver defined
;; we set it first
(set-current-mailserver cofx))))
{:mailserver/update-mailservers [[address] #(re-frame/dispatch [::request-messages])]})))

(fx/defn handle-request-success
{:events [:mailserver.callback/request-success]}
Expand All @@ -304,7 +125,8 @@
(fx/merge cofx
(multiaccounts.update/multiaccount-update :use-mailservers? use-mailservers? {})
(if use-mailservers?
(connect-to-mailserver)
;; TODO: fixme
true ;(connect-to-mailserver)
(disconnect-from-mailserver))))

(defonce showing-connection-error-popup? (atom false))
Expand All @@ -331,54 +153,9 @@
preferred-mailserver]))
:style "default"}]}))

(fx/defn change-mailserver
"mark mailserver status as `:error` if custom mailserver is used
otherwise try to reconnect to another mailserver"
[{:keys [db] :as cofx}]
(when (and (fetch-use-mailservers? cofx)
;; For some reason the tests are checking
;; for non-zero, so nil value is ok, not
;; sure is intentional, but will leave it as it is
;; instead of using pos?
(not (zero? (:peers-count db))))
(if-let [preferred-mailserver (preferred-mailserver-id db)]
(let [error-dismissed? (connection-error-dismissed db)
current-fleet (node/current-fleet-key db)]
;; Error connecting to the mail server
(cond-> {:db (update-mailserver-state db :error)}
(not (or error-dismissed? @showing-connection-error-popup?))
(show-connection-error! current-fleet preferred-mailserver)))
(let [{:keys [address]} (fetch-current db)]
(fx/merge cofx
{:mailserver/remove-peer address}
(set-current-mailserver))))))

(defn check-connection! []
(re-frame/dispatch [:mailserver/check-connection-timeout]))

(fx/defn check-connection
"Check connection checks that the connection is successfully connected,
otherwise it will try to change mailserver and connect again"
{:events [:mailserver/check-connection-timeout]}
[{:keys [db now] :as cofx}]
;; check if logged into multiaccount
(when (contains? db :multiaccount)
(let [last-connection-attempt (:mailserver/last-connection-attempt db)]
(if (and (fetch-use-mailservers? cofx)
;; We are not connected
(not= :connected (:mailserver/state db))
;; We either never tried to connect to this peer
(or (nil? last-connection-attempt)
;; Or 30 seconds have passed and no luck
(>= (- now last-connection-attempt) (* constants/connection-timeout 3))))
;; Then we change mailserver
(change-mailserver cofx)
;; Just make sure it's set
(let [{:keys [address] :as mailserver}
(fetch-current db)]
(when address
{:mailserver/update-mailservers [[address]]}))))))

(fx/defn retry-next-messages-request
{:events [:mailserver.ui/retry-request-pressed]}
[{:keys [db] :as cofx}]
Expand Down Expand Up @@ -406,13 +183,6 @@
:on-accept #(re-frame/dispatch [:mailserver.ui/retry-request-pressed])
:confirm-button-text (i18n/label :t/mailserver-request-retry)}}))

(fx/defn initialize-mailserver
[{:keys [db] :as cofx}]
(fx/merge cofx
{:db db}
(set-current-mailserver)
(process-next-messages-request)))

(def enode-address-regex
#"enode://[a-zA-Z0-9]+\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
(def enode-url-regex
Expand Down Expand Up @@ -584,7 +354,8 @@
(fx/merge cofx
{:db (assoc db :mailserver/current-id mailserver-id)
:mailserver/remove-peer address}
(when use-mailservers? (connect-to-mailserver))
;; TODO: fixme
(when use-mailservers? true);(connect-to-mailserver))
(dismiss-connection-error false)
(when pinned?
(multiaccounts.update/multiaccount-update
Expand All @@ -603,7 +374,9 @@
:pinned-mailservers (dissoc pinned-mailservers current-fleet)
{})
(dismiss-connection-error false)
(change-mailserver))))
;; TODO: fixme
true)))
;(change-mailserver))))

(fx/defn pin
{:events [:mailserver.ui/pin-pressed]}
Expand Down
1 change: 0 additions & 1 deletion src/status_im/signals/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
{:db (assoc db
:peers-summary peers-summary
:peers-count peers-count)}
(mailserver/peers-summary-change previous-summary)
(visibility-status-updates/peers-summary-change peers-count))))

(fx/defn wakuv2-peer-stats
Expand Down
1 change: 0 additions & 1 deletion src/status_im/transport/core.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@
(fetch-node-info-fx)
(pairing/init)
(publisher/start-fx)
(mailserver/initialize-mailserver)
(universal-links/process-stored-event)))

(fx/defn stop-whisper
Expand Down

0 comments on commit 2f0c907

Please sign in to comment.