Pārlūkot izejas kodu

feat: download shared rtc graph

RTC will be running immediately after:
1. app start and the initial graph is a rtc graph
2. app refresh when the current graph is a rtc graph
3. switch into a rtc graph
4. download a rtc graph
Tienson Qin 1 gadu atpakaļ
vecāks
revīzija
6c12f5ab33

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

@@ -134,6 +134,7 @@
               (t :open-a-directory)
               :on-click #(state/pub-event! [:graph/setup-a-repo]))])]]
 
+        ;; TODO: support rtc
         (when (and (file-sync/enable-sync?) login?)
           [:div
            [:hr]
@@ -159,7 +160,7 @@
   (let [switch-repos (if-not (nil? current-repo)
                        (remove (fn [repo] (= current-repo (:url repo))) repos) repos) ; exclude current repo
         repo-links (mapv
-                    (fn [{:keys [url remote? GraphName GraphUUID] :as graph}]
+                    (fn [{:keys [url remote? rtc-graph? GraphName GraphUUID] :as graph}]
                       (let [local? (config/local-file-based-graph? url)
                             db-only? (config/db-based-graph? url)
                             repo-url (cond
@@ -180,8 +181,14 @@
                                                         (on-click e))
                                                       (if (gobj/get e "shiftKey")
                                                         (state/pub-event! [:graph/open-new-window url])
-                                                        (if (or local? db-only?)
+                                                        (cond
+                                                          (or local? db-only?)
                                                           (state/pub-event! [:graph/switch url])
+
+                                                          (and rtc-graph? remote?)
+                                                          (state/pub-event! [:rtc/download-remote-graph GraphName GraphUUID])
+
+                                                          :else
                                                           (state/pub-event! [:graph/pull-down-remote-graph graph]))))}})))
                     switch-repos)
         refresh-link (let [nfs-repo? (config/local-file-based-graph? current-repo)]
@@ -223,8 +230,9 @@
     (when (or login? current-repo)
       (let [repos (state/sub [:me :repos])
             remotes (state/sub [:file-sync/remote-graphs :graphs])
-            repos (if (and (seq remotes) login?)
-                    (repo-handler/combine-local-&-remote-graphs repos remotes) repos)
+            rtc-graphs (state/sub :rtc/graphs)
+            repos (if (and (or (seq remotes) (seq rtc-graphs)) login?)
+                    (repo-handler/combine-local-&-remote-graphs repos (concat remotes rtc-graphs)) repos)
             links (repos-dropdown-links repos current-repo multiple-windows? opts)
             render-content (fn [{:keys [toggle-fn]}]
                              (let [remote? (:remote? (first (filter #(= current-repo (:url %)) repos)))
@@ -261,7 +269,9 @@
                                                    (if remotes-loading?
                                                      (ui/loading "")
                                                      [:a.flex {:title "Refresh remote graphs"
-                                                               :on-click file-sync/load-session-graphs}
+                                                               :on-click (fn []
+                                                                           (file-sync/load-session-graphs)
+                                                                           (when config/dev? (rtc-handler/<get-remote-graphs)))}
                                                       (ui/icon "refresh")]))]))]
         (when (seq repos)
           (ui/dropdown-with-links render-content links links-header))))))

+ 19 - 18
src/main/frontend/db_worker.cljs

@@ -184,24 +184,25 @@
           acc
           (p/recur (conj acc (.-value elem))))))))
 
