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