2 | import IO.Async.Event
3 | import System.UV.Loop
4 | import System.UV.Pointer
5 | import System.UV.Stream
6 | import System.UV.Raw.Handle
7 | import System.UV.Raw.Stream
8 | import System.UV.Raw.TCP
13 | Resource (Ptr SockAddrIn) where
17 | (cc : CloseCB) => Resource (Ptr Tcp) where
18 | release h = uv_close h cc
22 | ip4name : Ptr SockAddrIn -> IO String
24 | cs <- mallocPtrs Char 256
25 | r <- uv_ip4_name p cs 255
26 | let res = getString cs
32 | ip6name : Ptr SockAddrIn6 -> IO String
34 | cs <- mallocPtrs Char 256
35 | r <- uv_ip6_name p cs 255
36 | let res = getString cs
43 | ipname : Ptr SockAddr -> IO String
45 | cs <- mallocPtrs Char 256
46 | r <- uv_ip_name p cs 255
47 | let res = getString cs
51 | parameters {auto l : UVLoop}
52 | {auto has : Has UVError es}
55 | mkTcp : Async es (Ptr Tcp)
56 | mkTcp = mallocPtr Tcp >>= uvAct (uv_tcp_init l.loop)
59 | bindTcp : Ptr SockAddrIn -> Async es (Ptr Tcp)
60 | bindTcp addr = mkTcp >>= uvAct (\x => uv_tcp_bind x addr 0)
63 | acceptTcp : Ptr Stream -> Async es (Ptr Tcp)
64 | acceptTcp server = mkTcp >>= uvAct (\x => uv_accept server x)
70 | -> (run : Buffer (Either UVError (Ptr Stream)) -> Async es ())
72 | listenTcp address port run =
73 | useMany [mallocPtr SockAddrIn, closeWithoutUnlockingCB] $
\[addr,cc] => do
74 | uv (uv_ip4_addr address port addr)
75 | bracket (bindTcp addr) (\server => listen server run) (\p => uv_close p cc)