module Network.Neks.NetPack (netWrite, netRead) where import Data.ByteString as BS (ByteString, hGet, length, hPut, append) import Data.Serialize (encode, decode) import System.IO (Handle) import Data.Word (Word64) netWrite :: Handle -> ByteString -> IO () netWrite hdl msg = do let len = fromIntegral (BS.length msg) :: Word64 BS.hPut hdl (encode len `append` msg) netRead :: Handle -> IO (Either String ByteString) netRead hdl = do lengthBytes <- hGet hdl 8 case decode lengthBytes of Left err -> return (Left "Network stream ended while reading length") Right len | len < (10^6 :: Word64) -> readData (fromIntegral len) | otherwise -> return (Left "Message too long") where readData length = do dataBytes <- hGet hdl length if BS.length dataBytes /= length then return (Left "Connection dropped during message read") else return (Right dataBytes)