server.clj

Bowmap · bowmap.git · Tickets

Branches > main > 81fab7e > files / src / net / bowmap / server / network / server.clj

(ns net.bowmap.server.network.server
  (:require
   [clojure.spec.alpha :as s]
   [net.bowmap.server.network.connection :as connection])
  (:import
   [java.net ServerSocket]))

(defprotocol Server
  (accept-connection!! [server]
    "Accepts and returns a Connection from the server.
     Blocks until the connection is ready.
     Throws if a connection cannot be received from the server."))

(s/def ::server #(satisfies? Server %))

(defn start-server!
  [& {:keys [port bind-addr backlog] :or {:backlog 50 :port 0}}]
  (let [server-socket (ServerSocket. port backlog bind-addr)]
    (reify Server
      (accept-connection!! [_]
        (try
          (connection/connection (ServerSocket/.accept server-socket))
          (catch Throwable t
            (ServerSocket/.close server-socket)
            (throw t)))))))