Skip to content

Commit 6010b4e

Browse files
committed
Sente ☯️
1 parent ca428ba commit 6010b4e

File tree

6 files changed

+131
-35
lines changed

6 files changed

+131
-35
lines changed

deps.edn

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
datascript/datascript {:mvn/version "1.2.8"}
2121

2222
;; for time-ordered UUIDs
23-
com.github.f4b6a3/uuid-creator {:mvn/version "4.1.2"}}
23+
com.github.f4b6a3/uuid-creator {:mvn/version "4.1.2"}
24+
25+
;; Sente
26+
com.taoensso/sente {:mvn/version "1.16.2"}}
2427

2528
:aliases
2629
{:cljs {:extra-paths ["src/cljs" "src/cljc"]

resources/public/js/manifest.edn

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{:module-id :main, :name :main, :output-name "main.js", :entries [reitit-db-fun.main], :depends-on nil, :sources ["goog/base.js" "goog/debug/error.js" "goog/dom/nodetype.js" "goog/asserts/asserts.js" "goog/reflect/reflect.js" "goog/math/long.js" "goog/math/integer.js" "goog/dom/asserts.js" "goog/functions/functions.js" "goog/array/array.js" "goog/dom/htmlelement.js" "goog/dom/tagname.js" "goog/object/object.js" "goog/dom/tags.js" "goog/string/typedstring.js" "goog/string/const.js" "goog/html/trustedtypes.js" "goog/html/safescript.js" "goog/fs/url.js" "goog/fs/blob.js" "goog/i18n/bidi.js" "goog/html/trustedresourceurl.js" "goog/string/internal.js" "goog/html/safeurl.js" "goog/html/safestyle.js" "goog/html/safestylesheet.js" "goog/labs/useragent/util.js" "goog/labs/useragent/browser.js" "goog/html/safehtml.js" "goog/html/uncheckedconversions.js" "goog/dom/safe.js" "goog/string/string.js" "goog/structs/structs.js" "goog/math/math.js" "goog/iter/iter.js" "goog/structs/map.js" "goog/uri/utils.js" "goog/uri/uri.js" "goog/string/stringbuffer.js" "cljs/core.cljs" "shadow/js.js" "node_modules/object-assign/index.js" "node_modules/react/cjs/react.production.min.js" "node_modules/react/index.js" "cljsjs/react.cljs" "node_modules/scheduler/cjs/scheduler.production.min.js" "node_modules/scheduler/index.js" "node_modules/react-dom/cjs/react-dom.production.min.js" "node_modules/react-dom/index.js" "cljsjs/react/dom.cljs" "clojure/set.cljs" "rum/specs.cljc" "clojure/string.cljs" "daiquiri/util.cljc" "daiquiri/normalize.cljc" "daiquiri/interpreter.cljs" "daiquiri/core.cljs" "rum/cursor.cljs" "rum/util.cljc" "rum/derived_atom.cljc" "rum/core.cljs" "reitit_db_fun/main.cljs" "shadow/module/main/append.js"]}]
1+
[{:module-id :main, :name :main, :output-name "main.js", :entries [reitit-db-fun.main], :depends-on nil, :sources ["goog/base.js" "goog/debug/error.js" "goog/dom/nodetype.js" "goog/asserts/asserts.js" "goog/reflect/reflect.js" "goog/math/long.js" "goog/math/integer.js" "goog/dom/asserts.js" "goog/functions/functions.js" "goog/array/array.js" "goog/dom/htmlelement.js" "goog/dom/tagname.js" "goog/object/object.js" "goog/dom/tags.js" "goog/string/typedstring.js" "goog/string/const.js" "goog/html/trustedtypes.js" "goog/html/safescript.js" "goog/fs/url.js" "goog/fs/blob.js" "goog/i18n/bidi.js" "goog/html/trustedresourceurl.js" "goog/string/internal.js" "goog/html/safeurl.js" "goog/html/safestyle.js" "goog/html/safestylesheet.js" "goog/labs/useragent/util.js" "goog/labs/useragent/browser.js" "goog/html/safehtml.js" "goog/html/uncheckedconversions.js" "goog/dom/safe.js" "goog/string/string.js" "goog/structs/structs.js" "goog/math/math.js" "goog/iter/iter.js" "goog/structs/map.js" "goog/uri/utils.js" "goog/uri/uri.js" "goog/string/stringbuffer.js" "cljs/core.cljs" "shadow/js.js" "node_modules/object-assign/index.js" "node_modules/react/cjs/react.production.min.js" "node_modules/react/index.js" "cljsjs/react.cljs" "node_modules/scheduler/cjs/scheduler.production.min.js" "node_modules/scheduler/index.js" "node_modules/react-dom/cjs/react-dom.production.min.js" "node_modules/react-dom/index.js" "cljsjs/react/dom.cljs" "clojure/set.cljs" "rum/specs.cljc" "clojure/string.cljs" "daiquiri/util.cljc" "daiquiri/normalize.cljc" "daiquiri/interpreter.cljs" "daiquiri/core.cljs" "rum/cursor.cljs" "rum/util.cljc" "rum/derived_atom.cljc" "rum/core.cljs" "borkdude/dynaload.cljc" "malli/sci.cljc" "malli/impl/util.cljc" "malli/impl/regex.cljc" "malli/registry.cljc" "malli/core.cljc" "malli/util.cljc" "malli/error.cljc" "ajax/protocols.cljc" "ajax/util.cljc" "ajax/url.cljc" "com/cognitect/transit/util.js" "com/cognitect/transit/delimiters.js" "com/cognitect/transit/caching.js" "com/cognitect/transit/eq.js" "com/cognitect/transit/types.js" "com/cognitect/transit/impl/decoder.js" "com/cognitect/transit/impl/reader.js" "com/cognitect/transit/handlers.js" "com/cognitect/transit/impl/writer.js" "com/cognitect/transit.js" "cognitect/transit.cljs" "clojure/walk.cljs" "ajax/interceptors.cljc" "ajax/json.cljc" "ajax/transit.cljc" "ajax/formats.cljc" "ajax/ring.cljc" "goog/promise/thenable.js" "goog/async/freelist.js" "goog/async/workqueue.js" "goog/debug/entrypointregistry.js" "goog/labs/useragent/engine.js" "goog/labs/useragent/platform.js" "goog/useragent/useragent.js" "goog/dom/browserfeature.js" "goog/math/coordinate.js" "goog/math/size.js" "goog/dom/dom.js" "goog/async/nexttick.js" "goog/async/run.js" "goog/promise/resolver.js" "goog/promise/promise.js" "goog/disposable/idisposable.js" "goog/disposable/disposable.js" "goog/debug/errorcontext.js" "goog/debug/debug.js" "goog/events/browserfeature.js" "goog/events/eventid.js" "goog/events/event.js" "goog/events/eventtype.js" "goog/events/browserevent.js" "goog/events/listenable.js" "goog/events/listener.js" "goog/events/listenermap.js" "goog/log/log.js" "goog/debug/logger.js" "goog/structs/simplepool.js" "goog/debug/tracer.js" "goog/debug/errorhandler.js" "goog/events/eventhandler.js" "goog/events/eventwrapper.js" "goog/events/events.js" "goog/events/eventtarget.js" "goog/timer/timer.js" "goog/json/json.js" "goog/json/hybrid.js" "goog/net/errorcode.js" "goog/net/eventtype.js" "goog/net/httpstatus.js" "goog/net/xhrlike.js" "goog/net/xmlhttpfactory.js" "goog/net/wrapperxmlhttpfactory.js" "goog/net/xmlhttp.js" "goog/net/xhrio.js" "ajax/simple.cljc" "ajax/easy.cljc" "goog/structs/queue.js" "goog/structs/collection.js" "goog/structs/set.js" "goog/structs/pool.js" "goog/structs/node.js" "goog/structs/heap.js" "goog/structs/priorityqueue.js" "goog/structs/prioritypool.js" "goog/net/xhriopool.js" "goog/net/xhrmanager.js" "ajax/xhrio.cljs" "ajax/xml_http_request.cljs" "ajax/core.cljc" "reitit_db_fun/validations.cljc" "cljs/tools/reader/impl/utils.cljs" "cljs/tools/reader/reader_types.cljs" "cljs/tools/reader/impl/inspect.cljs" "cljs/tools/reader/impl/errors.cljs" "cljs/tools/reader/impl/commons.cljs" "cljs/tools/reader.cljs" "cljs/tools/reader/edn.cljs" "cljs/reader.cljs" "clojure/data.cljs" "me/tonsky/persistent_sorted_set/arrays.cljc" "me/tonsky/persistent_sorted_set.cljs" "datascript/db.cljc" "datascript/pull_parser.cljc" "datascript/pull_api.cljc" "clojure/edn.cljs" "datascript/serialize.cljc" "datascript/lru.cljc" "datascript/impl/entity.cljc" "datascript/parser.cljc" "datascript/query.cljc" "datascript/core.cljc" "reitit_db_fun/db.cljs" "reitit_db_fun/main.cljs" "shadow/module/main/append.js"]}]

shadow-cljs.edn

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
:dependencies [[rum/rum "0.12.8"]
88
[datascript/datascript "1.2.8"]
99
[metosin/malli "0.6.2"]
10-
[cljs-ajax "0.8.4"]]
10+
[cljs-ajax "0.8.4"]
11+
;; Sente
12+
[com.taoensso/sente "1.16.2"]]
1113

