1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- (ns bombnet.server
- (:require [com.stuartsierra.component :as component]
- [compojure.core :refer :all]
- [compojure.route :as route]
- [clojure.data.json :as json]
- [clojure.core.async :refer [>! >!! <! <!! alts! alts!! chan go go-loop timeout]]
- [org.httpkit.server :refer :all]
- [bombnet.manager :refer :all]))
- (defroutes app
- (GET "/" [] (ring.util.response/resource-response "index.html" {:root "public"}))
- (GET "/ws/:room" [room]
- (fn [request]
- (with-channel request channel
- (let [manager (get request ::manager)
- id (get request :query-string)
- in-ch (get-room manager room)
- out-ch (chan)]
- (>!! in-ch [:client-join {:id id :channel out-ch}])
- (go-loop []
- (send! channel (json/write-str (<! out-ch)))
- (recur))
- (on-close channel (fn [status] (>!! in-ch [:client-leave id])))
- (on-receive channel (fn [data]
- (let [parsed (json/read-str data :key-fn keyword)]
- (>!! in-ch [:message {:id id :message parsed}]))))))))
- (route/resources "/")
- (route/not-found "Not Found"))
- (defn wrap-manager
- [handler manager]
- (fn [req]
- (handler (assoc req ::manager manager))))
- (defrecord GameServer [server manager]
- component/Lifecycle
- (start [component]
- (if server
- component
- (let [handler (-> app
- (wrap-manager manager))]
- (println "Starting server")
- (assoc component :server (run-server handler {:port 8080})))))
- (stop [component]
- (if (not server)
- component
- (do
- (println "Stopping server")
- (server :timeout 100)
- (assoc component :server nil)))))
- (defn new-server []
- (component/using
- (map->GameServer {})
- [:manager]))
|