0 | module Control.Linear.Network
4 | import public Data.Either
5 | import public Data.Linear.LEither
6 | import public Data.Maybe
8 | import Control.Linear.LIO
10 | import public Network.Socket.Data
11 | import Network.Socket
14 | data SocketState = Ready | Bound | Listening | Open | Closed
19 | data Action : SocketState -> Type where
21 | Listen : Action Bound
22 | Accept : Action Listening
23 | Connect : Action Ready
25 | Receive : Action Open
29 | data Socket : SocketState -> Type where
30 | MkSocket : Socket.Data.Socket -> Socket st
36 | Next : (action : Action st)
39 | Next Bind True = Socket Bound
40 | Next Listen True = Socket Listening
41 | Next Accept True = LPair (Socket Listening) (Socket Open)
42 | Next Connect True = Socket Open
43 | Next Send True = Socket Open
44 | Next Receive True = Socket Open
45 | Next Close True = Socket Closed
46 | Next _ False = Socket Closed
49 | newSocket : LinearIO io
50 | => (fam : SocketFamily)
51 | -> (ty : SocketType)
52 | -> (pnum : ProtocolNumber)
53 | -> (1 f : (1 sock : LEither (!* SocketError) (Socket Ready)) -> L io a)
55 | newSocket fam ty pnum f
56 | = do Right rawsock <- socket fam ty pnum
57 | | Left err => f (Left $
MkBang err)
58 | f (Right $
MkSocket rawsock)
61 | close : LinearIO io => (1 sock : Socket st) -> L1 io (Socket Closed)
62 | close (MkSocket sock)
63 | = do Socket.close sock
64 | pure1 (MkSocket sock)
67 | done : LinearIO io => (1 sock : Socket Closed) -> L io ()
68 | done (MkSocket sock) = pure ()
71 | bind : LinearIO io =>
72 | (1 sock : Socket Ready) ->
73 | (addr : Maybe SocketAddress) ->
75 | L1 io (Res (Maybe SocketError)
76 | (\res => Next Bind (isNothing res)))
77 | bind (MkSocket sock) addr port
78 | = do code <- Socket.bind sock addr port
81 | pure1 $
Nothing # MkSocket sock
83 | pure1 $
Just err # MkSocket sock
86 | connect : LinearIO io =>
87 | (1 sock : Socket Ready) ->
88 | (addr : SocketAddress) ->
90 | L1 io (Res (Maybe SocketError)
91 | (\res => Next Connect (isNothing res)))
92 | connect (MkSocket sock) addr port
93 | = do code <- Socket.connect sock addr port
96 | pure1 $
Nothing # MkSocket sock
98 | pure1 $
Just err # MkSocket sock
101 | listen : LinearIO io =>
102 | (1 sock : Socket Bound) ->
103 | L1 io (Res (Maybe SocketError)
104 | (\res => Next Listen (isNothing res)))
105 | listen (MkSocket sock)
106 | = do code <- Socket.listen sock
109 | pure1 $
Nothing # MkSocket sock
111 | pure1 $
Just err # MkSocket sock
115 | accept : LinearIO io =>
116 | (1 sock : Socket Listening) ->
117 | L1 io (Res (Maybe SocketError)
118 | (\res => Next Accept (isNothing res)))
119 | accept (MkSocket sock)
120 | = do Right (sock', sockaddr) <- Socket.accept sock
121 | | Left err => pure1 (Just err # MkSocket sock)
122 | pure1 (Nothing # (MkSocket sock # MkSocket sock'))
125 | send : LinearIO io =>
126 | (1 sock : Socket Open) ->
128 | L1 io (Res (Maybe SocketError)
129 | (\res => Next Send (isNothing res)))
130 | send (MkSocket sock) msg
131 | = do Right c <- Socket.send sock msg
132 | | Left err => pure1 (Just err # MkSocket sock)
133 | pure1 (Nothing # MkSocket sock)
136 | recv : LinearIO io =>
137 | (1 sock : Socket Open) ->
138 | (len : ByteLength) ->
139 | L1 io (Res (Either SocketError (String, ResultCode))
140 | (\res => Next Receive (isRight res)))
141 | recv (MkSocket sock) len
142 | = do Right msg <- Socket.recv sock len
143 | | Left err => pure1 (Left err # MkSocket sock)
144 | pure1 (Right msg # MkSocket sock)
147 | recvAll : LinearIO io =>
148 | (1 sock : Socket Open) ->
149 | L1 io (Res (Either SocketError String)
150 | (\res => Next Receive (isRight res)))
151 | recvAll (MkSocket sock)
152 | = do Right msg <- Socket.recvAll sock
153 | | Left err => pure1 (Left err # MkSocket sock)
154 | pure1 (Right msg # MkSocket sock)
157 | sendBytes : LinearIO io =>
158 | (1 sock : Socket Open) ->
159 | (msg : List Bits8) ->
160 | L1 io (Res (Maybe SocketError)
161 | (\res => Next Send (isNothing res)))
162 | sendBytes (MkSocket sock) msg
163 | = do Right c <- Socket.sendBytes sock msg
164 | | Left err => pure1 (Just err # MkSocket sock)
165 | pure1 (Nothing # MkSocket sock)
168 | recvBytes : LinearIO io =>
169 | (1 sock : Socket Open) ->
170 | (len : ByteLength) ->
171 | L1 io (Res (Either SocketError (List Bits8))
172 | (\res => Next Receive (isRight res)))
173 | recvBytes (MkSocket sock) len
174 | = do Right msg <- Socket.recvBytes sock len
175 | | Left err => pure1 (Left err # MkSocket sock)
176 | pure1 (Right msg # MkSocket sock)
179 | recvAllBytes : LinearIO io =>
180 | (1 sock : Socket Open) ->
181 | L1 io (Res (Either SocketError (List Bits8))
182 | (\res => Next Receive (isRight res)))
183 | recvAllBytes (MkSocket sock)
184 | = do Right msg <- Socket.recvAllBytes sock
185 | | Left err => pure1 (Left err # MkSocket sock)
186 | pure1 (Right msg # MkSocket sock)