server.clj

Branches > refactor/use-spec-1 > 39b3c72 > 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}))