Skip to content

Commit 30671bf

Browse files
committed
refactor(db-worker,wip): remove <invoke-main-thread (1)
1 parent 4b139bb commit 30671bf

12 files changed

Lines changed: 571 additions & 44 deletions

File tree

docs/agent-guide/074-db-worker-node-invoke-main-thread-refactor.md

Lines changed: 297 additions & 0 deletions
Large diffs are not rendered by default.

src/main/frontend/components/repo.cljs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,9 @@
452452
(state/<invoke-db-worker :thread-api/set-db-sync-config
453453
{:enabled? true
454454
:ws-url config/db-sync-ws-url
455-
:http-base config/db-sync-http-base})
455+
:http-base config/db-sync-http-base
456+
:oauth-domain config/OAUTH-DOMAIN
457+
:oauth-client-id config/COGNITO-CLIENT-ID})
456458
(p/let [rsa-key-pair (state/<invoke-db-worker :thread-api/db-sync-ensure-user-rsa-keys)]
457459
(set-e2ee-rsa-key-ensured? (some? rsa-key-pair))))
458460
(p/catch (fn [e]

src/main/frontend/handler/events/ui.cljs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@
332332
(state/<invoke-db-worker :thread-api/set-db-sync-config
333333
{:enabled? true
334334
:ws-url config/db-sync-ws-url
335-
:http-base config/db-sync-http-base})
335+
:http-base config/db-sync-http-base
336+
:oauth-domain config/OAUTH-DOMAIN
337+
:oauth-client-id config/COGNITO-CLIENT-ID})
336338
(state/<invoke-db-worker :thread-api/db-sync-ensure-user-rsa-keys))
337339
(p/catch (fn [error]
338340
(log/error :db-sync/ensure-user-rsa-keys-failed error)

src/main/frontend/persist_db/browser.cljs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@
143143
_ (state/<invoke-db-worker :thread-api/set-db-sync-config
144144
{:enabled? true
145145
:ws-url config/db-sync-ws-url
146-
:http-base config/db-sync-http-base})
146+
:http-base config/db-sync-http-base
147+
:oauth-domain config/OAUTH-DOMAIN
148+
:oauth-client-id config/COGNITO-CLIENT-ID})
147149
_ (state/pub-event! [:rtc/sync-app-state])
148150
_ (log/info "init worker spent" (str (- (util/time-ms) t1) "ms"))
149151
_ (sync-ui-state!)

src/main/frontend/worker/platform.cljs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,24 @@
7575
(f path text)
7676
(throw (ex-info "platform storage/write-text! missing" {:path path}))))
7777

78+
(defn save-secret-text!
79+
[platform key text]
80+
(if-let [f (get-in platform [:crypto :save-secret-text!])]
81+
(f key text)
82+
(throw (ex-info "platform crypto/save-secret-text! missing" {:key key}))))
83+
84+
(defn read-secret-text
85+
[platform key]
86+
(if-let [f (get-in platform [:crypto :read-secret-text])]
87+
(f key)
88+
(throw (ex-info "platform crypto/read-secret-text missing" {:key key}))))
89+
90+
(defn delete-secret-text!
91+
[platform key]
92+
(if-let [f (get-in platform [:crypto :delete-secret-text!])]
93+
(f key)
94+
(throw (ex-info "platform crypto/delete-secret-text! missing" {:key key}))))
95+
7896
(defn websocket-connect
7997
[platform url]
8098
(if-let [f (get-in platform [:websocket :connect])]

src/main/frontend/worker/platform/browser.cljs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,24 @@
6060
[k value]
6161
(idb-keyval/set k value @kv-store))
6262

63+
(def ^:private secret-prefix "worker-secret###")
64+
65+
(defn- secret-key
66+
[key]
67+
(str secret-prefix key))
68+
69+
(defn- save-secret-text!
70+
[key text]
71+
(kv-set! (secret-key key) text))
72+
73+
(defn- read-secret-text
74+
[key]
75+
(kv-get (secret-key key)))
76+
77+
(defn- delete-secret-text!
78+
[key]
79+
(kv-set! (secret-key key) nil))
80+
6381
(defn- install-opfs-pool
6482
[sqlite pool-name]
6583
(.installOpfsSAHPoolVfs ^js sqlite #js {:name pool-name
@@ -126,5 +144,7 @@
126144
:close-db (fn [db] (.close db))
127145
:exec (fn [db sql-or-opts] (.exec db sql-or-opts))
128146
:transaction (fn [db f] (.transaction db f))}
129-
:crypto {}
147+
:crypto {:save-secret-text! save-secret-text!
148+
:read-secret-text read-secret-text
149+
:delete-secret-text! delete-secret-text!}
130150
:timers {:set-interval! (fn [f ms] (js/setInterval f ms))}})

