Skip to content

Commit e1cc2c4

Browse files
committed
re-frame integration and lan-on/off functions.
``` javascript athens.core.lan_on(); ahtens.core.lan_off(); ```
1 parent bfc7e19 commit e1cc2c4

File tree

11 files changed

+442
-13
lines changed

11 files changed

+442
-13
lines changed

README.self-hosted.md

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Athens Lan Party Mode
2+
3+
## Client
4+
5+
Standard procedure for running dev client.
6+
7+
Open DevConsole.
8+
9+
**Join LanParty**
10+
11+
``` javascript
12+
athens.core.lan_on();
13+
```
14+
15+
**Leave LanParty**
16+
17+
``` javascript
18+
athens.core.lan_off();
19+
```
20+
21+
## Server
22+
23+
### Running Athens Self-Hosted Server
24+
25+
``` shell
26+
lein run
27+
```
28+
29+
This will start HTTP server on port 3010, unless you've modified `src/clj/config.edn`.
30+
31+
Also nRELP server is started on port 8877, unless you've modified `src/clj/config.edn`.
32+
33+
### Developing Athens Self-Hosted Server
34+
35+
Start REPL:
36+
37+
``` shell
38+
lein repl
39+
```
40+
41+
Start the system:
42+
43+
``` clojure
44+
(dev)
45+
(start)
46+
```
47+
48+
Same way you can start the system after `cider-jack-in`.
49+
50+
After starting HTTP & nREPL servers are running on default ports or changes in `config.edn`.
51+
52+
**Resetting the system**
53+
54+
``` clojure
55+
(reset)
56+
```
57+
58+
**Clean the Datahike DB**
59+
60+
Stop the Self-Hosted server. [ctrl+c] if using `lein run` or [ctrl+d] if repl.
61+
By default Datahike DB is stored in `/tmp/exmaple`, remove this forlder
62+
start the srever and Bob's your unkle.

dev/cljs/user.cljs

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#_{:clj-kondo/ignore [:unused-namespace
2+
:unused-referred-var]}
3+
4+
15
(ns cljs.user
26
"Commonly used symbols for easy access in the ClojureScript REPL during
37
development."
@@ -6,3 +10,4 @@
610
find-doc print-doc pst source)]
711
[clojure.pprint :refer (pprint)]
812
[clojure.string :as str]))
13+

src/clj/athens/self_hosted/components/datahike.clj

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
(ns athens.self-hosted.components.datahike
22
(:require
3+
[athens.athens-datoms :as athens-datoms]
34
[clojure.tools.logging :as log]
45
[com.stuartsierra.component :as component]
56
[datahike.api :as d]))
@@ -63,16 +64,21 @@
6364

6465
(start
6566
[component]
66-
(let [dh-conf (get-in config [:config :datahike])
67-
conf-with-schema (assoc dh-conf :initial-tx schema)]
67+
(let [dh-conf (get-in config [:config :datahike])
68+
conf-with-schema (assoc dh-conf :initial-tx schema)
69+
new-db? (atom false)]
6870
(if (d/database-exists? dh-conf)
6971
(log/info "Connecting to existing Datahike database")
7072
(do
7173
(log/info "Creating new Datahike database")
72-
(d/create-database conf-with-schema)))
74+
(d/create-database conf-with-schema)
75+
(reset! new-db? true)))
7376
(log/info "Starting Datahike connection: " dh-conf)
7477
(let [connection (d/connect conf-with-schema)]
7578
(log/debug "Datahike connected")
79+
(when @new-db?
80+
(log/debug "Populating fresh db with datoms.")
81+
(d/transact connection athens-datoms/lan-datoms))
7682
(assoc component :conn connection))))
7783

7884

src/clj/athens/self_hosted/web/presence.clj

+1-3
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@
3737
(clients/add-client! channel username)
3838
(clients/broadcast! (common-events/build-presence-online username max-tx))
3939

