module SocketsAndPipes.Serve.Sockets
(
Socket,
PortNumber,
PassiveSocket (..), closePassiveSocket,
passiveSocketAddress,
PeerSocket (..), closePeerSocketAbruptly,
closePeerSocketPolitely,
accept
) where
import Network.Socket ( Socket, PortNumber )
import qualified Network.Socket as Socket
newtype PassiveSocket = PassiveSocket { PassiveSocket -> Socket
passiveSocket :: Socket }
newtype PeerSocket = PeerSocket { PeerSocket -> Socket
peerSocket :: Socket }
closePassiveSocket :: PassiveSocket -> IO ()
closePassiveSocket :: PassiveSocket -> IO ()
closePassiveSocket = Socket -> IO ()
Socket.close (Socket -> IO ())
-> (PassiveSocket -> Socket) -> PassiveSocket -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PassiveSocket -> Socket
passiveSocket
closePeerSocketAbruptly :: PeerSocket -> IO ()
closePeerSocketAbruptly :: PeerSocket -> IO ()
closePeerSocketAbruptly = Socket -> IO ()
Socket.close (Socket -> IO ()) -> (PeerSocket -> Socket) -> PeerSocket -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PeerSocket -> Socket
peerSocket
closePeerSocketPolitely :: PeerSocket -> IO ()
closePeerSocketPolitely :: PeerSocket -> IO ()
closePeerSocketPolitely PeerSocket
s =
Socket -> Int -> IO ()
Socket.gracefulClose (PeerSocket -> Socket
peerSocket PeerSocket
s) Int
finMilliseconds
finMilliseconds :: Int
finMilliseconds :: Int
finMilliseconds = Int
5000
accept :: PassiveSocket -> IO PeerSocket
accept :: PassiveSocket -> IO PeerSocket
accept PassiveSocket
s =
Socket -> IO (Socket, SockAddr)
Socket.accept (PassiveSocket -> Socket
passiveSocket PassiveSocket
s) IO (Socket, SockAddr)
-> ((Socket, SockAddr) -> IO PeerSocket) -> IO PeerSocket
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
\(Socket
s', SockAddr
_) -> PeerSocket -> IO PeerSocket
forall (m :: * -> *) a. Monad m => a -> m a
return (Socket -> PeerSocket
PeerSocket Socket
s')
passiveSocketAddress :: PassiveSocket -> IO Socket.SockAddr
passiveSocketAddress :: PassiveSocket -> IO SockAddr
passiveSocketAddress = Socket -> IO SockAddr
Socket.getSocketName (Socket -> IO SockAddr)
-> (PassiveSocket -> Socket) -> PassiveSocket -> IO SockAddr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PassiveSocket -> Socket
passiveSocket