src/main/frontend/worker/platform/node.cljs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@
298298
[state]
299299
(transit/write kv-transit-writer state))
300300

301+
(def ^:private secret-prefix "worker-secret###")
302+
303+
(defn- secret-key
304+
[key]
305+
(str secret-prefix key))
306+
301307
(defn- kv-store
302308
[data-dir]
303309
(let [kv-path (node-path/join data-dir "kv-store.json")
@@ -359,5 +365,10 @@
359365
:backup-db (fn [db path]
360366
(let [backup-fn (gobj/get db "backup")]
361367
(backup-fn path)))}
362-
:crypto {}
368+
:crypto {:save-secret-text! (fn [key text]
369+
((:set! kv) (secret-key key) text))
370+
:read-secret-text (fn [key]
371+
((:get kv) (secret-key key)))
372+
:delete-secret-text! (fn [key]
373+
((:set! kv) (secret-key key) nil))}
363374
:timers {:set-interval! (fn [f ms] (js/setInterval f ms))}})))

src/main/frontend/worker/sync/auth.cljs

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
"Auth and endpoint helpers for db sync."
33
(:require [clojure.string :as string]
44
[frontend.worker-common.util :as worker-util]
5-
[logseq.common.util :as common-util]
6-
[promesa.core :as p]
5+
[frontend.worker.state :as worker-state]
76
[frontend.worker.sync.util :as sync-util]
8-
[frontend.worker.state :as worker-state]))
7+
[logseq.common.util :as common-util]
8+
[promesa.core :as p]))
99

1010
(defn ws-base-url
1111
[db-sync-config]
@@ -36,16 +36,59 @@
3636
(catch :default _
3737
true))))
3838

