server.clj
Branches > refactor/use-spec-1 > 2eb109b > files / src / net / bowmap / network / server.clj
(ns net.bowmap.network.server
(:require
[aleph.tcp :as tcp]
[clojure.core.async :refer [chan]]
[manifold.stream :as s]
[net.bowmap.network.packet.frame :as frame])
(:import
[io.netty.bootstrap ServerBootstrap]
[io.netty.channel ChannelOption]))
(defn- handle-client [handler stream info]
(let [packets-in (chan 1 frame/packet-framer-xf)
packets-out (chan)]
(s/connect stream packets-in)
(s/connect packets-out stream)
(handler packets-in packets-out)))
(defn start-server!
"Starts a Minecraft server at the port, passing clients into the instance."
[& {:keys [port handler]}]
(tcp/start-server (fn [stream info]
(handle-client handler stream info))
{:port port
:bootstrap-transform #(ServerBootstrap/.childOption % ChannelOption/TCP_NODELAY true)}))