diff --git a/src/status_im/chat/events/console.cljs b/src/status_im/chat/events/console.cljs index aeb41371bb..9c599bddf0 100644 --- a/src/status_im/chat/events/console.cljs +++ b/src/status_im/chat/events/console.cljs @@ -87,11 +87,10 @@ (i18n/label :t/faucet-error)))}})) "debug" - (fn [{:keys [random-id] :as cofx} {:keys [params id]}] - (let [debug? (= "On" (:mode params)) - fx (accounts-events/account-update cofx {:debug? debug?})] + (fn [{:keys [random-id db] :as cofx} {:keys [params id]}] + (let [debug? (= "On" (:mode params))] (assoc fx :dispatch-n (if debug? - [[:debug-server-start] + [[:initialize-debugging {:force-start? true}] [:received-message {:message-id random-id :content (i18n/label :t/debug-enabled) @@ -100,7 +99,7 @@ :chat-id const/console-chat-id :from const/console-chat-id :to "me"}]] - [[:debug-server-stop]]))))}) + [[:stop-debugging]]))))}) (def commands-names (set (keys console-commands->fx))) diff --git a/src/status_im/commands/handlers/debug.cljs b/src/status_im/commands/handlers/debug.cljs new file mode 100644 index 0000000000..6e1d664af6 --- /dev/null +++ b/src/status_im/commands/handlers/debug.cljs @@ -0,0 +1,175 @@ +(ns status-im.commands.handlers.debug + (:require [re-frame.core :as re-frame] + [status-im.components.react :as react] + [status-im.data-store.accounts :as accounts] + [status-im.data-store.messages :as messages] + [status-im.utils.handlers :as handlers] + [status-im.utils.platform :as platform] + [status-im.utils.types :as types] + [taoensso.timbre :as log])) + +(def debug-server-port 5561) + +(defn respond [data] + (.respond react/http-bridge + 200 + "application/json" + (types/clj->json data))) + +(defn debug-server-start [] + (.start react/http-bridge + debug-server-port + (if platform/ios? + "Status iOS" + "Status Android") + (fn [req] + (try + (let [{:keys [postData url]} (js->clj req :keywordize-keys true) + postData (if (string? postData) + (-> (.parse js/JSON postData) + (js->clj :keywordize-keys true)) + postData)] + (re-frame/dispatch [::process-request url postData])) + (catch js/Error e + (log/debug "Error: " e)))))) + + +;;;; Specific debug methods +;; TODO: there are still a lot of dispatch calls here. we can remove or restructure most of them, +;; but to do this we need to also rewrite a lot of already existing functions + +(defn add-contact + [{:contacts/keys [contacts]} {:keys [name whisper-identity dapp-url bot-url] :as dapp-data}] + (if (and name + whisper-identity + (or dapp-url bot-url)) + (if (or (not (get contacts whisper-identity)) + (get-in contacts [whisper-identity :debug?])) + (let [dapp (merge dapp-data {:dapp? true + :debug? true})] + (re-frame/dispatch [:upsert-chat! {:chat-id whisper-identity + :name name + :debug? true}]) + (if (get contacts whisper-identity) + (do (re-frame/dispatch [:update-contact! dapp]) + (respond {:type :ok + :text "The DApp or bot has been updated."})) + (do (re-frame/dispatch [:add-contacts [dapp]]) + (re-frame/dispatch [:open-chat-with-contact dapp]) + (respond {:type :ok + :text "The DApp or bot has been added."})))) + (respond {:type :error + :text "Your DApp or bot should be debuggable."})) + (respond {:type :error + :text (str "You can add either DApp or bot. The object should contain \"name\", " + "\"whisper-identity\", and \"dapp-url\" or \"bot-url\" fields.")}))) + +(defn remove-contact + [{:keys [chats]} {:keys [whisper-identity]}] + (if (get chats whisper-identity) + (if (get-in chats [whisper-identity :debug?]) + (do (re-frame/dispatch [:remove-chat whisper-identity]) + (respond {:type :ok + :text "The DApp or bot has been removed."})) + (respond {:type :error + :text "Your DApp or bot should be debuggable."})) + (respond {:type :error + :text "There is no such DApp or bot."})) + (re-frame/dispatch [:remove-contact whisper-identity #(and (:dapp? %) (:debug? %))])) + +(defn contact-changed + [{:keys [webview-bridge current-chat-id] + :contacts/keys [contacts]} {:keys [whisper-identity] :as dapp-data}] + (when (get-in contacts [whisper-identity :debug?]) + (when (and (= current-chat-id whisper-identity) + webview-bridge) + (.reload webview-bridge)) + (when (get-in contacts [whisper-identity :bot-url]) + (re-frame/dispatch [:load-commands! whisper-identity]))) + (respond {:type :ok + :text "Command has been executed."})) + +(defn switch-node + [{:accounts/keys [current-account-id]} {:keys [url]}] + (re-frame/dispatch [:initialize-protocol current-account-id url]) + (respond {:type :ok + :text "You've successfully switched the node."})) + +(defn dapps-list + [{:contacts/keys [contacts]}] + (let [contacts (->> (vals contacts) + (filter :debug?) + (map #(select-keys % [:name :whisper-identity :dapp-url :bot-url])))] + (if (seq contacts) + (respond {:type :ok + :data contacts}) + (respond {:type :error + :text "No DApps or bots found."})))) + +(defn log [db {:keys [identity]}] + (let [log (messages/get-log-messages identity)] + (if (seq log) + (respond {:type :ok + :data log}) + (respond {:type :error + :text "No log messages found."})))) + + +;;;; FX + +(re-frame/reg-fx + ::initialize-debugging-fx + (fn [[address force-start?]] + (if force-start? + (debug-server-start) + (let [{:keys [debug?]} (accounts/get-by-address address)] + (when debug? + (debug-server-start)))))) + +(re-frame/reg-fx + ::stop-debugging-fx + (fn [_] + (.stop react/http-bridge))) + +(re-frame/reg-fx + ::process-request-fx + (fn [[{:keys [web3] :as db} url {:keys [encoded] :as post-data}]] + (try + (let [json (some->> encoded + (.toAscii web3) + (.parse js/JSON)) + obj (when json + (js->clj json :keywordize-keys true))] + (case url + "/add-dapp" (add-contact db obj) + "/remove-dapp" (remove-contact db obj) + "/dapp-changed" (contact-changed db obj) + "/switch-node" (switch-node db obj) + "/list" (dapps-list db) + "/log" (log db post-data) + :default)) + (catch js/Error e + (respond {:type :error :text (str "Error: " e)}) + (log/debug "Error: " e))))) + + +;;;; Handlers + +(handlers/register-handler-fx + :initialize-debugging + [re-frame/trim-v] + (fn [_ [{:keys [address force-start?]}]] + {::initialize-debugging-fx [address force-start?]})) + +(handlers/register-handler-fx + :stop-debugging + (fn [_] + {::stop-debugging-fx nil})) + +(handlers/register-handler-fx + ::process-request + [re-frame/trim-v] + (fn [{:keys [db]} [url post-data]] + {::process-request-fx [db url post-data]})) + + diff --git a/src/status_im/debug/handlers.cljs b/src/status_im/debug/handlers.cljs deleted file mode 100644 index af1faaace4..0000000000 --- a/src/status_im/debug/handlers.cljs +++ /dev/null @@ -1,156 +0,0 @@ -(ns status-im.debug.handlers - (:require [re-frame.core :refer [after dispatch]] - [status-im.utils.handlers :refer [register-handler] :as u] - [status-im.components.react :refer [http-bridge]] - [status-im.data-store.messages :as messages] - [status-im.data-store.accounts :as accounts] - [taoensso.timbre :as log] - [status-im.utils.platform :as platform] - [status-im.utils.types :as types])) - -(def debug-server-port 5561) - -(defn respond [data] - (.respond http-bridge - 200 - "application/json" - (types/clj->json data))) - -(register-handler :init-debug-mode - (u/side-effect! - (fn [_ [_ address]] - (let [{:keys [debug?]} (accounts/get-by-address address)] - (when debug? - (dispatch [:debug-server-start])))))) - -(register-handler :debug-server-start - (u/side-effect! - (fn [_] - (.start http-bridge - debug-server-port - (if platform/ios? - "Status iOS" - "Status Android") - (fn [req] - (try - (let [{:keys [postData url]} (js->clj req :keywordize-keys true) - postData (if (string? postData) - (-> (.parse js/JSON postData) - (js->clj :keywordize-keys true)) - postData)] - (dispatch [:debug-request {:url url :postData postData}])) - (catch js/Error e - (log/debug "Error: " e)))))))) - -(register-handler :debug-server-stop - (u/side-effect! - (fn [_] - (.stop http-bridge)))) - -(register-handler :debug-request - (u/side-effect! - (fn [{:keys [web3]} [_ {url :url - {:keys [encoded] - :as post-data} :postData}]] - (try - (let [json (some->> encoded - (.toAscii web3) - (.parse js/JSON)) - obj (when json - (js->clj json :keywordize-keys true))] - (case url - "/add-dapp" (dispatch [:debug-add-contact obj]) - "/remove-dapp" (dispatch [:debug-remove-contact obj]) - "/dapp-changed" (dispatch [:debug-contact-changed obj]) - "/switch-node" (dispatch [:debug-switch-node obj]) - "/list" (dispatch [:debug-dapps-list]) - "/log" (dispatch [:debug-log post-data]) - :default)) - (catch js/Error e - (respond {:type :error :text (str "Error: " e)}) - (log/debug "Error: " e)))))) - -(register-handler :debug-add-contact - (u/side-effect! - (fn [{:contacts/keys [contacts]} [_ {:keys [name whisper-identity dapp-url bot-url] :as dapp-data}]] - (if (and name - whisper-identity - (or dapp-url bot-url)) - (if (or (not (get contacts whisper-identity)) - (get-in contacts [whisper-identity :debug?])) - (let [dapp (merge dapp-data {:dapp? true - :debug? true})] - (dispatch [:upsert-chat! {:chat-id whisper-identity - :name name - :debug? true}]) - (if (get contacts whisper-identity) - (do (dispatch [:update-contact! dapp]) - (respond {:type :ok - :text "The DApp or bot has been updated."})) - (do (dispatch [:add-contacts [dapp]]) - (dispatch [:open-chat-with-contact dapp]) - (respond {:type :ok - :text "The DApp or bot has been added."})))) - (respond {:type :error - :text "Your DApp or bot should be debuggable."})) - (respond {:type :error - :text (str "You can add either DApp or bot. The object should contain \"name\", " - "\"whisper-identity\", and \"dapp-url\" or \"bot-url\" fields.")}))))) - -(register-handler :debug-remove-contact - (u/side-effect! - (fn [{:keys [chats]} [_ {:keys [whisper-identity]}]] - (if (get chats whisper-identity) - (if (get-in chats [whisper-identity :debug?]) - (do (dispatch [:remove-chat whisper-identity]) - (respond {:type :ok - :text "The DApp or bot has been removed."})) - (respond {:type :error - :text "Your DApp or bot should be debuggable."})) - (respond {:type :error - :text "There is no such DApp or bot."})) - (dispatch [:remove-contact whisper-identity #(and (:dapp? %) (:debug? %))])))) - -(register-handler :debug-contact-changed - (u/side-effect! - (fn [{:keys [webview-bridge current-chat-id] - :contacts/keys [contacts]} [_ {:keys [whisper-identity] :as dapp-data}]] - (when (get-in contacts [whisper-identity :debug?]) - (when (and (= current-chat-id whisper-identity) - webview-bridge) - (.reload webview-bridge)) - (when (get-in contacts [whisper-identity :bot-url]) - (dispatch [:load-commands! whisper-identity]))) - (respond {:type :ok - :text "Command has been executed."})))) - -(register-handler :debug-switch-node - (u/side-effect! - (fn [{:accounts/keys [current-account-id]} [_ {:keys [url]}]] - (dispatch [:initialize-protocol current-account-id url]) - (respond {:type :ok - :text "You've successfully switched the node."})))) - -(register-handler :debug-dapps-list - (u/side-effect! - (fn [{:contacts/keys [contacts]}] - (let [contacts (->> (vals contacts) - (filter :debug?) - (map #(select-keys % [:name :whisper-identity :dapp-url :bot-url])))] - (if (seq contacts) - (respond {:type :ok - :data contacts}) - (respond {:type :error - :text "No DApps or bots found."})))))) - -(register-handler :debug-log - (u/side-effect! - (fn [db [_ {:keys [identity]}]] - (let [log (messages/get-log-messages identity)] - (if (seq log) - (respond {:type :ok - :data log}) - (respond {:type :error - :text "No log messages found."})))))) - - diff --git a/src/status_im/ui/screens/accounts/login/events.cljs b/src/status_im/ui/screens/accounts/login/events.cljs index 92da9b7acc..5e999b40b3 100644 --- a/src/status_im/ui/screens/accounts/login/events.cljs +++ b/src/status_im/ui/screens/accounts/login/events.cljs @@ -120,7 +120,7 @@ (if (nil? error) {:db (assoc db :accounts/login {}) :dispatch-n (concat - [[:debug-server-stop] + [[:stop-debugging] [:set-current-account address] [:initialize-account address]] (if new-account? diff --git a/src/status_im/ui/screens/events.cljs b/src/status_im/ui/screens/events.cljs index d8454a2206..2e836ddae6 100644 --- a/src/status_im/ui/screens/events.cljs +++ b/src/status_im/ui/screens/events.cljs @@ -3,7 +3,7 @@ status-im.chat.handlers status-im.commands.handlers.jail status-im.commands.handlers.loading - status-im.debug.handlers + status-im.commands.handlers.debug status-im.network.handlers status-im.protocol.handlers status-im.ui.screens.accounts.events @@ -252,7 +252,7 @@ [:load-contact-groups] [:init-chat] [:init-discoveries] - [:init-debug-mode address] + [:initialize-debugging {:address address}] [:send-account-update-if-needed] [:start-requesting-discoveries] [:remove-old-discoveries!]