use async api

This commit is contained in:
michaelr 2016-03-06 20:30:13 +02:00
parent da5d0c9029
commit e0e60592f0
3 changed files with 68 additions and 35 deletions

View File

@ -27,21 +27,24 @@
(defn start []
(let [rpc-url (-> (g/getElement "rpc-url")
(f/getValue))
{identity :identity}
(p/init-protocol
{:ethereum-rpc-url rpc-url
:handler (fn [{:keys [event-type] :as event}]
(log/info "Event:" (clj->js event))
(case event-type
:new-msg (let [{:keys [from payload]} event
{content :content} payload]
(add-to-chat from content))
:msg-acked (let [{:keys [msg-id]} event]
(add-to-chat ":" (str "Message " msg-id " was acked")))
(add-to-chat ":" (str "Don't know how to handle " event-type))))})]
(-> (g/getElement "my-identity")
(f/setValue identity))
(f/getValue))]
(p/init-protocol
{:ethereum-rpc-url rpc-url
:handler (fn [{:keys [event-type] :as event}]
(log/info "Event:" (clj->js event))
(case event-type
:new-msg (let [{:keys [from payload]} event
{content :content} payload]
(add-to-chat from content))
:msg-acked (let [{:keys [msg-id]} event]
(add-to-chat ":" (str "Message " msg-id " was acked")))
:initialized (let [{:keys [identity]} event]
(add-to-chat ":" (str "Initialized, identity is " identity))
(-> (g/getElement "my-identity")
(f/setValue identity)))
:delivery-failed (let [{:keys [msg-id]} event]
(add-to-chat ":" (str "Delivery of message " msg-id " failed")))
(add-to-chat ":" (str "Don't know how to handle " event-type))))})
(e/listen (-> (g/getElement "msg")
(goog.events.KeyHandler.))
key-handler-events/KEY
@ -91,6 +94,12 @@
;(def user2-ident (p/new-identity web3-2))
;(p/make-whisper-msg web3-2 user2-ident user1-ident "Hello World!")
(require '[cljs-tests.protocol.whisper :as w])
(def web3 (w/make-web3 "http://localhost:4546"))
(.newIdentity (w/whisper web3) (fn [error result]
(println error result)))
)
(comment

View File

@ -1,8 +1,11 @@
(ns cljs-tests.protocol.api
(:require [cljs-tests.protocol.state.state :as state]
(:require [cljs.core.async :refer [<! timeout]]
[cljs-tests.protocol.state.state :as state]
[cljs-tests.protocol.delivery :as delivery]
[cljs-tests.protocol.state.delivery :as delivery-state]
[cljs-tests.protocol.whisper :as whisper]))
[cljs-tests.protocol.whisper :as whisper]
[cljs-tests.protocol.handler :as h])
(:require-macros [cljs.core.async.macros :refer [go]]))
(def default-content-type "text/plain")
@ -21,7 +24,7 @@
:event-type can be:
:new-msg - [from payload]
:error - [error-msg]
:error - [error-msg details]
:msg-acked [msg-id]
:delivery-failed [msg-id]
@ -29,14 +32,15 @@
"
[{:keys [handler ethereum-rpc-url identity]}]
(state/set-handler handler)
(let [connection (create-connection ethereum-rpc-url)
identity (or identity
(create-identity connection))]
(state/set-connection connection)
(state/set-identity identity)
(whisper/listen connection)
(delivery/start-delivery-loop)
{:identity identity}))
(go
(let [connection (create-connection ethereum-rpc-url)
identity (or identity
(<! (create-identity connection)))]
(state/set-connection connection)
(state/set-identity identity)
(whisper/listen connection)
(delivery/start-delivery-loop)
(h/invoke-handler :initialized {:identity identity}))))
(defn send-user-msg [{:keys [to content]}]
(let [{:keys [msg-id msg] :as new-msg} (whisper/make-msg {:from (state/my-identity)

View File

@ -1,11 +1,13 @@
(ns cljs-tests.protocol.whisper
(:require [cljsjs.web3]
(:require [cljs.core.async :refer [chan put! close! <!]]
[cljsjs.web3]
[cljsjs.chance]
[cljs-tests.utils.logging :as log]
[cljs-tests.protocol.state.state :as state]
[cljs-tests.protocol.state.delivery :as delivery]
[cljs-tests.protocol.handler :as handler]
[cljs.reader :refer [read-string]]))
[cljs.reader :refer [read-string]])
(:require-macros [cljs.core.async.macros :refer [go]]))
(def syng-app-topic "SYNG-APP-CHAT-TOPIC")
(def syng-msg-ttl 100)
@ -27,8 +29,22 @@
(->> (js/Web3.providers.HttpProvider. rpc-url)
(js/Web3.)))
(defn make-callback [{:keys [error-msg result-channel]}]
(fn [error result]
(if error
(do
(log/error (str error-msg ":") error)
(handler/invoke-handler :error {:error-msg error-msg
:details error}))
(put! result-channel result))
(close! result-channel)))
(defn new-identity [web3]
(.newIdentity (.-shh web3)))
(let [result-channel (chan)
callback (make-callback {:error-msg "Call to newIdentity failed"
:result-channel result-channel})]
(.newIdentity (.-shh web3) callback)
result-channel))
(defn handle-ack [{:keys [ack-msg-id]}]
(log/info "Got ack for message:" ack-msg-id)
@ -39,7 +55,12 @@
(let [js-msg (clj->js msg)]
(log/info "Sending whisper message:" js-msg)
(-> (whisper web3)
(.post js-msg))))
(.post js-msg (fn [error result]
(when error
(let [error-msg "Call to shh.post() failed"]
(log/error (str error-msg ":") error)
(handler/invoke-handler :error {:error-msg error-msg
:details error}))))))))
(defn make-msg
"Returns [msg-id msg], `msg` is formed for Web3.shh.post()"
@ -92,11 +113,10 @@
[web3]
(let [topics [syng-app-topic]
shh (whisper web3)
filter (.filter shh (make-topics topics))
watch (.watch filter (fn [error msg]
(if error
(handler/invoke-handler :error {:error-msg error})
(handle-arriving-whisper-msg web3 msg))))]
filter (.filter shh (make-topics topics) (fn [error msg]
(if error
(handler/invoke-handler :error {:error-msg error})
(handle-arriving-whisper-msg web3 msg))))]
(state/add-filter topics filter)))
(defn stop-listener [filter]