frame.clj

Branches > main > 39b3c72 > files / src / net / bowmap / network / packet / frame.clj

(ns net.bowmap.network.packet.frame
  (:require
   [net.bowmap.network.packet.read :as read])
  (:import
   [io.netty.buffer ByteBuf Unpooled]))

(defn packet-framer-xf
  "Transducer that frames bytes from incoming byte arrays and outputs ByteBufs of
   framed serialized serverbound packets."
  [rf]
  (let [buf (Unpooled/buffer)]
    (fn
      ([] (rf))
      ([res] (rf res))
      ([res input]
       (ByteBuf/.writeBytes buf input)
       (loop [res res]
         (if (read/can-read-packet? buf)
           (let [len (read/->varint buf)
                 res' (rf res (ByteBuf/.copy (ByteBuf/.readRetainedSlice buf len)))]
             (ByteBuf/.discardReadBytes buf)
             (recur res'))
           res))))))