(ns grub.websocket (:require [grub.db :as db] [org.httpkit.server :as httpkit] [clojure.core.async :as a :refer [! chan go]])) (def incoming-events (chan)) (def connected-clients (atom [])) (def ws-channel-id-count (atom 0)) (defn get-unique-ws-id [] (swap! ws-channel-id-count inc)) (defn add-connected-client! [ws-channel] (let [ws-channel-id (get-unique-ws-id) client-chan (chan)] (swap! connected-clients conj {:id ws-channel-id :channel client-chan}) [ws-channel-id client-chan])) (defn add-event-to-incoming-channel [raw-event ws-channel-id] (let [parsed-event (read-string raw-event) event (assoc parsed-event :ws-channel ws-channel-id)] (println "Received event" event) (go (>! incoming-events event)))) (defn forward-client-events-to-others [ws-channel ws-channel-id] (httpkit/on-receive ws-channel #(add-event-to-incoming-channel % ws-channel-id))) (defn forward-other-events-to-client [c ws-channel] (a/go-loop [] (let [event (! ch event))))) (defn pass-received-events-to-clients-and-db [db-chan] (let [in' (a/mult incoming-events) to-others (chan) to-database (chan)] (a/tap in' to-others) (a/tap in' to-database) (a/go-loop [] (let [event ( #(dissoc % :ws-channel) db-chan))))