1214
:builds
1315
{:app

src/clj/reitit_db_fun/main.clj

+94-21
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
[reitit.ring :as ring]
77
[muuntaja.core :as m]
88
[reitit.ring.middleware.muuntaja :as muuntaja]
9+
[reitit.ring.middleware.parameters]
10+
911
[reitit.coercion.malli]
1012
[reitit.coercion :as coercion]
1113
[clojure.tools.logging :as log]
@@ -33,10 +35,71 @@
3335

3436
;; Datascript
3537
[datascript.core :as d]
36-
[datascript.db :as db]))
38+
[datascript.db :as db]
39+
40+
;; core.async
41+
[clojure.core.async :as async]
42+
;;Sente
43+
[taoensso.sente :as sente]
44+
;; TODO [ring.middleware.anti-forgery :refer [wrap-anti-forgery]] ; <--- Recommended
45+
[ring.middleware.keyword-params]
46+
[ring.middleware.params]
47+
[ring.middleware.session]
48+
[taoensso.sente.server-adapters.aleph :refer [get-sch-adapter]]
49+
))
50+
51+
;; Sente stuff
52+
(defonce sente-state
53+
(let [{:keys [ch-recv send-fn connected-uids
54+
ajax-post-fn ajax-get-or-ws-handshake-fn]}
55+
(sente/make-channel-socket-server! (get-sch-adapter) {:csrf-token-fn nil})]
56+
{:ring-ajax-post ajax-post-fn
57+
:ring-ajax-get-or-ws-handshake ajax-get-or-ws-handshake-fn
58+
:ch-chsk ch-recv ; ChannelSocket's receive channel
59+
:chsk-send! send-fn ; ChannelSocket's send API fn
60+
:connected-uids connected-uids} ; Watchable, read-only atom
61+
))
62+
63+
(def ring-ajax-post (:ring-ajax-post sente-state))
64+
(def ring-ajax-get-or-ws-handshake (:ring-ajax-get-or-ws-handshake sente-state))
65+
(def ch-chsk (:ch-chsk sente-state)) ; ChannelSocket's receive channel
66+
(def chsk-send! (:chsk-send! sente-state)) ; ChannelSocket's send API fn
67+
(def connected-uids (:connected-uids sente-state)) ; Watchable, read-only atom
68+
69+
(defmulti event-msg-handler
70+
"Multimethod to handle Sente `event-msg`s"
71+
:id)
72+
73+
(defmethod event-msg-handler :dafault
74+
[{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}]
75+
(log/info "Unmathed msg handler for event:" event)
76+
(when ?reply-fn
77+
(?reply-fn {:umatched-event-as-echoed-from-server event})))
78+
79+
(defmethod event-msg-handler :article/save!
80+
[{:as ev-msg :keys [event id ?data ring-req ?reply-fn send-fn]}]
81+
(log/info "Saving article" event)
82+
(when ?reply-fn
83+
(?reply-fn {:saving event})))
84+
85+
86+
(comment
87+
;;to zwraca stop-fn więc umieścić w komponencie integranta!
88+
;; i na halt-key wywołać (stop-fn)
89+
(def sente-router-not-yet-ig
90+
(sente/start-server-chsk-router! ch-chsk event-msg-handler))
91+
92+
;; żeby zatrzymać handler
93+
(sente-router-not-yet-ig)
94+
95+
96+
)
97+
98+
3799

