Write files works

pull/10839/head
Tienson Qin 2023-12-28 20:01:13 +08:00
parent ee12e58254
commit 580763844b
5 changed files with 47 additions and 15 deletions

View File

@ -0,0 +1,26 @@
(ns frontend.handler.worker
(:require [cljs-bean.core :as bean]
[frontend.handler.file :as file-handler]
[frontend.handler.notification :as notification]
[clojure.edn :as edn]))
(defmulti handle identity)
(defmethod handle :write-files [_ {:keys [repo files]}]
(file-handler/alter-files repo files {}))
(defmethod handle :notification [_ data]
(apply notification/show! (edn/read-string data)))
(defmethod handle :default [_ data]
(prn :debug "Worker data not handled: " data))
(defn handle-message!
[^js worker]
(assert worker "worker doesn't exists")
(set! (.-onmessage worker)
(fn [event]
(let [data (.-data event)]
(when-not (= (.-type data) "RAW")
(let [[e payload] (bean/->clj data)]
(handle (keyword e) payload)))))))

View File

@ -12,7 +12,8 @@
[frontend.state :as state] [frontend.state :as state]
[electron.ipc :as ipc] [electron.ipc :as ipc]
[frontend.modules.outliner.datascript :as outliner-db] [frontend.modules.outliner.datascript :as outliner-db]
[clojure.edn :as edn])) [clojure.edn :as edn]
[frontend.handler.worker :as worker-handler]))
(defonce *sqlite (atom nil)) (defonce *sqlite (atom nil))
@ -31,6 +32,7 @@
"/static/js/db-worker.js") "/static/js/db-worker.js")
worker (js/Worker. (str worker-url "?electron=" (util/electron?))) worker (js/Worker. (str worker-url "?electron=" (util/electron?)))
sqlite (Comlink/wrap worker)] sqlite (Comlink/wrap worker)]
(worker-handler/handle-message! worker)
(reset! *sqlite sqlite) (reset! *sqlite sqlite)
(-> (p/let [_ (.init sqlite)] (-> (p/let [_ (.init sqlite)]
(ask-persist-permission!)) (ask-persist-permission!))

View File

@ -11,7 +11,8 @@
[datascript.core :as d] [datascript.core :as d]
[logseq.db :as ldb] [logseq.db :as ldb]
[malli.core :as m] [malli.core :as m]
[frontend.worker.state :as state])) [frontend.worker.state :as state]
[goog.object :as gobj]))
(defonce file-writes-chan (defonce file-writes-chan
(let [coercer (m/coercer [:catn (let [coercer (m/coercer [:catn
@ -81,12 +82,12 @@
(doseq [[repo page-id outliner-op] (set (map #(take 3 %) pages))] ; remove time to dedupe pages to write (doseq [[repo page-id outliner-op] (set (map #(take 3 %) pages))] ; remove time to dedupe pages to write
(try (do-write-file! repo conn page-id outliner-op context) (try (do-write-file! repo conn page-id outliner-op context)
(catch :default e (catch :default e
;; FIXME: notification (worker-util/post-message :notification
;; (notification/show! (pr-str
;; [:div [[:div
;; [:p "Write file failed, please copy the changes to other editors in case of losing data."] [:p "Write file failed, please copy the changes to other editors in case of losing data."]
;; "Error: " (str (gobj/get e "stack"))] "Error: " (str (gobj/get e "stack"))]
;; :error) :error]))
(log/error :file/write-file-error {:error e})))))) (log/error :file/write-file-error {:error e}))))))
(defn sync-to-file (defn sync-to-file
@ -94,7 +95,6 @@
(when (and repo page-id (when (and repo page-id
(not (:created-from-journal-template? tx-meta)) (not (:created-from-journal-template? tx-meta))
(not (:delete-files? tx-meta))) (not (:delete-files? tx-meta)))
(prn :debug :sync-to-file :repo repo :page-id page-id)
(async/put! file-writes-chan [repo page-id (:outliner-op tx-meta) (tc/to-long (t/now))]))) (async/put! file-writes-chan [repo page-id (:outliner-op tx-meta) (tc/to-long (t/now))])))
(defn <ratelimit-file-writes! (defn <ratelimit-file-writes!

View File

@ -5,7 +5,8 @@
[logseq.common.path :as path] [logseq.common.path :as path]
[datascript.core :as d] [datascript.core :as d]
[logseq.db :as ldb] [logseq.db :as ldb]
[frontend.worker.date :as worker-date])) [frontend.worker.date :as worker-date]
[frontend.worker.util :as util]))
(defn- indented-block-content (defn- indented-block-content
[content spaces-tabs] [content spaces-tabs]
@ -149,10 +150,8 @@
(tree->file-content repo db tree {:init-level init-level} context))] (tree->file-content repo db tree {:init-level init-level} context))]
(when-not (and (string/blank? new-content) (not blocks-just-deleted?)) (when-not (and (string/blank? new-content) (not blocks-just-deleted?))
(let [files [[file-path new-content]]] (let [files [[file-path new-content]]]
(prn :debug :write-file :file-path file-path :content new-content) (when (seq files)
;; TODO: send files to main thread to save (util/post-message :write-files {:repo repo :files files})))))
;; (file-handler/alter-files-handler! repo files {} {})
)))
;; In e2e tests, "card" page in db has no :file/path ;; In e2e tests, "card" page in db has no :file/path
(js/console.error "File path from page-block is not valid" page-block tree)))) (js/console.error "File path from page-block is not valid" page-block tree))))

View File

@ -9,7 +9,8 @@
[clojure.core.async :as async] [clojure.core.async :as async]
[cljs.core.async.impl.channels :refer [ManyToManyChannel]] [cljs.core.async.impl.channels :refer [ManyToManyChannel]]
[cljs-time.coerce :as tc] [cljs-time.coerce :as tc]
[cljs-time.core :as t])) [cljs-time.core :as t]
[cljs-bean.core :as bean]))
(defonce db-version-prefix "logseq_db_") (defonce db-version-prefix "logseq_db_")
(defonce local-db-prefix "logseq_local_") (defonce local-db-prefix "logseq_local_")
@ -136,3 +137,7 @@
(defn time-ms (defn time-ms
[] []
(tc/to-long (t/now))) (tc/to-long (t/now)))
(defn post-message
[type data]
(.postMessage js/self (bean/->js [type data])))