#10: adding datascript to the cljs example app

This commit is contained in:
anatoly 2015-12-07 13:16:53 -05:00
parent 03f13d1b71
commit d1d14bc710
9 changed files with 57 additions and 30 deletions

3
.gitignore vendored
View file

@ -4,8 +4,7 @@
pom.xml pom.xml
pom.xml.asc pom.xml.asc
.repl* .repl*
/dev-resources /dev-resources/resources/public/js/*
/test/resources/public/js
figwheel_server.log figwheel_server.log
*.jar *.jar
*.class *.class

View file

@ -10,7 +10,8 @@
[org.clojure/clojurescript "1.7.170"]] [org.clojure/clojurescript "1.7.170"]]
:profiles {:dev {:source-paths ["dev" "test/app"] :profiles {:dev {:source-paths ["dev" "test/app"]
:dependencies [[ch.qos.logback/logback-classic "1.1.3"] :dependencies [[datascript "0.13.3"]
[ch.qos.logback/logback-classic "1.1.3"]
[org.clojure/tools.logging "0.3.1"] [org.clojure/tools.logging "0.3.1"]
[robert/hooke "1.3.0"] [robert/hooke "1.3.0"]
[org.clojure/tools.namespace "0.2.11"] [org.clojure/tools.namespace "0.2.11"]
@ -28,16 +29,15 @@
{:source-paths ["src" "test"] {:source-paths ["src" "test"]
:figwheel true :figwheel true
:compiler {:main mount.example.cljs :compiler {:main mount.example.app
:asset-path "js/compiled/out" :asset-path "js/compiled/out"
:output-to "test/resources/public/js/compiled/mount.js" :output-to "dev-resources/public/js/compiled/mount.js"
:output-dir "test/resources/public/js/compiled/out" :output-dir "dev-resources/public/js/compiled/out"
:optimizations :none :optimizations :none
:source-map true :source-map true
:source-map-timestamp true :source-map-timestamp true}}
:cache-analysis true}}
:prod :prod
{:source-paths ["src" "test"] {:source-paths ["src" "test"]
:compiler {:output-to "test/resources/public/js/compiled/mount.js" :compiler {:output-to "dev-resources/public/js/compiled/mount.js"
:optimizations :advanced :optimizations :advanced
:pretty-print false}}}}}}) :pretty-print false}}}}}})

View file

@ -1,5 +1,4 @@
(ns #?(:clj mount.core (ns mount.core
:cljs ^:figwheel-no-load mount.core)
#?(:clj (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro]) #?(:clj (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro])
:cljs (:require [mount.tools.macro :as macro] :cljs (:require [mount.tools.macro :as macro]
[mount.tools.cljs :as cljs])) [mount.tools.cljs :as cljs]))

View file

@ -0,0 +1,16 @@
(ns mount.example.app
(:require [mount.core :as mount]
[mount.example.app-config]
[mount.example.websockets]
[mount.example.audit-log :refer [log find-all-logs]]))
(defn show-log []
(.write js/document
(interpose "<br/>" (find-all-logs log))))
(mount/start)
;; time for websocket to connect
(js/setTimeout #(do (mount/stop-except "#'mount.example.audit-log/log")
(show-log)) 500)

View file

@ -1,8 +1,9 @@
(ns mount.example.app-config (ns mount.example.app-config
(:require [mount.example.audit-log :refer [audit log]])
(:require-macros [mount.core :refer [defstate]])) (:require-macros [mount.core :refer [defstate]]))
(defn load-config [path] (defn load-config [path]
(println "loading config from " path " (at least pretending)") (audit log :app-config "loading config from '" path "' (at least pretending)")
{:system-a {:uri "ws://echo.websocket.org/"}}) {:system-a {:uri "ws://echo.websocket.org/"}})
(defstate config :start (load-config "resources/config.end")) (defstate config :start (load-config "resources/config.end"))

View file

@ -0,0 +1,24 @@
(ns mount.example.audit-log
(:require [datascript.core :as d])
(:require-macros [mount.core :refer [defstate]]))
(defstate log :start (d/create-conn {}))
(defn audit [db source & msg]
(d/transact! @db [{:db/id -1
:source source
:timestamp (js/Date.)
:msg (apply str msg)}]))
(defn find-source-logs [db source]
(d/q '{:find [?t ?msg]
:in [$ ?s]
:where [[?e :source ?s]
[?e :timestamp ?t]
[?e :msg ?msg]]}
@@db source))
(defn find-all-logs [db]
(->> (map :e (d/datoms @@db :aevt :timestamp))
dedupe
(d/pull-many @@db '[:timestamp :source :msg])))

View file

@ -1,13 +0,0 @@
(ns mount.example.cljs
(:require [mount.core :as mount]
[mount.example.websockets :refer [system-a]]))
(enable-console-print!)
(println "(mount/start)" (mount/start))
(println "system-a: " @system-a)
;; time for websocket to connect
(js/setTimeout #(println "(mount/stop)" (mount/stop))
500)

View file

@ -1,16 +1,17 @@
(ns mount.example.websockets (ns mount.example.websockets
(:require [mount.example.app-config :refer [config]]) (:require [mount.example.app-config :refer [config]]
[mount.example.audit-log :refer [audit log]])
(:require-macros [mount.core :refer [defstate]])) (:require-macros [mount.core :refer [defstate]]))
(defn connect [uri] (defn connect [uri]
(println "connecting to " uri) (audit log :system-a "connecting to '" uri "'")
(let [ws (js/WebSocket. uri)] (let [ws (js/WebSocket. uri)]
(set! (.-onopen ws) #(println "opening ws @" uri)) (set! (.-onopen ws) #(audit log :system-a "opening ws @" uri))
(set! (.-onclose ws) #(println "closing ws @" uri)) (set! (.-onclose ws) #(audit log :system-a "closing ws @" uri))
ws)) ws))
(defn disconnect [ws] (defn disconnect [ws]
(println "disconnecting " @ws) (audit log "disconnecting " @ws)
(.close @ws)) (.close @ws))
(defstate system-a :start (connect (get-in @config [:system-a :uri])) (defstate system-a :start (connect (get-in @config [:system-a :uri]))