wizard-wipeout/src-client/Client/Communication.hs

60 lines
1.4 KiB
Haskell
Raw Normal View History

2023-12-10 19:12:53 +00:00
{-# LANGUAGE LambdaCase #-}
module Client.Communication where
2023-12-10 19:12:53 +00:00
import qualified Data.Aeson as A
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy.Char8 as B8
import Network.Socket
import System.IO
2023-12-10 19:12:53 +00:00
-- internal imports
import Library.Types
connectSocket
:: FilePath
2023-12-10 19:12:53 +00:00
-> IO Socket
connectSocket path = do
sock <- socket AF_UNIX Stream defaultProtocol
setSocketOption sock KeepAlive 1
connect sock (SockAddrUnix path)
2023-12-10 19:12:53 +00:00
-- handle <- socketToHandle sock ReadWriteMode
-- hSetBuffering handle (BlockBuffering Nothing)
pure sock
-- | Sends a specified message through given socket to the server
sendMessage
:: ClientMessages
-> Socket
-> IO ()
sendMessage msg sock = do
handle <- socketToHandle sock WriteMode
hSetBuffering handle (BlockBuffering Nothing)
2023-12-10 19:12:53 +00:00
let msgJson = A.encode msg
B.hPutStr handle $ B.toStrict msgJson
hFlush handle
-- hClose handle
receiveMessage
:: Socket
-> IO ServerMessage
receiveMessage sock = do
handle <- socketToHandle sock ReadMode
hSetBuffering handle LineBuffering
handleOpen <- hIsOpen handle
if handleOpen
then do
message <- hGetContents handle
let mJsonMessage = A.decode' $ B8.pack message :: Maybe ServerMessage
errMsg = error $ "unexpected message from Server: " <> message
-- hClose handle
maybe
errMsg
pure
mJsonMessage
else
error "Handle is closed"