76c8f42
Branches > main > 76c8f42 > files
Document frames
Commit: 76c8f4266c1bf6d85f34ca3f9a25ab7ecca9cd91
Parent: e860102
6 changed files:
src/net/bowmap/server/network/streams.clj 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 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 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 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" (:requiresrc/net/bowmap/server/protocol/types.clj 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 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]]