-(defn- <list-all-files
-  []
-  (let [dir? #(= (.-kind %) "directory")]
-    (p/let [^js root (.getDirectory js/navigator.storage)]
-      (p/loop [result []
-               dirs [root]]
-        (if (empty? dirs)
-          result
-          (p/let [dir (first dirs)
-                  result (conj result dir)
-                  values-iter (when (dir? dir) (.values dir))
-                  values (when values-iter (iter->vec values-iter))
-                  current-dir-dirs (filter dir? values)
-                  result (concat result values)
-                  dirs (concat
-                        current-dir-dirs
-                        (rest dirs))]
-            (p/recur result dirs)))))))
+(comment
+  (defn- <list-all-files
+    []
+    (let [dir? #(= (.-kind %) "directory")]
+      (p/let [^js root (.getDirectory js/navigator.storage)]
+        (p/loop [result []
+                 dirs [root]]
+          (if (empty? dirs)
+            result
+            (p/let [dir (first dirs)
+                    result (conj result dir)
+                    values-iter (when (dir? dir) (.values dir))
+                    values (when values-iter (iter->vec values-iter))
+                    current-dir-dirs (filter dir? values)
+                    result (concat result values)
+                    dirs (concat
+                          current-dir-dirs
+                          (rest dirs))]
+              (p/recur result dirs))))))))
 
 (defn- <list-all-dbs
   []

+ 32 - 24
src/main/frontend/handler/db_based/rtc.cljs

@@ -3,36 +3,44 @@
   (:require [frontend.state :as state]
             [cljs-bean.core :as bean]
             [promesa.core :as p]
-            [frontend.config :as config]))
+            [frontend.config :as config]
+            [frontend.handler.user :as user-handler]))
 
 (defn <rtc-create-graph!
   [repo]
-  (let [token (state/get-auth-id-token)
-        ^js worker @state/*db-worker]
-    (.rtc-upload-graph worker repo token)))
+  (when-let [^js worker @state/*db-worker]
+    (user-handler/<wrap-ensure-id&access-token
+     (let [token (state/get-auth-id-token)]
+       (.rtc-upload-graph worker repo token)))))
+
+(defn <rtc-download-graph!
+  [repo graph-uuid]
+  (when-let [^js worker @state/*db-worker]
+    (user-handler/<wrap-ensure-id&access-token
+     (let [token (state/get-auth-id-token)]
+       (.rtc-download-graph worker repo token graph-uuid)))))
 
 (defn <rtc-start!
   [repo]
-  (let [token (state/get-auth-id-token)
-        ^object worker @state/*db-worker]
-    (.rtc-start worker repo token
-                (and config/dev?
-                     (state/sub [:ui/developer-mode?])))))
+  (when-let [^js worker @state/*db-worker]
+    (user-handler/<wrap-ensure-id&access-token
+     (let [token (state/get-auth-id-token)]
+       (.rtc-start worker repo token
+                   (and config/dev?
+                        (state/sub [:ui/developer-mode?])))))))
 
-;; TODO: rtc-get-graphs should be using HTTP GET instead of websocket,
-;; because the user may not create any remote graph yet.
-;; FIXME: missing graph name
+;; TODO: shared graphs need `shared-by`, user name
 (defn <get-remote-graphs
   []
-  (let [repo (state/get-current-repo)
-        token (state/get-auth-id-token)
-        ^object worker @state/*db-worker]
-    (p/let [result (.rtc-get-graphs worker repo token)
-            graph-list (bean/->clj result)]
-      graph-list
-      ;; (swap! debug-state assoc
-      ;;        :remote-graphs
-      ;;        (map
-      ;;         #(select-keys % [:graph-uuid :graph-status])
-      ;;         graph-list))
-      )))
+  (when-let [^js worker @state/*db-worker]
+    (user-handler/<wrap-ensure-id&access-token
+     (let [repo (state/get-current-repo)
+           token (state/get-auth-id-token)]
+       (p/let [result (.rtc-get-graphs worker repo token)
+               graphs (bean/->clj result)
+               result (mapv (fn [graph]
+                              {:GraphName (str (:graph-uuid graph)) ; FIXME: update when our server supports name
+                               :GraphUUID (:graph-uuid graph)
+                               :rtc-graph? true})
+                            graphs)]
+         (state/set-state! :rtc/graphs result))))))

+ 14 - 3
src/main/frontend/handler/events.cljs

@@ -58,6 +58,7 @@
             [frontend.handler.property :as property-handler]
             [frontend.handler.file-based.nfs :as nfs-handler]
             [frontend.handler.code :as code-handler]
+            [frontend.handler.db-based.rtc :as rtc-handler]
             [frontend.mobile.core :as mobile]
             [frontend.mobile.graph-picker :as graph-picker]
             [frontend.mobile.util :as mobile-util]
@@ -176,7 +177,8 @@
            (route-handler/redirect-to-home!))
          (srs/update-cards-due-count!)
          (state/pub-event! [:graph/ready graph])
-         (when-not db-based?
+         (if db-based?
+           (rtc-handler/<rtc-start! graph)
            (file-sync-restart!))
          (when-let [dir-name (and (not db-based?) (config/get-repo-dir graph))]
            (fs/watch-dir! dir-name)))))))
@@ -746,10 +748,11 @@
   (notification/show! "file sync graph count exceed limit" :warning false)
   (file-sync-stop!))
 
-(defmethod handle :graph/restored [[_ _graph]]
+(defmethod handle :graph/restored [[_ graph]]
   (mobile/init!)
+  (rtc-handler/<rtc-start! graph)
   (when-not (mobile-util/native-ios?)
-    (state/pub-event! [:graph/ready (state/get-current-repo)])))
+    (state/pub-event! [:graph/ready graph])))
 
 (defmethod handle :whiteboard-link [[_ shapes]]
   (route-handler/go-to-search! :whiteboard/link)
@@ -970,6 +973,14 @@
 (defmethod handle :rtc/sync-state [[_ state]]
   (swap! rtc-debug-ui/debug-state (fn [old] (merge old state))))
 
+(defmethod handle :rtc/download-remote-graph [[_ graph-name graph-uuid]]
+  (->
+   (p/do!
+    (rtc-handler/<rtc-download-graph! graph-name graph-uuid))
+   (p/catch (fn [e]
+              (println "RTC download graph failed, error:")
+              (js/console.error e)))))
+
 ;; db-worker -> UI
 (defmethod handle :db/sync-changes [[_ data]]
   (let [repo (state/get-current-repo)]

+ 4 - 2
src/main/frontend/handler/repo.cljs

@@ -152,7 +152,7 @@
   [url]
   (when-let [graphs (seq (and url (combine-local-&-remote-graphs
                                     (state/get-repos)
-                                    (state/get-remote-graphs))))]
+                                    (state/get-remote-file-graphs))))]
     (first (filter #(when-let [url' (:url %)]
                       (= url url')) graphs))))
 
@@ -161,7 +161,9 @@
   (p/let [repos (get-repos)
           repos' (combine-local-&-remote-graphs
                   repos
-                  (state/get-remote-graphs))]
+                  (concat
+                   (state/get-rtc-graphs)
+                   (state/get-remote-file-graphs)))]
     (state/set-repos! repos')
     repos'))
 

+ 2 - 1
src/main/frontend/handler/worker.cljs

@@ -27,7 +27,8 @@
   (apply notification/show! data))
 
 (defmethod handle :add-repo [_ _worker data]
-  (state/add-repo! {:url (:repo data)}))
+  (state/add-repo! {:url (:repo data)})
+  (state/pub-event! [:graph/switch (:repo data) {}]))
 
 (defmethod handle :rtc-sync-state [_ _worker data]
   (let [state data]

+ 6 - 1
src/main/frontend/state.cljs

@@ -286,6 +286,7 @@
       :file-sync/graph-state                 {:current-graph-uuid nil}
       ;; graph-uuid -> ...
 
+      :rtc/graphs                            []
       ;; graph-url -> {:in-transaction? Boolean :txs []}
       :rtc/remote-batch-tx-state             {}
 
@@ -868,10 +869,14 @@ Similar to re-frame subscriptions"
   (or (:git/current-repo @state)
       "Logseq demo"))
 
-(defn get-remote-graphs
+(defn get-remote-file-graphs
   []
   (get-in @state [:file-sync/remote-graphs :graphs]))
 
+(defn get-rtc-graphs
+  []
+  (:rtc/graphs @state))
+
 (defn get-remote-graph-info-by-uuid
   [uuid]
   (when-let [graphs (seq (get-in @state [:file-sync/remote-graphs :graphs]))]

+ 1 - 1
src/main/frontend/worker/rtc/full_upload_download_graph.cljs

@@ -154,7 +154,7 @@
                               :graph-uuid graph-uuid}))
            (<! (get-result-ch)))
          {:keys [status body] :as r} (<! (http/get url))
-         repo (str "logseq_db_rtc-" repo)]
+         repo (str "logseq_db_" repo)]
      (if (not= 200 status)
        (ex-info "<download-graph failed" r)
        (let [all-blocks (transit/read transit-r body)]