wip: proxy worker requests

This commit is contained in:
Tienson Qin
2025-04-11 12:07:42 +08:00
parent cc4ef5f1ca
commit 444ccfd6fd
2 changed files with 44 additions and 26 deletions

View File

@@ -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!

View File

@@ -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)