server.clj
Branches > main > dd3c6ab > files / src / net / bowmap / server / network / server.clj
(ns net.bowmap.server.network.server
(:require
[clojure.core.async :refer [<!! chan io-thread put!]]
[net.bowmap.server.protocol.client :refer [apply-serverbound-frame]]
[net.bowmap.server.network.connection :as connection]
[net.bowmap.server.protocol.phase :as phase]
[net.bowmap.server.network.socket :as socket]))
(defn client-step
([_] {::phase/phase ::phase/handshaking})
([client in frame]
(case in
::connection/serverbound-frames (apply-serverbound-frame client frame))))
(defn handle-connection! [{::connection/keys! [serverbound-frames]}]
(let [serverbound-packets (chan 1024)]
(io-thread
(loop [client-state (client-step nil)]
(when-some [frame (<!! serverbound-frames)]
(let [[client' packet] (client-step client-state ::connection/serverbound-frames frame)]
(put! serverbound-packets packet)
(recur client')))))))
(defn run-server!
"Starts running the Minecraft server.
Returns a future that delivers when the server closes."
[& {:keys [& :port :bind-addr] :as args}]
(let [server (socket/server-socket args)]
(future
(loop []
(when-some [connection (<!! server)]
(handle-connection! connection)
(recur))))))