40-
(let [datoms (d/q '[:find ?e ?a ?v ?t ?add
41-
:where [?e ?a ?v ?t ?add]]
42-
@(:conn datahike))]
40+
(let [datoms (d/datoms @(:conn datahike) :eavt)]
4341
(log/debug channel "Sending" (count datoms) "eavt")
4442
(clients/send! channel
4543
(common-events/build-db-dump datoms max-tx)))

src/cljs/athens/athens_datoms.cljs src/cljc/athens/athens_datoms.cljc

+279
Large diffs are not rendered by default.

src/cljc/athens/common_events/schema.cljc

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@
149149
[:event/args
150150
[:map
151151
[:datoms
152-
[:set vector?]]]]])
152+
[:sequential datom]]]]])
153153

154154

155155
(def presence-online

src/cljs/athens/core.cljs

+13
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
[athens.events]
1313
[athens.listeners :as listeners]
1414
[athens.router :as router]
15+
[athens.self-hosted.client :as client]
1516
[athens.style :as style]
1617
[athens.subs]
1718
[athens.util :as util]
@@ -123,3 +124,15 @@
123124
(rf/dispatch-sync [:boot/web]))
124125
(dev-setup)
125126
(mount-root))
127+
128+
129+
(defn ^:export lan-on
130+
([] ; TODO take default from configuration
131+
(lan-on client/ws-url))
132+
([url]
133+
(rf/dispatch [:remote/connect! {:url url}])))
134+
135+
136+
(defn ^:export lan-off
137+
[]
138+
(rf/dispatch [:remote/disconnect!]))

src/cljs/athens/effects.cljs

+29
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
[cljs.core.async :refer [go <!]]
1313
[cljs.pprint :refer [pprint]]
1414
[clojure.string :as str]
15+
[com.stuartsierra.component :as component]
1516
[dat.sync.client]
1617
[datascript.core :as d]
1718
[datascript.transit :as dt]
@@ -393,6 +394,32 @@
393394
(set! (.. right-sidebar -scrollTop) 0)))))
394395

395396

397+
;; TODO: temporary, and limits to one client opened.
398+
(def self-hosted-client (atom nil))
399+
400+
401+
(reg-fx
402+
:remote/client-connect!
403+
(fn [{:keys [url] :as connection-config}]
404+
(js/console.debug ":remote/client-connect!" (pr-str connection-config))
405+
(when @self-hosted-client
406+
(js/console.log ":remote/client-connect! already connected, restarting")
407+
(component/stop @self-hosted-client))
408+
(js/console.log ":remote/client-connect! connecting")
409+
(reset! self-hosted-client (-> url
410+
client/new-ws-client
411+
component/start))))
412+
413+
414+
(reg-fx
415+
:remote/client-disconnect!
416+
(fn []
417+
(js/console.debug ":remote/client-disconnect!")
418+
(when @self-hosted-client
419+
(component/stop @self-hosted-client)
420+
(reset! self-hosted-client nil))))
421+
422+
396423
(reg-fx
397424
:remote/send-event!
398425
(fn [event]
@@ -406,3 +433,5 @@
406433
(m/explain event)
407434
(me/humanize))]
408435
(js/console.warn "Tried to send invalid event. Error:" (pr-str explanation))))))
436+
437+