38-
;; ==== Config ====
39100

101+
102+
;; ==== Config ====
40103
(def config {:app/handler {:keys-to-wrap
41104
{:model (ig/ref :model/article-sql)}}
42105

@@ -70,28 +133,38 @@
70133
(defn get-app-handler [{:keys [keys-to-wrap]}]
71134
(ring/ring-handler
72135
(ring/router
73-
["/api"
74-
["/articles"
75-
{:get get-articles-handler}]
76-
["/article"
77-
{:post update-article-handler}]
78-
["/article/:article-id"
79-
{:get get-article-handler}]
80-
["/ping"
81-
{:get {:handler (fn [req]
82-
{:status 200
83-
:body {:message "pong"
84-
:request (pr-str req)}})}}]
85-
["/status"
86-
{:get {:handler (fn [req]
87-
{:status 200
88-
:body {:message "status"
89-
:model (pr-str (:model req))}})}}]]
136+
[
137+
["/api"
138+
["/articles"
139+
{:get get-articles-handler}]
140+
["/article"
141+
{:post update-article-handler}]
142+
["/article/:article-id"
143+
{:get get-article-handler}]
144+
["/ping"
145+
{:get {:handler (fn [req]
146+
{:status 200
147+
:body {:message "pong"
148+
:request (pr-str req)}})}}]
149+
["/status"
150+
{:get {:handler (fn [req]
151+
{:status 200
152+
:body {:message "status"
153+
:model (pr-str (:model req))}})}}]]
154+
;; Sente
155+
["/chsk" {:get {:handler ring-ajax-get-or-ws-handshake}
156+
:post {:handler ring-ajax-post}}]]
90157
;; router data affecting all routes
91158
{:data {:muuntaja m/instance
92-
:middleware [muuntaja/format-middleware
159+
:middleware [
160+
ring.middleware.session/wrap-session
161+
reitit.ring.middleware.parameters/parameters-middleware
162+
ring.middleware.keyword-params/wrap-keyword-params
163+
164+
muuntaja/format-middleware
93165
muuntaja/format-response-middleware
94-
(wrap-keys keys-to-wrap)]}})
166+
(wrap-keys keys-to-wrap)
167+
]}})
95168
(ring/routes
96169
(ring/create-resource-handler {:path "/"})
97170
(ring/create-default-handler))))

