524e938

Branches > refactor/use-spec-1 > 524e938 > files / src

Send reponse packets to the client

Grahp, 2026-02-26

Commit: 524e93814326fb94360e97197b5d2f92a3625827
Parent: adaa9ca

1 changed file:

src/net/bowmap/core.clj modified (view file)

@@ -11,30 +11,38 @@    [io.netty.buffer ByteBuf Unpooled]    [io.netty.channel ChannelOption])) +(defn print-bb [bb]+  (subvec (vec (.array bb))+          (.readerIndex bb)+          (.writerIndex bb)))+ ;; Document why parsing and handling are done synchronously-(defn read-packet! [bs client]-  (let [{::keys [buf]} @client+(defn read-packet! [client bs]+  (let [{::keys [buf stream]} client         buf (ByteBuf/.writeBytes buf bs)]-    (while (read/can-read-packet? buf)-      (prn [(subvec (vec (.array buf))-                    (.readerIndex buf)-                    (.writerIndex buf))-            (::state/state @client)])-      ;; TODO handle exceptions?-      (let [{:keys [::state/state response]} (handle-packet (sp/decode-packet! buf (::state/state @client))-                                                            client)]-        (when state-          (vswap! client assoc ::state/state state))-        (when response-          ;; TODO this can also throw...-          (encode-packet! response (::state/state @client))))-      (ByteBuf/.discardReadBytes buf))))+    (loop [client client]+      (if (read/can-read-packet? buf)+        (let [{:keys [::state/state response]}+              (handle-packet (sp/decode-packet! buf (::state/state client))+                             client)+              client (cond-> client state (assoc ::state/state state))]+          (when response+            ;; TODO this can also throw...+            (let [pk (encode-packet! response (::state/state client))]+              (prn "response packet:" (print-bb pk))+              (s/put! stream pk)))+          (ByteBuf/.discardReadBytes buf)+          (recur client))+        client))))  (defn client-handler [s _]-  (let [client (volatile! {::state/state ::state/handshaking-                           ::buf (Unpooled/buffer)})]-    (s/consume (fn [bs] (read-packet! bs client))-               s)))+  (let [client {::state/state ::state/handshaking+                ::buf (Unpooled/buffer)+                ::stream s}]+    (s/reduce (fn [client bs]+                (read-packet! client bs))+              client+              s)))  (defn start-server! []   (tcp/start-server #'client-handler