diff --git a/src/cljx/grub/state.cljx b/src/cljx/grub/state.cljx index 9a980b5..f4921e7 100644 --- a/src/cljx/grub/state.cljx +++ b/src/cljx/grub/state.cljx @@ -7,8 +7,8 @@ ;; Server state (def states (atom [])) -(defn make-agent - ([in out states] (make-agent in out states sync/empty-state)) +(defn make-server-agent + ([in out states] (make-server-agent in out states sync/empty-state)) ([in out states initial-client-state] (a/go-loop [client-state initial-client-state] (when-let [msg (! out (message/diff-msg diff hash))) (recur client-state)))))) +(defn make-client-agent + ([in out states] (make-client-agent in out states sync/empty-state)) + ([in out states initial-server-state] + (a/go-loop [server-state initial-server-state] + (when-let [msg (! out (message/full-sync state)) + (recur state)))) + + :full-sync + (let [state (:state msg)] + (reset! states [state]) + (recur state)) + + :new-state + (let [{:keys [diff hash]} (sync/diff-states (:new-states msg) server-state)] + (>! out (message/diff-msg diff hash))) + (recur server-state)))))) + ;; TODO: Remove watch, close up channels properly (defn sync-new-client! [>client client states))) + (make-server-agent client-events >client states))) (defn init [to-db grubs recipes] (reset! states (sync/initial-state grubs recipes)) diff --git a/src/test/grub/test/unit/state.clj b/src/test/grub/test/unit/state.clj index c124d14..186229f 100644 --- a/src/test/grub/test/unit/state.clj +++ b/src/test/grub/test/unit/state.clj @@ -21,7 +21,7 @@ :hash (:hash (first states))} in (chan 1) out (chan 1)] - (state/make-agent in out states*) + (state/make-server-agent in out states*) (>!! in msg) (let [diff-response (!! in msg) (let [diff-response (!! in msg) (let [diff-response (!! in msg) (let [diff-response (!! in msg) (let [diff-response (