524e938
Branches > client-handling-rewrite > 524e938 > files
Send reponse packets to the client
Commit: 524e93814326fb94360e97197b5d2f92a3625827
Parent: adaa9ca
1 changed file:
src/net/bowmap/core.clj 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