76c8f42

Bowmap · bowmap.git · Tickets

Branches > main > 76c8f42 > files

Document frames

Grahp, 2026-09-09

Commit: 76c8f4266c1bf6d85f34ca3f9a25ab7ecca9cd91
Parent: e860102

6 changed files:

src/net/bowmap/server/network/streams.clj modified (view file)

@@ -1,8 +1,9 @@ (ns net.bowmap.server.network.streams   (:require+   [net.bowmap.server.protocol.frame :refer [frame]]    [net.bowmap.server.protocol.types :refer [max-varint-size]])   (:import-   [io.netty.buffer ByteBuf Unpooled]+   [io.netty.buffer ByteBuf]    [java.io     EOFException     IOException@@ -44,7 +45,7 @@           (if (= r -1)             (throw (EOFException. "EOF while reading frame"))             (recur (+ offset r))))))-    (Unpooled/wrappedBuffer arr)))+    (frame arr)))  (defn write-frame!!   "Blocks and writes a frame to an OutputStream.

src/net/bowmap/server/protocol/frame.clj added (view file)

@@ -0,0 +1,29 @@+(ns net.bowmap.server.protocol.frame+  "A framed byte buffer containing one serialized Minecraft protocol packet.+   See https://minecraft.wiki/w/Java_Edition_protocol/Packets for the format."+  (:require+   [clojure.spec.alpha :as s]+   [net.bowmap.server.protocol.types :refer [max-varint-size]]+   [net.bowmap.server.protocol.writers :refer [varint->]])+  (:import+   [io.netty.buffer ByteBuf CompositeByteBuf Unpooled]))++(s/def ::frame #(instance? ByteBuf %))++(defn frame+  "Returns an empty frame, or a frame containing the bytes of an array."+  ([] (Unpooled/buffer))+  ([arr] (Unpooled/wrappedBuffer arr)))++(defn- composite-byte-buf+  "Returns a CompositeByteBuf containing 'bufs'."+  [& bufs]+  (-> (Unpooled/compositeBuffer (count bufs))+      (CompositeByteBuf/.addComponents true bufs)))++(defn length-prefixed+  "Returns a frame prefixed by the the varint length of the given frame."+  [frame]+  (composite-byte-buf+    (varint-> (Unpooled/buffer max-varint-size) (ByteBuf/.writerIndex frame))+    frame))

src/net/bowmap/server/protocol/packets.clj modified (view file)

@@ -1,12 +1,12 @@ (ns net.bowmap.server.protocol.packets   (:require    [net.bowmap.server.protocol.clientbound-packets :refer [clientbound-packets]]-   [net.bowmap.server.protocol.readers :as readers]-   [net.bowmap.server.protocol.types :refer [frame]]-   [net.bowmap.server.protocol.writers :as writers]+   [net.bowmap.server.protocol.frame :refer [frame length-prefixed]]    [net.bowmap.server.protocol.packet :as packet]    [net.bowmap.server.protocol.phase :as phase]-   [net.bowmap.server.protocol.serverbound-packets :refer [serverbound-packets]]))+   [net.bowmap.server.protocol.readers :as readers]+   [net.bowmap.server.protocol.serverbound-packets :refer [serverbound-packets]]+   [net.bowmap.server.protocol.writers :as writers]))  (defn- find-indexed   "Takes a seq of pairs and returns both the index of the first pair@@ -25,7 +25,7 @@   (let [schemas (clientbound-packets phase)         [numeric-id schema] (find-indexed id schemas)         payload-writer (writers/to-writer schema)]-    (writers/length-prefixed+    (length-prefixed       (-> (frame)           (writers/varint-> numeric-id)           (payload-writer packet)))))

src/net/bowmap/server/protocol/readers.clj modified (view file)

@@ -1,5 +1,6 @@ (ns net.bowmap.server.protocol.readers-  "Functions for reading values from frames.+  "Functions for reading values from io.netty.ByteBufs.+   Buffers are assumed to be properly framed and contain exactly 1 packet.    Functions look like ->type, where 'type' is a Minecraft protocol type.    See https://minecraft.wiki/w/Java_Edition_protocol/Packets#Data_types"   (:require

src/net/bowmap/server/protocol/types.clj modified (view file)

@@ -1,8 +1,3 @@-(ns net.bowmap.server.protocol.types-  (:import-   [io.netty.buffer Unpooled]))+(ns net.bowmap.server.protocol.types)  (def max-varint-size 5)--(defn frame []-  (Unpooled/buffer))

src/net/bowmap/server/protocol/writers.clj modified (view file)

@@ -1,12 +1,11 @@ (ns net.bowmap.server.protocol.writers-  "Functions for writing values into frames.+  "Functions for writing values into io.netty.ByteBufs.    Functions look like type->, where 'type' is a Minecraft protocol type.    See https://minecraft.wiki/w/Java_Edition_protocol/Packets#Data_types"   (:require-   [clojure.data.json :as json]-   [net.bowmap.server.protocol.types :refer [max-varint-size]])+   [clojure.data.json :as json])   (:import-   [io.netty.buffer ByteBuf CompositeByteBuf Unpooled]+   [io.netty.buffer ByteBuf]    [java.nio.charset Charset]))  (def byte-> ByteBuf/.writeByte)@@ -41,13 +40,6 @@   (json-> buf {:version {:name version-name                          :protocol protocol}})) -(defn length-prefixed-  "Returns a new ByteBuf prefixed by an encoded varint of the length of 'buf'."-  [buf]-  (-> (Unpooled/compositeBuffer 2)-      (CompositeByteBuf/.addComponent true (varint-> (Unpooled/buffer max-varint-size) (ByteBuf/.writerIndex buf)))-      (CompositeByteBuf/.addComponent true buf)))- (defn table-> [schema]   (fn [buf m]     (reduce (fn [acc [field writer]]