rtc.cljs 7.3 KB

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