Bladeren bron

refactor: add <invoke-main-thread

rcmerci 6 maanden geleden
bovenliggende
commit
12e6284bbe

+ 1 - 1
src/main/frontend/common/thread_api.cljc

@@ -12,7 +12,7 @@
 
 (defmacro def-thread-api
   "Define a api invokeable by other threads.
-e.g. (def-thread-api :thread-api/a-api [arg1 arg2] body)"
+  e.g. (def-thread-api :thread-api/a-api [arg1 arg2] body)"
   [qualified-keyword-name params & body]
   (assert (= "thread-api" (namespace qualified-keyword-name)) qualified-keyword-name)
   (assert (vector? params) params)

+ 11 - 41
src/main/frontend/persist_db/browser.cljs

@@ -4,10 +4,10 @@
    This interface uses clj data format as input."
   (:require ["comlink" :as Comlink]
             [electron.ipc :as ipc]
+            [frontend.common.thread-api :as thread-api]
             [frontend.config :as config]
             [frontend.date :as date]
             [frontend.db.transact :as db-transact]
-            [frontend.handler.assets :as assets-handler]
             [frontend.handler.notification :as notification]
             [frontend.handler.worker :as worker-handler]
             [frontend.persist-db.protocol :as protocol]
@@ -77,35 +77,6 @@
                  :pages-directory (config/get-pages-directory)}]
     (state/<invoke-db-worker :thread-api/transact repo tx-data tx-meta context)))
 
-(defn- with-write-transit-str
-  [p]
-  (p/chain p ldb/write-transit-str))
-
-(deftype Main []
-  Object
-  (readAsset [_this repo asset-block-id asset-type]
-    (assets-handler/<read-asset repo asset-block-id asset-type))
-  (writeAsset [_this repo asset-block-id asset-type data]
-    (assets-handler/<write-asset repo asset-block-id asset-type data))
-  (unlinkAsset [_this repo asset-block-id asset-type]
-    (assets-handler/<unlink-asset repo asset-block-id asset-type))
-  (get-all-asset-file-paths [_this repo]
-    (with-write-transit-str
-      (assets-handler/<get-all-asset-file-paths repo)))
-  (get-asset-file-metadata [_this repo asset-block-id asset-type]
-    (with-write-transit-str
-      (assets-handler/<get-asset-file-metadata repo asset-block-id asset-type)))
-  (rtc-upload-asset [_this repo asset-block-uuid-str asset-type checksum put-url]
-    (with-write-transit-str
-      (js/Promise.
-       (assets-handler/new-task--rtc-upload-asset repo asset-block-uuid-str asset-type checksum put-url))))
-  (rtc-download-asset [_this repo asset-block-uuid-str asset-type get-url]
-    (with-write-transit-str
-      (js/Promise.
-       (assets-handler/new-task--rtc-download-asset repo asset-block-uuid-str asset-type get-url))))
-  (testFn [_this]
-    (prn :debug :works)))
-
 (defn start-db-worker!
   []
   (when-not util/node-test?
@@ -115,16 +86,15 @@
           worker (js/Worker. (str worker-url "?electron=" (util/electron?) "&publishing=" config/publishing?))
           wrapped-worker* (Comlink/wrap worker)
           wrapped-worker (fn [qkw direct-pass-args? & args]
-                           (p/chain
-                            (.remoteInvoke ^js wrapped-worker*
-                                           (str (namespace qkw) "/" (name qkw))
-                                           direct-pass-args?
-                                           (if direct-pass-args?
-                                             (into-array args)
-                                             (ldb/write-transit-str args)))
-                            ldb/read-transit-str))
+                           (-> (.remoteInvoke ^js wrapped-worker*
+                                              (str (namespace qkw) "/" (name qkw))
+                                              direct-pass-args?
+                                              (if direct-pass-args?
+                                                (into-array args)
+                                                (ldb/write-transit-str args)))
+                               (p/chain ldb/read-transit-str)))
           t1 (util/time-ms)]
