Skip to content

Commit c1b0c58

Browse files
committed
fix: reuse core.async promise-chan to await transact
Because the worker db may not be updated from thread-api calls.
1 parent 98418bb commit c1b0c58

File tree

4 files changed

+56
-66
lines changed

4 files changed

+56
-66
lines changed

src/main/frontend/common/async_util.cljc

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@
66
[logseq.common.util :as common-util]
77
[promesa.core :as p])))
88

9-
(comment
10-
#?(:cljs
11-
(defn throw-err
12-
[v]
13-
(if (instance? ExceptionInfo v) (throw v) v))))
9+
#?(:cljs
10+
(defn throw-err
11+
[v]
12+
(if (instance? ExceptionInfo v) (throw v) v)))
1413

15-
(comment
16-
(defmacro <?
17-
[port]
18-
`(throw-err (cljs.core.async/<! ~port))))
14+
(defmacro <?
15+
[port]
16+
`(throw-err (cljs.core.async/<! ~port)))
1917

2018
#?(:cljs
2119
(defn c->p

src/main/frontend/db/transact.cljs

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,51 @@
11
(ns frontend.db.transact
22
"Provides async transact for use with ldb/transact!"
3-
(:require [promesa.core :as p]))
3+
(:require [clojure.core.async :as async]
4+
[clojure.core.async.interop :refer [p->c]]
5+
[frontend.common.async-util :include-macros true :refer [<?]]
6+
[frontend.state :as state]
7+
[frontend.util :as util]
8+
[lambdaisland.glogi :as log]
9+
[logseq.outliner.op :as outliner-op]
10+
[promesa.core :as p]))
411

5-
(defonce *request-id (atom 0))
6-
7-
(defonce *db-transact-requests (atom {}))
8-
9-
(defn get-next-request-id
10-
[]
11-
(swap! *request-id inc))
12-
13-
(defn get-resp
14-
[request-id]
15-
(get @*db-transact-requests request-id))
16-
17-
(defn remove-request!
18-
[request-id]
19-
(swap! *db-transact-requests dissoc request-id))
20-
21-
(defn add-request!
22-
[request-id request-f]
23-
(->
24-
(let [ui-db-transacted-promise (p/deferred)]
25-
(swap! *db-transact-requests assoc request-id ui-db-transacted-promise)
26-
(p/let [reply (request-f)]
27-
ui-db-transacted-promise
28-
reply))
29-
(p/finally
30-
(fn []
31-
(remove-request! request-id)))))
12+
(defn worker-call
13+
[request-f]
14+
(let [response (p/deferred)]
15+
(async/go
16+
(let [result (<? (p->c (request-f)))]
17+
(if (:ex-data result)
18+
(do
19+
(log/error :worker-request-failed result)
20+
(p/reject! response result))
21+
(p/resolve! response result))))
22+
response))
3223

3324
(defn transact [worker-transact repo tx-data tx-meta]
34-
(let [request-id (get-next-request-id)
35-
tx-meta' (assoc tx-meta
36-
:request-id request-id
25+
(let [tx-meta' (assoc tx-meta
3726
;; not from remote (rtc)
3827
:local-tx? true)]
39-
(add-request! request-id (fn async-request []
40-
(worker-transact repo tx-data tx-meta')))))
28+
(prn :debug :transact :tx-meta tx-meta)
29+
(worker-call (fn async-request []
30+
(worker-transact repo tx-data tx-meta')))))
31+
32+
(defn apply-outliner-ops
33+
[conn ops opts]
34+
(when (seq ops)
35+
(if util/node-test?
36+
(outliner-op/apply-ops! (state/get-current-repo)
37+
conn
38+
ops
39+
(state/get-date-formatter)
40+
opts)
41+
(let [opts' (assoc opts
42+
:client-id (:client-id @state/state)
43+
:local-tx? true)
44+
request #(frontend.state/<invoke-db-worker
45+
:thread-api/apply-outliner-ops
46+
(frontend.state/get-current-repo)
47+
ops
48+
opts')]
49+
(prn :debug :apply-outliner-ops :opts opts'
50+
:ops ops)
51+
(frontend.db.transact/worker-call request)))))

src/main/frontend/modules/outliner/pipeline.cljs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@
2727
(state/set-edit-content! new-title))))))
2828

2929
(defn invoke-hooks
30-
[{:keys [request-id repo tx-meta tx-data deleted-block-uuids deleted-assets affected-keys blocks]}]
30+
[{:keys [repo tx-meta tx-data deleted-block-uuids deleted-assets affected-keys blocks]}]
3131
;; (prn :debug
32-
;; :request-id request-id
3332
;; :tx-meta tx-meta
3433
;; ;; :tx-data tx-data
3534
;; )
@@ -82,9 +81,6 @@
8281
(when-not (= (:client-id tx-meta) (:client-id @state/state))
8382
(update-editing-block-title-if-changed! tx-data))
8483

85-
(when-let [resp (db-transact/get-resp request-id)]
86-
(p/resolve! resp true))
87-
8884
(when (seq deleted-assets)
8985
(doseq [asset deleted-assets]
9086
(fs/unlink! repo (path/path-join (config/get-current-repo-assets-root) (str (:block/uuid asset) "." (:ext asset))) {})))

src/main/frontend/modules/outliner/ui.cljc

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,7 @@
2222
;; (prn :ops r#)
2323
;; (js/console.trace)
2424
;; (js/console.groupEnd)
25-
(if test?#
26-
(when (seq r#)
27-
(logseq.outliner.op/apply-ops! (frontend.state/get-current-repo)
28-
(frontend.db.conn/get-db false)
29-
r#
30-
(frontend.state/get-date-formatter)
31-
~opts))
32-
(when (seq r#)
33-
(let [request-id# (frontend.db.transact/get-next-request-id)
34-
request# #(frontend.state/<invoke-db-worker
35-
:thread-api/apply-outliner-ops
36-
(frontend.state/get-current-repo)
37-
r#
38-
(assoc ~opts
39-
:request-id request-id#
40-
:client-id (:client-id @frontend.state/state)
41-
:local-tx? true))
42-
response# (frontend.db.transact/add-request! request-id# request#)]
43-
response#))))))))
25+
(frontend.db.transact/apply-outliner-ops
26+
(frontend.db.conn/get-db false)
27+
r#
28+
~opts))))))

0 commit comments

Comments
 (0)