Răsfoiți Sursa

fix(rtc): auto rtc-start when created&uploaded a new graph

rcmerci 1 an în urmă
părinte
comite
eb273f1aff

+ 2 - 2
src/main/frontend/common/missionary_util.clj

@@ -4,5 +4,5 @@
 
 (defmacro <?
   "Like m/?, but async channel or promise as arg"
-  [chan-or-promise]
-  `(m/? (<! ~chan-or-promise)))
+  [chan-or-promise-or-task]
+  `(m/? (<! ~chan-or-promise-or-task)))

+ 1 - 1
src/main/frontend/components/content.cljs

@@ -357,7 +357,7 @@
                   (let [^object worker @db-browser/*worker
                         token (state/get-auth-id-token)
                         graph-uuid (ldb/get-graph-rtc-uuid (db/get-db))]
-                    (p/let [result (.rtc-get-block-content-versions2 worker token graph-uuid (str block-id))
+                    (p/let [result (.rtc-get-block-content-versions worker token graph-uuid (str block-id))
                             blocks-versions (ldb/read-transit-str result)]
                       (prn :Dev-show-block-content-history)
                       (doseq [[block-uuid versions] blocks-versions]

+ 5 - 7
src/main/frontend/components/repo.cljs

@@ -430,13 +430,11 @@
                          (p/let [repo (repo-handler/new-db! @*graph-name)]
                            (when @*cloud?
                              (->
-                              (p/do!
-                               (state/set-state! :rtc/uploading? true)
-                               (async-util/c->p (rtc-handler/<rtc-create-graph! repo))
-                               (state/set-state! :rtc/uploading? false)
-                                ;; No need to wait for rtc-start since it's a go loop that'll
-                                ;; return a value once it's stopped
-                               (and (rtc-handler/<rtc-start! repo) false))
+                              (p/do
+                                (state/set-state! :rtc/uploading? true)
+                                (js/Promise. (rtc-handler/new-task--rtc-create-graph! repo))
+                                (state/set-state! :rtc/uploading? false)
+                                (rtc-handler/<rtc-start! repo))
                               (p/catch (fn [error]
                                          (reset! *creating-db? false)
                                          (state/set-state! :rtc/uploading? false)

+ 9 - 9
src/main/frontend/db/rtc/debug_ui.cljs

@@ -20,7 +20,7 @@
 (defn- stop
   []
   (let [^object worker @db-browser/*worker]
-    (.rtc-stop2 worker))
+    (.rtc-stop worker))
   (reset! debug-state nil))
 
 (rum/defcs ^:large-vars/cleanup-todo rtc-debug-ui < rum/reactive
@@ -60,7 +60,7 @@
        {:size :sm
         :on-click (fn [_]
                     (let [^object worker @db-browser/*worker]
-                      (p/let [result (.rtc-get-debug-state2 worker)
+                      (p/let [result (.rtc-get-debug-state worker)
                               new-state (ldb/read-transit-str result)]
                         (swap! debug-state (fn [old] (merge old new-state))))))}
        (shui/tabler-icon "refresh") "state")
@@ -71,7 +71,7 @@
         (fn [_]
           (let [token (state/get-auth-id-token)
                 ^object worker @db-browser/*worker]
-            (p/let [result (.rtc-get-graphs2 worker token)
+            (p/let [result (.rtc-get-graphs worker token)
                     graph-list (ldb/read-transit-str result)]
               (swap! debug-state assoc
                      :remote-graphs
@@ -115,7 +115,7 @@
          :on-click (fn []
                      (let [token (state/get-auth-id-token)
                            ^object worker @db-browser/*worker]
-                       (.rtc-start2 worker (state/get-current-repo) token)))}
+                       (.rtc-start worker (state/get-current-repo) token)))}
         (shui/tabler-icon "player-play") "start")
 
        [:div.my-2.flex
@@ -145,9 +145,9 @@
                                       user-email (when-not user-uuid (:grant-access-to-user debug-state*))]
                                   (when-let [graph-uuid (:graph-uuid debug-state*)]
                                     (let [^object worker @db-browser/*worker]
-                                      (.rtc-grant-graph-access2 worker token graph-uuid
-                                                                (some-> user-uuid vector ldb/write-transit-str)
-                                                                (some-> user-email vector ldb/write-transit-str))))))})
+                                      (.rtc-grant-graph-access worker token graph-uuid
+                                                               (some-> user-uuid vector ldb/write-transit-str)
+                                                               (some-> user-email vector ldb/write-transit-str))))))})
 
         [:b "➡️"]
         [:input.form-input.my-2.py-1
@@ -215,7 +215,7 @@
                                     token (state/get-auth-id-token)
                                     remote-graph-name (:upload-as-graph-name debug-state*)
                                     ^js worker @db-browser/*worker]
-                                (.rtc-async-upload-graph2 worker repo token remote-graph-name)))})
+                                (.rtc-async-upload-graph worker repo token remote-graph-name)))})
       [:b "➡️"]
       [:input.form-input.my-2.py-1.w-32
        {:on-change (fn [e] (swap! debug-state assoc :upload-as-graph-name (util/evalue e)))
@@ -232,7 +232,7 @@
                                 (let [token (state/get-auth-id-token)
                                       ^object worker @db-browser/*worker]
                                   (prn ::delete-graph graph-uuid)
-                                  (.rtc-delete-graph2 worker token graph-uuid))))})
+                                  (.rtc-delete-graph worker token graph-uuid))))})
 
       (shui/select
        {:on-value-change (fn [v]

+ 21 - 19
src/main/frontend/handler/db_based/rtc.cljs

@@ -1,29 +1,31 @@
 (ns frontend.handler.db-based.rtc
   "RTC handler"
-  (:require [frontend.config :as config]
+  (:require [frontend.common.missionary-util :as c.m]
+            [frontend.config :as config]
             [frontend.db :as db]
             [frontend.handler.notification :as notification]
             [frontend.handler.user :as user-handler]
             [frontend.state :as state]
             [logseq.db :as ldb]
             [logseq.db.sqlite.common-db :as sqlite-common-db]
+            [missionary.core :as m]
             [promesa.core :as p]))
 
-
-(defn <rtc-create-graph!
+(defn new-task--rtc-create-graph!
   [repo]
-  (when-let [^js worker @state/*db-worker]
-    (user-handler/<wrap-ensure-id&access-token
-     (let [token (state/get-auth-id-token)
-           repo-name (sqlite-common-db/sanitize-db-name repo)]
-       (.rtc-async-upload-graph2 worker repo token repo-name)))))
+  (m/sp
+    (when-let [^js worker @state/*db-worker]
+      (m/? user-handler/task--ensure-id&access-token)
+      (let [token (state/get-auth-id-token)
+            repo-name (sqlite-common-db/sanitize-db-name repo)]
+        (c.m/<? (.rtc-async-upload-graph worker repo token repo-name))))))
 
 (defn <rtc-delete-graph!
   [graph-uuid]
   (when-let [^js worker @state/*db-worker]
     (user-handler/<wrap-ensure-id&access-token
      (let [token (state/get-auth-id-token)]
-       (.rtc-delete-graph2 worker token graph-uuid)))))
+       (.rtc-delete-graph worker token graph-uuid)))))
 
 (defn <rtc-download-graph!
   [graph-name graph-uuid timeout-ms]
@@ -50,17 +52,17 @@
 (defn <rtc-stop!
   []
   (when-let [^js worker @state/*db-worker]
-    (.rtc-stop2 worker)))
+    (.rtc-stop worker)))
 
 (defn <rtc-start!
   [repo]
   (when-let [^js worker @state/*db-worker]
     (when (ldb/get-graph-rtc-uuid (db/get-db repo))
-      (user-handler/<wrap-ensure-id&access-token
-        ;; TODO: `<rtc-stop!` can return a chan so that we can remove timeout
+      (p/do!
+       (js/Promise. user-handler/task--ensure-id&access-token)
        (<rtc-stop!)
        (let [token (state/get-auth-id-token)]
-         (p/let [result (.rtc-start2 worker repo token)
+         (p/let [result (.rtc-start worker repo token)
                  start-ex (ldb/read-transit-str result)
                  _ (case (:type (:ex-data start-ex))
                      (:rtc.exception/not-rtc-graph
@@ -70,7 +72,7 @@
                      :rtc.exception/lock-failed
                      (js/setTimeout #(<rtc-start! repo) 1000)
 
-                     ;; else
+                      ;; else
                      nil)]
            nil))))))
 
@@ -80,7 +82,7 @@
     (user-handler/<wrap-ensure-id&access-token
      (let [token (state/get-auth-id-token)]
        (when worker
-         (p/let [result (.rtc-get-graphs2 worker token)
+         (p/let [result (.rtc-get-graphs worker token)
                  graphs (ldb/read-transit-str result)
                  result (->> graphs
                              (remove (fn [graph] (= (:graph-status graph) "deleting")))
@@ -100,7 +102,7 @@
     (when-let [^js worker @state/*db-worker]
       (p/let [token (state/get-auth-id-token)
               repo (state/get-current-repo)
-              result (.rtc-get-users-info2 worker token graph-uuid)
+              result (.rtc-get-users-info worker token graph-uuid)
               result (ldb/read-transit-str result)]
         (state/set-state! :rtc/users-info {repo result})))))
 
@@ -110,9 +112,9 @@
     (let [token (state/get-auth-id-token)]
       (->
        (p/do!
-        (.rtc-grant-graph-access2 worker token graph-uuid
-                                  (ldb/write-transit-str [])
-                                  (ldb/write-transit-str [email]))
+        (.rtc-grant-graph-access worker token graph-uuid
+                                 (ldb/write-transit-str [])
+                                 (ldb/write-transit-str [email]))
         (notification/show! (str "Invitation sent!") :success))
        (p/catch (fn [e]
                   (notification/show! (str "Something wrong, please try again.") :error)

+ 11 - 0
src/main/frontend/handler/user.cljs

@@ -255,6 +255,17 @@
                   (-> (state/get-auth-id-token) parse-jwt expired?))
           (ex-info "empty or expired token and refresh failed" {:anom :expired-token}))))))
 
+(def task--ensure-id&access-token
+  (m/sp
+    (let [id-token (state/get-auth-id-token)]
+      (when (or (nil? id-token)
+                (-> id-token parse-jwt almost-expired-or-expired?))
+        (prn (str "refresh tokens... " (tc/to-string (t/now))))
+        (c.m/<? (<refresh-id-token&access-token))
+        (when (or (nil? (state/get-auth-id-token))
+                  (-> (state/get-auth-id-token) parse-jwt expired?))
+          (throw (ex-info "empty or expired token and refresh failed" {:type :expired-token})))))))
+
 (defn <user-uuid
   []
   (go

+ 9 - 9
src/main/frontend/worker/db_worker.cljs

@@ -739,12 +739,12 @@
      (ldb/write-transit-str (worker-export/get-all-page->content repo @conn))))
 
   ;; RTC
-  (rtc-start2
+  (rtc-start
    [this repo token]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--rtc-start repo token))))
 
-  (rtc-stop2
+  (rtc-stop
    [this]
    (rtc-core/rtc-stop))
 
@@ -752,7 +752,7 @@
    [this]
    (rtc-core/rtc-toggle-auto-push))
 
-  (rtc-grant-graph-access2
+  (rtc-grant-graph-access
    [this token graph-uuid target-user-uuids-str target-user-emails-str]
    (let [target-user-uuids (ldb/read-transit-str target-user-uuids-str)
          target-user-emails (ldb/read-transit-str target-user-emails-str)]
@@ -762,32 +762,32 @@
                                                    :target-user-uuids target-user-uuids
                                                    :target-user-emails target-user-emails)))))
 
-  (rtc-get-graphs2
+  (rtc-get-graphs
    [this token]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--get-graphs token))))
 
-  (rtc-delete-graph2
+  (rtc-delete-graph
    [this token graph-uuid]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--delete-graph token graph-uuid))))
 
-  (rtc-get-users-info2
+  (rtc-get-users-info
    [this token graph-uuid]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--get-user-info token graph-uuid))))
 
-  (rtc-get-block-content-versions2
+  (rtc-get-block-content-versions
    [this token graph-uuid block-uuid]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--get-block-content-versions token graph-uuid block-uuid))))
 
-  (rtc-get-debug-state2
+  (rtc-get-debug-state
    [this]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--get-debug-state))))
 
-  (rtc-async-upload-graph2
+  (rtc-async-upload-graph
    [this repo token remote-graph-name]
    (with-write-transit-str
      (js/Promise. (rtc-core/new-task--upload-graph token repo remote-graph-name))))