ops_idb_store.cljs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. (ns frontend.db.rtc.ops-idb-store
  2. "Fns to RW ops in indexeddb"
  3. (:require ["/frontend/idbkv" :as idb-keyval :refer [Store]]
  4. [promesa.core :as p]
  5. [cljs-time.core :as t]
  6. [cljs-time.coerce :as tc]
  7. [cljs.core.async :as async]
  8. [cljs.core.async.interop :refer [p->c]]))
  9. (def stores (atom {}))
  10. (defn- ensure-store
  11. [repo]
  12. {:pre [(some? repo)]}
  13. (swap! stores assoc repo (Store. (str "rtc-ops-" repo) "ops"))
  14. (@stores repo))
  15. (defn <update-local-tx!
  16. [repo tx]
  17. (idb-keyval/set "local-tx" tx (ensure-store repo)))
  18. (defn <update-graph-uuid!
  19. [repo graph-uuid]
  20. {:pre [(some? graph-uuid)]}
  21. (idb-keyval/set "graph-uuid" graph-uuid (ensure-store repo)))
  22. (defn- <add-ops*!
  23. [repo ops]
  24. (let [store (ensure-store repo)
  25. key* (tc/to-long (t/now))]
  26. (p/loop [key* key* ops ops]
  27. (let [[op & other-ops] ops]
  28. (when op
  29. (p/let [old-v (idb-keyval/get key* store)]
  30. (if old-v
  31. (p/recur (inc key*) ops)
  32. (do (idb-keyval/set key* (clj->js op) store)
  33. (p/recur (inc key*) other-ops)))))))))
  34. (defonce ^:private add-ops-ch (async/chan 100))
  35. (defonce #_:clj-kondo/ignore _add-ops-loop
  36. (async/go-loop []
  37. (if-let [[repo ops] (async/<! add-ops-ch)]
  38. (do (prn :add-ops ops)
  39. (async/<! (p->c (<add-ops*! repo ops)))
  40. (recur))
  41. (recur))))
  42. (defn <add-ops!
  43. [repo ops]
  44. (async/go (async/>! add-ops-ch [repo ops])))
  45. (defn <clear-ops!
  46. [repo keys]
  47. (let [store (ensure-store repo)]
  48. (p/all (map #(idb-keyval/del % store) keys))))
  49. (defn <get-all-ops
  50. [repo]
  51. (p/let [store (ensure-store repo)
  52. keys (idb-keyval/keys store)]
  53. (-> (p/all (mapv (fn [k] (p/chain (idb-keyval/get k store) (partial vector k))) keys))
  54. (p/then (fn [items] (mapv #(js->clj % :keywordize-keys true) items))))))
  55. (defn <get-graph-uuid
  56. [repo]
  57. (p/let [store (ensure-store repo)]
  58. (idb-keyval/get "graph-uuid" store)))
  59. (comment
  60. (defn <get-local-tx
  61. [repo]
  62. (p/let [store (ensure-store repo)]
  63. (idb-keyval/get "local-tx" store))))