39+
(defn oauth-token-url
40+
[db-sync-config]
41+
(or (:oauth-token-url db-sync-config)
42+
(when-let [domain (not-empty (:oauth-domain db-sync-config))]
43+
(str "https://" domain "/oauth2/token"))))
44+
45+
(defn <refresh-id&access-token
46+
[]
47+
(let [refresh-token (:auth/refresh-token @worker-state/*state)
48+
db-sync-config @worker-state/*db-sync-config
49+
token-url (oauth-token-url db-sync-config)
50+
oauth-client-id (:oauth-client-id db-sync-config)]
51+
(when-not (seq refresh-token)
52+
(throw (ex-info "worker auth refresh requires refresh token"
53+
{:code :missing-refresh-token})))
54+
(when-not (seq token-url)
55+
(throw (ex-info "worker auth refresh requires oauth token url"
56+
{:code :missing-oauth-token-url})))
57+
(when-not (seq oauth-client-id)
58+
(throw (ex-info "worker auth refresh requires oauth client id"
59+
{:code :missing-oauth-client-id})))
60+
(let [form-data (js/URLSearchParams.)]
61+
(.set form-data "grant_type" "refresh_token")
62+
(.set form-data "client_id" oauth-client-id)
63+
(.set form-data "refresh_token" refresh-token)
64+
(p/let [resp (js/fetch token-url #js {:method "POST"
65+
:headers #js {"content-type" "application/x-www-form-urlencoded"}
66+
:body (.toString form-data)})
67+
text (.text resp)
68+
data (when (seq text)
69+
(js->clj (js/JSON.parse text) :keywordize-keys true))]
70+
(if (.-ok resp)
71+
{:id-token (:id_token data)
72+
:access-token (:access_token data)}
73+
(throw (ex-info "worker auth refresh failed"
74+
{:code :auth-refresh-failed
75+
:status (.-status resp)
76+
:token-url token-url
77+
:body data})))))))
78+
3979
(defn <resolve-ws-token
4080
[]
41-
(let [token (sync-util/auth-token)]
42-
(if (and (not (sync-util/cli-node-owner?))
43-
(id-token-expired? token))
44-
(p/let [resp (worker-state/<invoke-main-thread :thread-api/ensure-id&access-token)
45-
refreshed-token (:id-token resp)]
46-
(when (string? refreshed-token)
47-
(worker-state/set-new-state! {:auth/id-token refreshed-token})
48-
refreshed-token))
81+
(let [token (sync-util/auth-token)
82+
token-expired? (id-token-expired? token)]
83+
(if (and (not (sync-util/cli-node-owner?)) token-expired?)
84+
(p/let [{:keys [id-token access-token]} (<refresh-id&access-token)]
85+
(when-not (seq id-token)
86+
(throw (ex-info "worker auth refresh returned empty id-token"
87+
{:code :auth-refresh-empty-id-token})))
88+
(worker-state/set-new-state!
89+
(cond-> {:auth/id-token id-token}
90+
(seq access-token) (assoc :auth/access-token access-token)))
91+
id-token)
4992
(p/resolved token))))
5093

5194
(defn get-user-uuid

src/main/frontend/worker/sync/crypt.cljs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
(defonce ^:private *graph->aes-key (atom {}))
1717
(defonce ^:private *user-rsa-key-pair-inflight (atom {}))
1818
(defonce ^:private e2ee-password-file "e2ee-password")
19+
(defonce ^:private e2ee-password-secret-key "logseq-encrypted-password")
1920
(defonce ^:private native-env?
2021
(let [href (try (.. js/self -location -href)
2122
(catch :default _ nil))]
@@ -31,15 +32,15 @@
3132

3233
(defn <native-save-password-text!
3334
[encrypted-text]
34-
(worker-state/<invoke-main-thread :thread-api/native-save-e2ee-password encrypted-text))
35+
(platform/save-secret-text! (platform/current) e2ee-password-secret-key encrypted-text))
3536

3637
(defn- <native-read-password-text
3738
[]
38-
(worker-state/<invoke-main-thread :thread-api/native-get-e2ee-password))
39+
(platform/read-secret-text (platform/current) e2ee-password-secret-key))
3940

4041
(defn- <native-delete-password-text!
4142
[]
42-
(worker-state/<invoke-main-thread :thread-api/native-delete-e2ee-password))
43+
(platform/delete-secret-text! (platform/current) e2ee-password-secret-key))
4344

4445
(defn- <save-e2ee-password
4546
[refresh-token password]
@@ -55,9 +56,16 @@
5556

5657
(defn- <read-e2ee-password
5758
[refresh-token]
58-
(p/let [text (if (native-worker?)
59-
(<native-read-password-text)
60-
(platform/read-text! (platform/current) e2ee-password-file))
59+
(p/let [platform' (platform/current)
60+
text (if (native-worker?)
61+
(-> (p/let [native-text (<native-read-password-text)]
62+
(if (seq native-text)
63+
native-text
64+
(platform/read-text! platform' e2ee-password-file)))
65+
(p/catch (fn [e]
66+
(log/error :native-get-e2ee-password {:error e})
67+
(platform/read-text! platform' e2ee-password-file))))
68+
(platform/read-text! platform' e2ee-password-file))
6169
data (ldb/read-transit-str text)
6270
password (crypt/<decrypt-text-by-text-password refresh-token data)]
6371
password))

src/test/frontend/handler/db_based/sync_test.cljs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@
386386
(p/then (fn [_]
387387
(is (= 1 (count @worker-calls)))
388388
(let [[op graph graph-uuid graph-e2ee?] (first @worker-calls)]
389-
(is (= :thread-api/db-sync-download-graph op))
389+
(is (= :thread-api/db-sync-download-graph-by-id op))
390390
(is (string/ends-with? graph "demo-graph"))
391391
(is (= "graph-1" graph-uuid))
392392
(is (= false graph-e2ee?)))

0 commit comments

Comments
 (0)