rtc.cljs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. (ns frontend.handler.db-based.rtc
  2. "RTC handler"
  3. (:require [clojure.pprint :as pp]
  4. [frontend.config :as config]
  5. [frontend.db :as db]
  6. [frontend.handler.db-based.rtc-flows :as rtc-flows]
  7. [frontend.handler.notification :as notification]
  8. [frontend.handler.user :as user-handler]
  9. [frontend.state :as state]
  10. [frontend.util :as util]
  11. [lambdaisland.glogi :as log]
  12. [logseq.db :as ldb]
  13. [logseq.db.common.sqlite :as common-sqlite]
  14. [logseq.shui.ui :as shui]
  15. [promesa.core :as p]))
  16. (defn <rtc-create-graph!
  17. [repo]
  18. (p/do!
  19. (js/Promise. user-handler/task--ensure-id&access-token)
  20. (let [token (state/get-auth-id-token)
  21. repo-name (common-sqlite/sanitize-db-name repo)]
  22. (state/<invoke-db-worker :thread-api/rtc-async-upload-graph repo token repo-name))))
  23. (defn <rtc-delete-graph!
  24. [graph-uuid schema-version]
  25. (p/do!
  26. (js/Promise. user-handler/task--ensure-id&access-token)
  27. (let [token (state/get-auth-id-token)]
  28. (state/<invoke-db-worker :thread-api/rtc-delete-graph token graph-uuid schema-version))))
  29. (defn <rtc-download-graph!
  30. [graph-name graph-uuid graph-schema-version timeout-ms]
  31. (assert (some? graph-schema-version))
  32. (state/set-state! :rtc/downloading-graph-uuid graph-uuid)
  33. (p/let [_ (js/Promise. user-handler/task--ensure-id&access-token)
  34. token (state/get-auth-id-token)
  35. download-info-uuid (state/<invoke-db-worker
  36. :thread-api/rtc-request-download-graph token graph-uuid graph-schema-version)
  37. {:keys [_download-info-uuid
  38. download-info-s3-url
  39. _download-info-tx-instant
  40. _download-info-t
  41. _download-info-created-at]
  42. :as result}
  43. (state/<invoke-db-worker :thread-api/rtc-wait-download-graph-info-ready
  44. token download-info-uuid graph-uuid graph-schema-version timeout-ms)]
  45. (->
  46. (when (not= result :timeout)
  47. (assert (some? download-info-s3-url) result)
  48. (state/<invoke-db-worker :thread-api/rtc-download-graph-from-s3 graph-uuid graph-name download-info-s3-url))
  49. (p/finally
  50. #(state/set-state! :rtc/downloading-graph-uuid nil)))))
  51. (defn <rtc-stop!
  52. []
  53. (state/<invoke-db-worker :thread-api/rtc-stop))
  54. (defn <rtc-branch-graph!
  55. [repo]
  56. (p/let [_ (js/Promise. user-handler/task--ensure-id&access-token)
  57. token (state/get-auth-id-token)
  58. start-ex (state/<invoke-db-worker :thread-api/rtc-async-branch-graph repo token)]
  59. (when-let [ex-data* (:ex-data start-ex)]
  60. (throw (ex-info (:ex-message start-ex) ex-data*)))))
  61. (defn notification-download-higher-schema-graph!
  62. [graph-name graph-uuid schema-version]
  63. (let [graph-name* (str graph-name "-" schema-version)]
  64. (notification/show!
  65. [:div "There's a higher schema-version graph on the server."
  66. (shui/button
  67. {:on-click
  68. (fn [e]
  69. (util/stop e)
  70. (<rtc-download-graph! graph-name* graph-uuid schema-version 60000))}
  71. "Download")]
  72. :warning false)))
  73. (declare <rtc-start!)
  74. (defn- notification-upload-higher-schema-graph!
  75. [repo]
  76. (notification/show!
  77. [:div "The local graph has a higher schema version than the graph on the server."
  78. (shui/button
  79. {:on-click
  80. (fn [e]
  81. (util/stop e)
  82. (p/do! (<rtc-branch-graph! repo)
  83. (rtc-flows/trigger-rtc-start repo)))}
  84. "Upload to server")]
  85. :warning false))
  86. (defn <rtc-start!
  87. [repo & {:keys [stop-before-start?] :or {stop-before-start? true}}]
  88. (when-let [graph-uuid (ldb/get-graph-rtc-uuid (db/get-db repo))]
  89. (p/do!
  90. (js/Promise. user-handler/task--ensure-id&access-token)
  91. (p/let [start-ex (state/<invoke-db-worker :thread-api/rtc-start stop-before-start?)
  92. ex-data* (:ex-data start-ex)
  93. _ (case (:type ex-data*)
  94. (:rtc.exception/not-rtc-graph
  95. :rtc.exception/not-found-db-conn)
  96. (notification/show! (:ex-message start-ex) :error)
  97. :rtc.exception/major-schema-version-mismatched
  98. (case (:sub-type ex-data*)
  99. :download
  100. (notification-download-higher-schema-graph! repo graph-uuid (:remote ex-data*))
  101. :create-branch
  102. (notification-upload-higher-schema-graph! repo)
  103. ;; else
  104. (do (log/info :start-ex start-ex)
  105. (notification/show! [:div
  106. [:div (:ex-message start-ex)]
  107. [:div (-> ex-data*
  108. (select-keys [:app :local :remote])
  109. pp/pprint
  110. with-out-str)]]
  111. :error)))
  112. :rtc.exception/lock-failed
  113. (js/setTimeout #(<rtc-start! repo) 1000)
  114. ;; else
  115. nil)]
  116. nil))))
  117. (defn <get-remote-graphs
  118. []
  119. (p/let [_ (js/Promise. user-handler/task--ensure-id&access-token)
  120. token (state/get-auth-id-token)
  121. graphs (state/<invoke-db-worker :thread-api/rtc-get-graphs token)
  122. result (->> graphs
  123. (remove (fn [graph] (= (:graph-status graph) "deleting")))
  124. (mapv (fn [graph]
  125. (merge
  126. (let [url (str config/db-version-prefix (:graph-name graph))]
  127. {:url url
  128. :GraphName (:graph-name graph)
  129. :GraphSchemaVersion (:graph-schema-version graph)
  130. :GraphUUID (:graph-uuid graph)
  131. :rtc-graph? true})
  132. (dissoc graph :graph-uuid :graph-name)))))]
  133. (state/set-state! :rtc/graphs result)))
  134. (defn <rtc-get-users-info
  135. []
  136. (when-let [graph-uuid (ldb/get-graph-rtc-uuid (db/get-db))]
  137. (p/let [token (state/get-auth-id-token)
  138. repo (state/get-current-repo)
  139. result (state/<invoke-db-worker :thread-api/rtc-get-users-info token graph-uuid)]
  140. (state/set-state! :rtc/users-info {repo result}))))
  141. (defn <rtc-invite-email
  142. [graph-uuid email]
  143. (let [token (state/get-auth-id-token)]
  144. (->
  145. (p/do!
  146. (state/<invoke-db-worker :thread-api/rtc-grant-graph-access
  147. token (str graph-uuid) [] [email])
  148. (notification/show! "Invitation sent!" :success))
  149. (p/catch (fn [e]
  150. (notification/show! "Something wrong, please try again." :error)
  151. (js/console.error e))))))