-      (Comlink/expose (Main.) worker)
+      (Comlink/expose #js{"remoteInvoke" thread-api/remote-function} worker)
       (worker-handler/handle-message! worker wrapped-worker)
       (reset! state/*db-worker wrapped-worker)
       (-> (p/let [_ (state/<invoke-db-worker :thread-api/init config/RTC-WS-URL)
@@ -188,7 +158,7 @@
     (-> (p/let [db-exists? (state/<invoke-db-worker :thread-api/db-exists repo)
                 disk-db-data (when-not db-exists? (ipc/ipc :db-get repo))
                 _ (when disk-db-data
-                    (state/<invoke-db-worker-direct-passthrough-args :thread-api/import-db repo disk-db-data))
+                    (state/<invoke-db-worker-direct-pass-args :thread-api/import-db repo disk-db-data))
                 _ (state/<invoke-db-worker :thread-api/create-or-open-db repo opts)]
           (state/<invoke-db-worker :thread-api/get-initial-data repo))
         (p/catch sqlite-error-handler)))
@@ -205,7 +175,7 @@
                    (notification/show! [:div (str "SQLiteDB save error: " error)] :error) {}))))
 
   (<import-db [_this repo data]
-    (-> (state/<invoke-db-worker-direct-passthrough-args :thread-api/import-db repo data)
+    (-> (state/<invoke-db-worker-direct-pass-args :thread-api/import-db repo data)
         (p/catch (fn [error]
                    (prn :debug :import-db-error repo)
                    (js/console.error error)

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

@@ -46,7 +46,7 @@
   [qkw & args]
   (<invoke-db-worker* qkw false args))
 
-(defn <invoke-db-worker-direct-passthrough-args
+(defn <invoke-db-worker-direct-pass-args
   "invoke db-worker thread api.
   But directly pass args to db-worker(won't do transit-write on them)."
   [qkw & args]

+ 10 - 1
src/main/frontend/worker/db_worker.cljs

@@ -778,7 +778,16 @@
   (<ratelimit-file-writes!)
   (js/setInterval #(.postMessage js/self "keepAliveResponse") (* 1000 25))
   (Comlink/expose #js{"remoteInvoke" thread-api/remote-function})
-  (reset! worker-state/*main-thread (Comlink/wrap js/self)))
+  (let [^js wrapped-main-thread* (Comlink/wrap js/self)
+        wrapped-main-thread (fn [qkw direct-pass-args? & args]
+                              (-> (.remoteInvoke wrapped-main-thread*
+                                                 (str (namespace qkw) "/" (name qkw))
+                                                 direct-pass-args?
+                                                 (if direct-pass-args?
+                                                   (into-array args)
+                                                   (ldb/write-transit-str args)))
+                                  (p/chain ldb/read-transit-str)))]
+    (reset! worker-state/*main-thread wrapped-main-thread)))
 
 (comment
   (defn <remove-all-files!

+ 14 - 17
src/main/frontend/worker/rtc/asset.cljs

@@ -13,7 +13,6 @@
             [frontend.worker.rtc.ws-util :as ws-util]
             [frontend.worker.state :as worker-state]
             [logseq.common.path :as path]
-            [logseq.db :as ldb]
             [malli.core :as ma]
             [missionary.core :as m])
   (:import [missionary Cancelled]))
@@ -46,9 +45,9 @@
   "Return nil if this asset not exist"
   [repo block-uuid asset-type]
   (m/sp
-    (ldb/read-transit-str
-     (c.m/<?
-      (.get-asset-file-metadata ^js @worker-state/*main-thread repo (str block-uuid) asset-type)))))
+    (c.m/<?
+     (worker-state/<invoke-main-thread :thread-api/get-asset-file-metadata
+                                       repo (str block-uuid) asset-type))))
 
 (defn- remote-block-ops=>remote-asset-ops
   [db-before remove-ops]
@@ -133,11 +132,10 @@
   [repo asset-uuid->url asset-uuid->asset-type]
   (->> (fn [[asset-uuid url]]
          (m/sp
-           (let [r (ldb/read-transit-str
-                    (c.m/<?
-                     (.rtc-download-asset
-                      ^js @worker-state/*main-thread
-                      repo (str asset-uuid) (get asset-uuid->asset-type asset-uuid) url)))]
+           (let [r (c.m/<?
+                    (worker-state/<invoke-main-thread :thread-api/rtc-download-asset
+                                                      repo (str asset-uuid)
+                                                      (get asset-uuid->asset-type asset-uuid) url))]
              (when-let [edata (:ex-data r)]
                ;; if download-url return 404, ignore this asset
                (when (not= 404 (:status (:data edata)))
@@ -151,11 +149,9 @@
   (->> (fn [[asset-uuid url]]
          (m/sp
            (let [[asset-type checksum] (get asset-uuid->asset-type+checksum asset-uuid)
-                 r (ldb/read-transit-str
-                    (c.m/<?
-                     (.rtc-upload-asset
-                      ^js @worker-state/*main-thread
-                      repo (str asset-uuid) asset-type checksum url)))]
+                 r (c.m/<?
+                    (worker-state/<invoke-main-thread :thread-api/rtc-upload-asset
+                                                      repo (str asset-uuid) asset-type checksum url))]
              (when (:ex-data r)
                (throw (ex-info "upload asset failed" r)))
              (d/transact! conn
@@ -244,7 +240,8 @@
                                             :asset-uuids (keys asset-uuid->asset-type)}))
                    :asset-uuid->url))]
         (doseq [[asset-uuid asset-type] remove-asset-uuid->asset-type]
-          (c.m/<? (.unlinkAsset ^js @worker-state/*main-thread repo (str asset-uuid) asset-type)))
+          (c.m/<? (worker-state/<invoke-main-thread :thread-api/unlink-asset
+                                                    repo (str asset-uuid) asset-type)))
         (when (seq asset-uuid->url)
           (add-log-fn :rtc.asset.log/download-assets {:asset-uuids (keys asset-uuid->url)}))
         (m/? (new-task--concurrent-download-assets repo asset-uuid->url asset-uuid->asset-type))))))
@@ -263,8 +260,8 @@
 (defn- new-task--initial-download-missing-assets
   [repo get-ws-create-task graph-uuid conn add-log-fn]
   (m/sp
-    (let [local-all-asset-file-paths (ldb/read-transit-str
-                                      (c.m/<? (.get-all-asset-file-paths ^js @worker-state/*main-thread repo)))
+    (let [local-all-asset-file-paths
+          (c.m/<? (worker-state/<invoke-main-thread :thread-api/get-all-asset-file-paths repo))
           local-all-asset-file-uuids (set (map (comp parse-uuid path/file-stem) local-all-asset-file-paths))
           local-all-asset-uuids (set (map :block/uuid (get-all-asset-blocks @conn)))]
       (when-let [asset-update-ops

+ 20 - 0
src/main/frontend/worker/state.cljs

@@ -10,6 +10,26 @@
 
 (defonce *main-thread (atom nil))
 
+(defn- <invoke-main-thread*
+  [qkw direct-pass-args? args-list]
+  (let [main-thread @*main-thread]
+    (when (nil? main-thread)
+      (prn :<invoke-main-thread-error qkw)
+      (throw (ex-info "main-thread has not been initialized" {})))
+    (apply main-thread qkw direct-pass-args? args-list)))
+
+(defn <invoke-main-thread
+  "invoke main thread api"
+  [qkw & args]
+  (<invoke-main-thread* qkw false args))
+
+(comment
+  (defn <invoke-main-thread-direct-pass-args
+    "invoke main thread api.
+  But directly pass args to main-thread(won't do transit-write on them)"
+    [qkw & args]
+    (<invoke-main-thread* qkw true args)))
+
 (defonce *state (atom {:db/latest-transact-time {}
                        :worker/context {}