persistent storage for simple chat app

This commit is contained in:
michaelr 2016-04-11 16:43:39 +03:00
parent a416bf279d
commit 8a1d690518
3 changed files with 33 additions and 19 deletions

View File

@ -44,7 +44,7 @@
(defn init-protocol
"Required [handler ethereum-rpc-url storage]
Optional [whisper-identity - if not passed a new identity is created automatically
Optional [identity - if not passed a new identity is created automatically
active-group-ids - list of active group ids]
(fn handler [{:keys [event-type...}])
@ -58,7 +58,7 @@
:delivery-failed [msg-id]
:new-group-chat [from group-id]
:group-chat-invite-acked [ack-msg-id from group-id]
:group-new-participant [identity group-id]
:group-new-participant [identity group-id from msg-id]
:group-removed-participant [from identity group-id]
:removed-from-group [from group-id]
:participant-left-group [from group-id]

View File

@ -93,7 +93,8 @@
(add-identity store group-topic identity)
(invoke-user-handler :group-new-participant {:identity identity
:group-id group-topic
:from from})))
:from from
:msg-id msg-id})))
(log/warn "Ignoring group-new-participant for group" group-topic "from a non group-admin user" from))))
(defn handle-group-removed-participant [web3 from {:keys [keypair group-topic msg-id removed-identity]}]

View File

@ -9,7 +9,10 @@
[goog.events.KeyCodes]
[goog.events.KeyHandler]
[goog.events.KeyHandler.EventType :as key-handler-events]
[syng-im.protocol.state.storage :as st])
[syng-im.protocol.state.storage :as st]
[goog.storage.Storage :as gstore]
[goog.storage.mechanism.HTML5LocalStorage :as html5localstore]
[cljs.reader :refer [read-string]])
(:import [goog.events EventType]
[goog.events KeyCodes]))
@ -21,20 +24,25 @@
;; (swap! app-state update-in [:__figwheel_counter] inc)
)
(defrecord MapStore [m]
(defn local-storage []
(let [mech (goog.storage.mechanism.HTML5LocalStorage.)
store (goog.storage.Storage. mech)]
store))
(defrecord MapStore [local prefix]
st/Storage
(put [this key value]
(swap! m assoc key value))
(get [this key]
(get @m key))
(put [_ key value]
(.set local (str prefix key) (pr-str value)))
(get [_ key]
(some-> (.get local (str prefix key))
(read-string)))
(contains-key? [this key]
(contains? @m key))
(delete [this key]
(swap! m dissoc key)))
(st/get this key))
(delete [_ key]
(.remove local (str prefix key))))
(defonce state (atom {:group-id nil
:group-identities nil
:storage (map->MapStore {:m (atom {})})}))
:group-identities nil}))
(defn shorten [s]
(subs s 0 6))
@ -71,11 +79,15 @@
(set-group-identities)))
(defn start []
(let [rpc-url (-> (g/getElement "rpc-url")
(f/getValue))]
(let [rpc-url (-> (g/getElement "rpc-url")
(f/getValue))
storage (map->MapStore {:local (local-storage)
:prefix rpc-url})
identity (st/get storage :identity)]
(p/init-protocol
{:ethereum-rpc-url rpc-url
:storage (:storage @state)
:storage storage
:identity identity
:handler (fn [{:keys [event-type] :as event}]
(log/info "Event:" (clj->js event))
(case event-type
@ -86,6 +98,7 @@
(add-to-chat "chat" ":" (str "Message " msg-id " was acked")))
:initialized (let [{:keys [identity]} event]
(add-to-chat "chat" ":" (str "Initialized, identity is " identity))
(st/put storage :identity identity)
(-> (g/getElement "my-identity")
(f/setValue identity)))
:delivery-failed (let [{:keys [msg-id]} event]
@ -219,8 +232,8 @@
(require '[syng-im.protocol.web3 :as w])
(def web3 (w/make-web3 "http://localhost:4546"))
(.newIdentity (w/whisper web3) (fn [error result]
(println error result)))
(.newIdentity (w/whisp er web3) (fn [error result]
(println error result)))
(.sendAsync (.-currentProvider web3)
(clj->js [{:jsonrpc "2.0" :method "shh_addIdentity" :params ["0x585493cda18f2b4314afb51224e9c1e913780642783ca11e683a66cfaa9eec94"] :id 99999999999}])