mirror of
https://github.com/logseq/logseq.git
synced 2026-05-29 23:19:38 +00:00
wip: proxy worker requests
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
[frontend.worker.rtc.core]
|
||||
[frontend.worker.rtc.db-listener]
|
||||
[frontend.worker.search :as search]
|
||||
[frontend.worker.shared-service :as shared-service]
|
||||
[frontend.worker.state :as worker-state] ;; [frontend.worker.undo-redo :as undo-redo]
|
||||
[frontend.worker.undo-redo2 :as undo-redo]
|
||||
[frontend.worker.util :as worker-util]
|
||||
@@ -847,22 +848,37 @@
|
||||
(defn init
|
||||
"web worker entry"
|
||||
[]
|
||||
(glogi-console/install!)
|
||||
(check-worker-scope!)
|
||||
(outliner-register-op-handlers!)
|
||||
(<ratelimit-file-writes!)
|
||||
(js/setInterval #(.postMessage js/self "keepAliveResponse") (* 1000 25))
|
||||
(Comlink/expose #js{"remoteInvoke" thread-api/remote-function})
|
||||
(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)))
|
||||
(let [fns {"remoteInvoke" thread-api/remote-function}
|
||||
service (shared-service/create-service "graph"
|
||||
(bean/->js fns)
|
||||
{:on-provider-change
|
||||
(fn [_client-id provider?]
|
||||
(prn :debug :provider-changed
|
||||
:provider? provider?))})
|
||||
proxy-object (->>
|
||||
(map (fn [k]
|
||||
[k (fn [& args]
|
||||
;; ensure service is ready
|
||||
(p/let [_ready-value @(get-in service [:status :ready])]
|
||||
(js-invoke (:proxy service) k args)))]) (keys fns))
|
||||
(into {})
|
||||
bean/->js)]
|
||||
(glogi-console/install!)
|
||||
(check-worker-scope!)
|
||||
(outliner-register-op-handlers!)
|
||||
(<ratelimit-file-writes!)
|
||||
(js/setInterval #(.postMessage js/self "keepAliveResponse") (* 1000 25))
|
||||
(Comlink/expose proxy-object)
|
||||
(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!
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
(ns frontend.worker.shared-service
|
||||
(:require [cljs-bean.core :as bean]
|
||||
[goog.object :as gobj]
|
||||
[promesa.core :as p]))
|
||||
|
||||
;; Idea and code copied from https://github.com/Matt-TOTW/shared-service/blob/master/src/sharedService.ts
|
||||
@@ -67,7 +68,7 @@
|
||||
(when (and (= type "providerChange") (not provider?))
|
||||
(js/console.log "Provider change detected. Re-registering...")
|
||||
(when on-provider-change
|
||||
(on-provider-change provider?))
|
||||
(on-provider-change client-id provider?))
|
||||
(register)
|
||||
(when (seq @*requests-in-flight)
|
||||
(js/console.log "Requests were in flight when provider changed. Requeuing...")
|
||||
@@ -86,12 +87,12 @@
|
||||
|
||||
status {:ready (atom (p/create (fn [resolve] (reset! *ready-resolve resolve))))
|
||||
:is-service-provider (atom
|
||||
(p/let [locks (.query js/navigator.locks)
|
||||
provider? (nil? (some #(= (.-name %) service-name)
|
||||
(js/Array.from (.-held locks))))]
|
||||
(when-not provider?
|
||||
(on-not-provider provider?))
|
||||
provider?))}
|
||||
(p/create (fn [resolve]
|
||||
(p/let [^js locks (.query js/navigator.locks)
|
||||
provider? (nil? (some #(= (.-name %) service-name) (.-held locks)))]
|
||||
(resolve provider?)
|
||||
(when-not provider?
|
||||
(on-not-provider provider?))))))}
|
||||
on-become-provider (fn []
|
||||
(p/do!
|
||||
(reset! (:is-service-provider status) (p/resolved true))
|
||||
@@ -131,7 +132,7 @@
|
||||
(.postMessage common-channel #js {:type "providerChange" :serviceName service-name})
|
||||
(when on-provider-change
|
||||
(p/let [provider? @(:is-service-provider status)]
|
||||
(on-provider-change provider?)))
|
||||
(on-provider-change nil provider?)))
|
||||
|
||||
(when (seq @*requests-in-flight)
|
||||
(js/console.log "Requests were in flight when tab became provider. Requeuing...")
|
||||
@@ -163,10 +164,11 @@
|
||||
nil
|
||||
|
||||
:else
|
||||
(fn [& args]
|
||||
(fn [args]
|
||||
(p/let [provider? @(:is-service-provider status)]
|
||||
(if provider?
|
||||
(js-invoke target method (clj->js args))
|
||||
(let [f (gobj/get target method)]
|
||||
(apply f args))
|
||||
(p/create
|
||||
(fn [resolve reject]
|
||||
(let [id (random-id)
|
||||
|
||||
Reference in New Issue
Block a user