From 85f7a083808d45090d64913f730b4989aba24eb2 Mon Sep 17 00:00:00 2001 From: michaelr Date: Thu, 17 Mar 2016 20:15:24 +0200 Subject: [PATCH] kv store implementation over realm Former-commit-id: 95d0f566d7c64df149588cf190c87bfe70561a23 --- src/messenger/android/core.cljs | 4 ++- src/messenger/init.cljs | 6 +++++ src/messenger/models/protocol.cljs | 11 +++----- src/messenger/persistence/realm.cljs | 20 +++----------- .../persistence/simple_kv_store.cljs | 26 +++++++++++++++++++ src/messenger/protocol/protocol_handler.cljs | 5 ++-- src/messenger/state.cljs | 3 +++ 7 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 src/messenger/init.cljs create mode 100644 src/messenger/persistence/simple_kv_store.cljs diff --git a/src/messenger/android/core.cljs b/src/messenger/android/core.cljs index 59d264d785..274d152425 100644 --- a/src/messenger/android/core.cljs +++ b/src/messenger/android/core.cljs @@ -17,7 +17,8 @@ [messenger.comm.intercom :as intercom :refer [load-user-phone-number load-user-whisper-identity]] [messenger.protocol.protocol-handler :refer [make-handler]] - [syng-im.protocol.api :refer [init-protocol]])) + [syng-im.protocol.api :refer [init-protocol]] + [messenger.init :refer [init-simple-store]])) (def app-registry (.-AppRegistry js/React)) @@ -62,6 +63,7 @@ (defonce app-root (om/factory RootNode)) (defn init [] + (init-simple-store) (pubsub/setup-pub-sub) (init-protocol (make-handler)) (load-user-phone-number) diff --git a/src/messenger/init.cljs b/src/messenger/init.cljs new file mode 100644 index 0000000000..70ca211e5c --- /dev/null +++ b/src/messenger/init.cljs @@ -0,0 +1,6 @@ +(ns messenger.init + (:require [messenger.persistence.simple-kv-store :as kv] + [messenger.state :as state])) + +(defn init-simple-store [] + (swap! state/app-state assoc-in state/simple-store-path (kv/->SimpleKvStore))) diff --git a/src/messenger/models/protocol.cljs b/src/messenger/models/protocol.cljs index f09529d3a7..07f82e3921 100644 --- a/src/messenger/models/protocol.cljs +++ b/src/messenger/models/protocol.cljs @@ -1,6 +1,6 @@ (ns messenger.models.protocol (:require [messenger.state :as state] - [messenger.persistence.realm :as r])) + [syng-im.protocol.state.storage :as s])) (defn set-initialized [initialized?] (swap! state/app-state assoc-in state/protocol-initialized-path initialized?)) @@ -8,12 +8,7 @@ ;; TODO at least the private key has to be encrypted with user's password (defn update-identity [identity] - (r/write - (fn [] - (r/create :kv-store {:key :identity - :value (str identity)} true)))) + (s/put (state/kv-store) :identity identity)) (defn current-identity [] - (-> (r/get-by-field :kv-store :key :identity) - (r/single-cljs) - (r/decode-value))) + (s/get (state/kv-store) :identity)) diff --git a/src/messenger/persistence/realm.cljs b/src/messenger/persistence/realm.cljs index da2eb59dd6..d0bdc5ebe5 100644 --- a/src/messenger/persistence/realm.cljs +++ b/src/messenger/persistence/realm.cljs @@ -61,23 +61,9 @@ (defn decode-value [{:keys [key value]}] (read-string value)) -(comment - (use 'figwheel-sidecar.repl-api) - (cljs-repl) - - (def x (-> (get-by-field :kv-store :key :identity) - (single))) - - (aget x 1) - +(defn delete [obj] (write (fn [] - (.delete realm (-> (get-by-field :kv-store :key :identity) - (single))))) - - - (log/info (.keys js/Object realm)) - (log/info (clj->js opts)) - - (clj->js (clj->js {:a [{:b 123}]})) + (.delete realm obj)))) +(comment ) \ No newline at end of file diff --git a/src/messenger/persistence/simple_kv_store.cljs b/src/messenger/persistence/simple_kv_store.cljs new file mode 100644 index 0000000000..ca74bd01a8 --- /dev/null +++ b/src/messenger/persistence/simple_kv_store.cljs @@ -0,0 +1,26 @@ +(ns messenger.persistence.simple-kv-store + (:require [syng-im.protocol.state.storage :as st] + [messenger.persistence.realm :as r])) + +(defrecord SimpleKvStore [] + st/Storage + (put [_ key value] + (r/write + (fn [] + (r/create :kv-store {:key key + :value (str value)} true)))) + (get [_ key] + (-> (r/get-by-field :kv-store :key key) + (r/single-cljs) + (r/decode-value))) + (contains-key? [_ key] + (= 0 + (.-length (r/get-by-field :kv-store :key key)))) + (delete [_ key] + (-> (r/get-by-field :kv-store :key key) + (r/single) + (r/delete)))) + +(comment + + ) \ No newline at end of file diff --git a/src/messenger/protocol/protocol_handler.cljs b/src/messenger/protocol/protocol_handler.cljs index 447af14424..33ec6d55f4 100644 --- a/src/messenger/protocol/protocol_handler.cljs +++ b/src/messenger/protocol/protocol_handler.cljs @@ -2,12 +2,13 @@ (:require [syng-im.utils.logging :as log] [messenger.constants :refer [ethereum-rpc-url]] [messenger.comm.intercom :refer [protocol-initialized]] - [messenger.models.protocol :refer [current-identity]])) + [messenger.models.protocol :refer [current-identity]] + [messenger.state :refer [kv-store]])) (defn make-handler [] {:ethereum-rpc-url ethereum-rpc-url :identity (current-identity) - :storage nil + :storage (kv-store) :handler (fn [{:keys [event-type] :as event}] (log/info "Event:" (clj->js event)) (case event-type diff --git a/src/messenger/state.cljs b/src/messenger/state.cljs index 746d4f998c..aabebb9e74 100644 --- a/src/messenger/state.cljs +++ b/src/messenger/state.cljs @@ -38,5 +38,8 @@ (def pub-sub-path [:channels :pub-sub-publication]) (def user-notification-path [:user-notification]) (def protocol-initialized-path [:protocol-initialized]) +(def simple-store-path [:simple-store]) (defn pub-sub-publisher [app] (get-in app pub-sub-bus-path)) +(defn kv-store [] + (get-in @app-state simple-store-path)) \ No newline at end of file