worker.cljs 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. (ns frontend.handler.worker
  2. "Handle messages received from the webworkers"
  3. (:require [cljs-bean.core :as bean]
  4. [clojure.string :as string]
  5. [frontend.handler.file-based.file :as file-handler]
  6. [frontend.handler.notification :as notification]
  7. [frontend.state :as state]
  8. [lambdaisland.glogi :as log]
  9. [logseq.db :as ldb]
  10. [promesa.core :as p]))
  11. (defmulti handle identity)
  12. (defmethod handle :write-files [_ _worker data]
  13. (let [{:keys [request-id page-id repo files]} data]
  14. (->
  15. (p/let [_ (file-handler/alter-files repo files {})]
  16. (state/<invoke-db-worker :thread-api/page-file-saved request-id page-id))
  17. (p/catch (fn [error]
  18. (notification/show!
  19. [:div
  20. [:p "Write file failed, please copy the changes to other editors in case of losing data."]
  21. "Error: " (str (.-stack error))]
  22. :error)
  23. (state/<invoke-db-worker :thread-api/page-file-saved request-id page-id))))))
  24. (defmethod handle :notification [_ _worker data]
  25. (apply notification/show! data))
  26. (defmethod handle :log [_ _worker [name level data]]
  27. (log/log name level data))
  28. (defmethod handle :add-repo [_ _worker data]
  29. (state/add-repo! {:url (:repo data)})
  30. (state/pub-event! [:graph/switch (:repo data) {:rtc-download? true}]))
  31. (defmethod handle :rtc-sync-state [_ _worker data]
  32. (let [state data]
  33. (state/pub-event! [:rtc/sync-state state])))
  34. (defmethod handle :vector-search-sync-state [_ _worker data]
  35. (state/pub-event! [:vector-search/sync-state data]))
  36. (defmethod handle :sync-db-changes [_ _worker data]
  37. (state/pub-event! [:db/sync-changes data]))
  38. (defmethod handle :rtc-log [_ _worker log]
  39. (state/pub-event! [:rtc/log log]))
  40. (defmethod handle :export-current-db [_]
  41. (state/pub-event! [:db/export-sqlite]))
  42. (defmethod handle :record-worker-client-id [_ _worker data]
  43. (when-let [client-id (:client-id data)]
  44. (reset! state/*db-worker-client-id client-id)))
  45. (defmethod handle :capture-error [_ _worker data]
  46. (state/pub-event! [:capture-error data]))
  47. (defmethod handle :vector-search/load-model-progress [_ _ data]
  48. (state/pub-event! [:vector-search/load-model-progress data]))
  49. (defmethod handle :backup-file [_ _worker data]
  50. (state/pub-event! [:graph/backup-file data]))
  51. (defmethod handle :notify-existing-file [_ _worker data]
  52. (state/pub-event! [:graph/notify-existing-file data]))
  53. (defmethod handle :remote-graph-gone []
  54. (state/pub-event! [:rtc/remote-graph-gone]))
  55. (defmethod handle :default [_ _worker data]
  56. (prn :debug "Worker data not handled: " data))
  57. (defn handle-message!
  58. [^js worker wrapped-worker]
  59. (assert worker "worker doesn't exists")
  60. (set! (.-onmessage worker)
  61. (fn [event]
  62. (let [data (.-data event)]
  63. (if (= data "keepAliveResponse")
  64. (.postMessage worker "keepAliveRequest")
  65. (when-not (contains? #{"RAW" "APPLY" "RELEASE"} (.-type data))
  66. ;; Log thrown exceptions from comlink
  67. ;; https://github.com/GoogleChromeLabs/comlink/blob/dffe9050f63b1b39f30213adeb1dd4b9ed7d2594/src/comlink.ts#L223-L236
  68. (if (and (= "HANDLER" (.-type data)) (= "throw" (.-name data)))
  69. (if (.-isError (.-value data))
  70. (do (js/console.error "Unexpected webworker error:" (-> data bean/->clj (get-in [:value :value])))
  71. (js/console.log (get-in (bean/->clj data) [:value :value :stack])))
  72. (js/console.error "Unexpected webworker error :" data))
  73. (if (string? data)
  74. (let [[e payload] (ldb/read-transit-str data)]
  75. (handle (keyword e) wrapped-worker payload))
  76. (when-not (string/starts-with? (.-type data) "MP_")
  77. (js/console.error "Worker received invalid data from worker: " data))))))))))