src/cljs/reitit_db_fun/client.cljs

+27-10
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,35 @@
11
(ns reitit-db-fun.client
2-
(:require [clojure.core.async :as async]))
2+
(:require [clojure.core.async :as async
3+
:refer [go go-loop <! >! put! chan]]
4+
[taoensso.sente :as sente :refer [cb-success?]]))
35

4-
(def test-chan (async/chan))
6+
;;TODO
7+
(def ?csrf-token
8+
(when-let [el (.getElementById js/document "sente-csrf-token")]
9+
(.getAttribute el "data-csrf-token")))
510

6-
(async/go-loop []
7-
(when-some [d (async/<! test-chan)]
8-
(println d)
9-
(recur)))
1011

11-
(comment
12+
(defonce sente-state
13+
(let [{:keys [chsk ch-recv send-fn state]}
14+
(sente/make-channel-socket-client! "/chsk" ?csrf-token {:type :auto})]
15+
{
16+
:chsk chsk
17+
:ch-chsk ch-recv ; ChannelSocket's receive channel
18+
:chsk-send! send-fn ; ChannelSocket's send API fn
19+
:chsk-state state} ; Watchable, read-only atom
20+
))
21+
22+
(def chsk (:chsk sente-state))
23+
(def ch-chsk (:ch-chsk sente-state)) ; ChannelSocket's receive channel
24+
(def chsk-send! (:chsk-send! sente-state)) ; ChannelSocket's send API fn
25+
(def chsk-state (:chsk-state sente-state)) ; Watchable, read-only atom
26+
1227

13-
(async/go
14-
(async/>! test-chan "test1"))
1528

16-
(async/close! test-chan)
29+
(comment
30+
(chsk-send! [:article/save! {:test7 "Hello from frontend!"}]
31+
1000)
32+
33+
(+ 1 1)
1734

1835
)

src/cljs/reitit_db_fun/main.cljs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
[reitit-db-fun.validations :as v]
88

99
[reitit-db-fun.db :refer [conn]]
10-
[datascript.core :as ds]))
10+
[datascript.core :as ds]
11+
[reitit-db-fun.client]))
1112

1213
(defn entities-for-attr [db attribute]
1314
(->> (ds/datoms db :aevt attribute)

0 commit comments

Comments
 (0)