minecraft_server.clj

Bowmap · bowmap.git · Tickets

Branches > main > c9bd266 > files / src / net / bowmap / server / network / minecraft_server.clj

(ns net.bowmap.server.network.minecraft-server
  (:require
   [clojure.core.async :refer [>!! chan close! io-thread]]
   [net.bowmap.server.network.connection :as connection])
  (:import
   [java.net ServerSocket]))

(defn server
  "Starts a Minecraft server at the supplied port and optional bind address.
   Returns a channel of connections that is coupled to the server's lifecycle."
  [& {:keys! [port] :keys [bind-addr backlog] :or {:backlog 50}}]
  (let [server-socket (ServerSocket. port backlog bind-addr)
        connection-chan (chan backlog)]
    (io-thread
      (try
        (loop []
          (when (>!! connection-chan (connection/connection (ServerSocket/.accept server-socket)))
            (recur)))
        (finally
          (close! connection-chan)
          (ServerSocket/.close server-socket))))
    connection-chan))