src/cljs/athens/electron.cljs

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[athens.athens-datoms :as athens-datoms]
44
[athens.db :as db]
55
[athens.patterns :as patterns]
6+
[athens.self-hosted.client :as client]
67
[athens.style :refer [zoom-level-min zoom-level-max]]
78
[athens.util :as util :refer [ipcMainChannels]]
89
[cljs.reader :refer [read-string]]
@@ -502,7 +503,9 @@
502503
If the write operation succeeds, a backup is created and index.transit is overwritten.
503504
User should eventually have MANY backups files. It's their job to manage these backups :)"
504505
[copy?]
505-
(when-not @(subscribe [:socket-status])
506+
(when-not (or (client/open?)
507+
;; TODO this is part of Self-Hosted API, remove later
508+
@(subscribe [:socket-status]))
506509
(let [filepath @(subscribe [:db/filepath])
507510
data (dt/write-transit-str @db/dsdb)
508511
r (.. stream -Readable (from data))

src/cljs/athens/events.cljs

+28
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,34 @@
3737
:local-storage/set! ["db/filepath" filepath]}))
3838

3939

40+
(reg-event-fx
41+
:remote/connect!
42+
(fn [{:keys [db]} [_ connection-config]]
43+
(js/console.log ":remote/connect!" (pr-str connection-config))
44+
{:db (-> db
45+
(dissoc :db/filepath)
46+
(assoc :db/remote connection-config))
47+
:remote/client-connect! connection-config
48+
:local-storage/set! ["db/remote" connection-config]
49+
:fx [[:dispatch [:loading/set]]]}))
50+
51+
52+
(reg-event-fx
53+
:remote/connected
54+
(fn [{:keys [db]} _]
55+
(js/console.log ":remote/connected")
56+
{:db (dissoc db :db/remote)
57+
:fx [[:dispatch [:loading/unset]]]}))
58+
59+
60+
(reg-event-fx
61+
:remote/disconnect!
62+
(fn [{:keys [db]} _]
63+
{:db (dissoc db :db/remote)
64+
:remote/client-disconnect! nil
65+
:local-storage/set! ["db/remote" nil]}))
66+
67+
4068
(reg-event-db
4169
:db/sync
4270
(fn [db [_]]

src/cljs/athens/self_hosted/client.cljs

+11-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
(defn- connect-to-self-hosted!
2727
[url]
28-
(js/console.log "WS Client Connecting to:" url)
28+
(js/console.log "WSClient Connecting to:" url)
2929
(when url
3030
(doto (js/WebSocket. url)
3131
(.addEventListener "open" open-handler)
@@ -240,12 +240,13 @@
240240
:db/valueType
241241
:db/unique}
242242
;; attribute
243-
(second %)))
243+
(:a %)))
244244
;; group by entity id
245-
(group-by first)
245+
(group-by :e)
246246
(reduce (fn [acc [entity-id datoms]]
247+
(js/console.debug "reduce1:" (pr-str entity-id))
247248
(assoc acc entity-id
248-
(reduce (fn [entity [_ a v]]
249+
(reduce (fn [entity {:keys [a v]}]
249250
(assoc entity a
250251
(if (= :block/children a)
251252
(conj (:block/children entity #{})
@@ -263,8 +264,11 @@
263264
(js/console.debug "Received DB Dump")
264265
(let [entities (reconstruct-entities-from-db-dump datoms)]
265266
(js/console.debug "Reconstructed" (count entities) "entities")
266-
(d/transact! db/dsdb entities)
267+
(rf/dispatch [:reset-conn (d/empty-db db/schema)])
268+
(rf/dispatch [:transact entities])
267269
(rf/dispatch [:remote/last-seen-tx! last-tx])
270+
(rf/dispatch [:db/sync])
271+
(rf/dispatch [:remote/connected])
268272
(js/console.log "✅ Transacted DB dump. last-seen-tx" last-tx)))
269273

270274

@@ -311,6 +315,7 @@
311315
{:event/keys
312316
[id]} packet
313317
req-event (get @awaiting-response id)]
318+
(js/console.log "message-handler" (pr-str packet))
314319
(if req-event
315320
(awaited-response-handler req-event packet)
316321
(server-event-handler packet))))
@@ -359,6 +364,7 @@
359364
component)))
360365

361366

367+
;; TODO: password protection
362368
(defn new-ws-client
363369
[url]
364370
(map->WSClient {:url url}))

0 commit comments

Comments
 (0)