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)}))