Browse Source

perf(rtc): throttle pending-block-ops-count-flow

rcmerci 1 year ago
parent
commit
9a39c70251

+ 2 - 1
src/main/frontend/common/missionary_util.cljs

@@ -68,7 +68,8 @@
              (catch Cancelled _
                (m/amb)))))))
 
-(defn throttle [dur-ms >in]
+(defn throttle
+  [dur-ms >in]
   (m/ap
     (let [x (m/?> (m/relieve {} >in))]
       (m/amb x (do (m/? (m/sleep dur-ms)) (m/amb))))))

+ 12 - 9
src/main/frontend/worker/rtc/client_op.cljs

@@ -1,6 +1,7 @@
 (ns frontend.worker.rtc.client-op
   "Store client-ops in a persisted datascript"
   (:require [datascript.core :as d]
+            [frontend.common.missionary-util :as c.m]
             [frontend.worker.rtc.const :as rtc-const]
             [frontend.worker.state :as worker-state]
             [logseq.db.sqlite.util :as sqlite-util]
@@ -237,15 +238,17 @@
   (when-let [conn (worker-state/get-client-ops-conn repo)]
     (letfn [(datom-count [db]
               (count (get-all-block-ops* db)))]
-      (m/relieve
-       (m/observe
-        (fn ctor [emit!]
-          (d/listen! conn :create-pending-ops-count-flow
-                     (fn [{:keys [db-after]}]
-                       (emit! (datom-count db-after))))
-          (emit! (datom-count @conn))
-          (fn dtor []
-            (d/unlisten! conn :create-pending-ops-count-flow))))))))
+      (let [db-updated-flow
+            (m/observe
+             (fn ctor [emit!]
+               (d/listen! conn :create-pending-ops-count-flow #(emit! true))
+               (emit! true)
+               (fn dtor []
+                 (d/unlisten! conn :create-pending-ops-count-flow))))]
+        (m/ap
+          (let [_ (m/?> (c.m/throttle 100 db-updated-flow))]
+            ;; throttle db-updated-flow, because `datom-count` is a time-consuming fn
+            (datom-count @conn)))))))
 
 ;;; asset ops
 (defn add-asset-ops