62bc630
Branches > main > 62bc630 > files
Move stream functions to net.bowmap.network.streams
Commit: 62bc630159f3ea4d4b1c3a0cb75c4f4476613a29
Parent: f1a7d9a
1 changed file:
src/net/bowmap/network/streams.clj view file
@@ -0,0 +1,57 @@+(ns net.bowmap.network.streams+ (:require+ [net.bowmap.network.frame.types :refer [max-varint-size]])+ (:import+ [io.netty.buffer ByteBuf Unpooled]+ [java.io+ EOFException+ IOException+ InputStream+ OutputStream]))++(defn read-byte!!+ "Blocks and reads an unsigned byte (int) from an InputStream.+ Throws if EOF is reached."+ [input-stream]+ (let [x (InputStream/.read input-stream)]+ (if (= x -1)+ (throw (EOFException. "EOF while reading from InputStream"))+ x)))++(defn read-varint!!+ "Blocks and reads a varint from an InputStream.+ Throws if EOF is reached, or if the encoded varint is invalid."+ [input-stream]+ (loop [num-read 0+ result 0]+ (if (>= num-read max-varint-size)+ (throw (IOException. "VarInt too long"))+ (let [b (read-byte!! input-stream)+ result' (bit-or result (bit-shift-left (bit-and b 0x7F) (* 7 num-read)))]+ (if (zero? (bit-and b 0x80))+ result'+ (recur (inc num-read) result'))))))++(defn read-frame!!+ "Blocks and reads a frame from an InputStream.+ Throws if EOF is reached, or if the encoded frame is invalid."+ [input-stream]+ (let [len (read-varint!! input-stream)+ arr (byte-array len)]+ (loop [offset 0]+ (when (< offset len)+ (let [r (InputStream/.read input-stream arr offset (- len offset))]+ (if (= r -1)+ (throw (EOFException. "EOF while reading frame"))+ (recur (+ offset r))))))+ (Unpooled/wrappedBuffer arr)))++(defn write-frame!!+ "Blocks and writes a frame to an OutputStream.+ Throws if the frame cannot be written."+ [frame output-stream]+ (let [len (ByteBuf/.readableBytes frame)+ arr (byte-array len)]+ (ByteBuf/.readBytes frame arr)+ (OutputStream/.write output-stream arr)+ (OutputStream/.flush output-stream)))