@@ -86,6 +86,7 @@ type TimeoutMicroseconds = Int
8686deriving instance Generic Fingerprint
8787deriving via WineryVariant Fingerprint instance Serialise Fingerprint
8888
89+-- | Internal type used to mark envelope types.
8990data MessageType = RequestMessage TimeoutMicroseconds
9091 | ResponseMessage
9192 | TimeoutResponseMessage
@@ -93,15 +94,17 @@ data MessageType = RequestMessage TimeoutMicroseconds
9394 deriving (Generic, Show)
9495 deriving Serialise via WineryVariant MessageType
9596
96−type MessageHandlers serverState = [RequestHandler serverState]
97−
97+-- | A list of `RequestHandler`s.
98+type RequestHandlers serverState = [RequestHandler serverState]
99+
100+-- |
98101data RequestHandler serverState where
99102 -- | create a request handler with a response
100103 RequestHandler :: forall a b serverState. (Serialise a, Serialise b) => (ConnectionState serverState -> a -> IO b) -> RequestHandler serverState
101104 -- | create an asynchronous request handler where the client does not expect nor await a response
102105 AsyncRequestHandler :: forall a serverState. Serialise a => (ConnectionState serverState -> a -> IO ()) -> RequestHandler serverState
103106
104−-- | Passed to
107+-- | Server state sent in via `serve` and passed to `RequestHandler`s.
105108data ConnectionState a = ConnectionState {
106109 connectionServerState :: a,
107110 connectionSocket :: Locking Socket
@@ -133,7 +136,7 @@ instance Serialise UUID where
133136 x -> error $ "invalid schema element " <> show x
134137 decodeCurrent = B.decode . BSL.fromStrict <$> (decodeVarInt >>= getBytes)
135138
136−
139+-- | Errors from remote calls.
137140data ConnectionError = CodecError String -- show of WineryException from exception initiator which cannot otherwise be transmitted over a line due to dependencies on TypeReps
138141 | TimeoutError
139142 | ExceptionError String
@@ -146,7 +149,7 @@ allHostAddrs,localHostAddr :: HostAddr
146149allHostAddrs = (0,0,0,0)
147150localHostAddr = (127,0,0,1)
148151
149−-- Each message is lxggength-prefixed by a 32-bit unsigned length.
152+-- Each message is length-prefixed by a 32-bit unsigned length.
150153envelopeP :: Parser IO Word8 Envelope
151154envelopeP = do
152155 let s = FL.toList
@@ -207,9 +210,10 @@ uuidP = do
207210type NewConnectionHandler msg = IO (Maybe msg)
208211
209212type NewMessageHandler req resp = req -> IO resp
210−
213+
214+-- | Listen for new connections and handle requests which are passed the server state 's'. The MVar SockAddr can be be optionally used to know when the server is ready for processing requests.
211215serve ::
212− MessageHandlers s->
216+ RequestHandlers s->
213217 s ->
214218 HostAddr ->
215219 PortNumber ->
@@ -242,14 +246,16 @@ matchEnvelope envelope dispatchf =
242246 Nothing -> Nothing
243247 Just decoded -> Just (dispatchf, decoded)
244248
249+-- | Called by `serve` to process incoming envelope requests. Never returns, so use `async` to spin it off on another thread.
245250serverEnvelopeHandler ::
246251 Locking Socket
247− -> MessageHandlers s
252+ -> RequestHandlers s
248253 -> s
249254 -> Envelope
250255 -> IO ()
251256serverEnvelopeHandler _ _ _ (Envelope _ TimeoutResponseMessage _ _) = pure ()
252257serverEnvelopeHandler _ _ _ (Envelope _ ExceptionResponseMessage _ _) = pure ()
258+serverEnvelopeHandler _ _ _ (Envelope _ ResponseMessage _ _) = pure ()
253259serverEnvelopeHandler sockLock msgHandlers serverState envelope@(Envelope _ (RequestMessage timeoutms) msgId _) = do
254260 --find first matching handler
255261 let runTimeout :: IO b -> IO (Maybe b)
@@ -291,11 +297,9 @@ serverEnvelopeHandler sockLock msgHandlers serverState envelope@(Envelope _ (Req
291297 let env = Envelope (fingerprint (show exc)) ExceptionResponseMessage msgId (serialise (show exc)) in
292298 sendEnvelope env sockLock
293299 Right () -> pure ()
294−serverEnvelopeHandler _ _ _ (Envelope _ ResponseMessage _ _) = error "server received response message"
295300
296−type EnvelopeHandler = Envelope -> IO ()
297301
298−type AsyncMessageHandler a = a -> IO ()
302+type EnvelopeHandler = Envelope -> IO ()
299303
300304drainSocketMessages :: Socket -> EnvelopeHandler -> IO ()
301305drainSocketMessages sock envelopeHandler = do