62bc630

Bowmap · bowmap.git · Tickets

Branches > main > 62bc630 > files

Move stream functions to net.bowmap.network.streams

Grahp, 2026-09-08

Commit: 62bc630159f3ea4d4b1c3a0cb75c4f4476613a29
Parent: f1a7d9a

1 changed file:

src/net/bowmap/network/streams.clj added (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)))