summaryrefslogtreecommitdiff
path: root/server/src/Network/QueryResponse.hs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/Network/QueryResponse.hs')
-rw-r--r--server/src/Network/QueryResponse.hs20
1 files changed, 10 insertions, 10 deletions
diff --git a/server/src/Network/QueryResponse.hs b/server/src/Network/QueryResponse.hs
index ea87abe4..69cc6f50 100644
--- a/server/src/Network/QueryResponse.hs
+++ b/server/src/Network/QueryResponse.hs
@@ -188,17 +188,16 @@ partitionTransport parse encodex tr =
188-- Note: If you add a handler to one of the branches before applying a 188-- Note: If you add a handler to one of the branches before applying a
189-- 'mergeTransports' combinator, then this handler may not block or return 189-- 'mergeTransports' combinator, then this handler may not block or return
190-- Nothing. 190-- Nothing.
191addHandler :: (err -> IO ()) -> (addr -> x -> IO (Maybe (x -> x))) -> TransportA err addr x y -> TransportA err addr x y 191addHandler :: (addr -> x -> IO (Maybe (x -> x))) -> TransportA err addr x y -> TransportA err addr x y
192addHandler onParseError f tr = tr 192addHandler f tr = tr
193 { awaitMessage = \kont -> fix $ \eat -> awaitMessage tr $ \case 193 { awaitMessage = \kont -> fix $ \eat -> awaitMessage tr $ \case
194 Arrival addr x -> f addr x >>= maybe (join $ atomically eat) (kont . Arrival addr . ($ x)) 194 Arrival addr x -> f addr x >>= maybe (join $ atomically eat) (kont . Arrival addr . ($ x))
195 ParseError e -> onParseError e >> kont (ParseError e) 195 m -> kont m
196 Terminated -> kont Terminated
197 } 196 }
198 197
199-- | Modify a 'Transport' to invoke an action upon every received packet. 198-- | Modify a 'Transport' to invoke an action upon every received packet.
200onInbound :: (addr -> x -> IO ()) -> Transport err addr x -> Transport err addr x 199onInbound :: (addr -> x -> IO ()) -> Transport err addr x -> Transport err addr x
201onInbound f tr = addHandler (const $ return ()) (\addr x -> f addr x >> return (Just id)) tr 200onInbound f tr = addHandler (\addr x -> f addr x >> return (Just id)) tr
202 201
203-- * Using a query\/response client. 202-- * Using a query\/response client.
204 203
@@ -208,19 +207,20 @@ onInbound f tr = addHandler (const $ return ()) (\addr x -> f addr x >> return (
208-- Example usage: 207-- Example usage:
209-- 208--
210-- > -- Start client. 209-- > -- Start client.
211-- > quitServer <- forkListener "listener" (clientNet client) 210-- > quitServer <- forkListener "listener" (\_ -> return()) (clientNet client)
212-- > -- Send a query q, recieve a response r. 211-- > -- Send a query q, recieve a response r.
213-- > r <- sendQuery client method q 212-- > r <- sendQuery client method q
214-- > -- Quit client. 213-- > -- Quit client.
215-- > quitServer 214-- > quitServer
216forkListener :: String -> Transport err addr x -> IO (IO ()) 215forkListener :: String -> (err -> IO ()) -> Transport err addr x -> IO (IO ())
217forkListener name client = do 216forkListener name onParseError client = do
218 setActive client True 217 setActive client True
219 thread_id <- forkIO $ do 218 thread_id <- forkIO $ do
220 myThreadId >>= flip labelThread ("listener."++name) 219 myThreadId >>= flip labelThread ("listener."++name)
221 fix $ \loop -> join $ atomically $ awaitMessage client $ \case 220 fix $ \loop -> join $ atomically $ awaitMessage client $ \case
222 Terminated -> return () 221 Terminated -> return ()
223 _ -> loop 222 ParseError e -> onParseError e >> loop
223 _ -> loop
224 dput XMisc $ "Listener died: " ++ name 224 dput XMisc $ "Listener died: " ++ name
225 return $ do 225 return $ do
226 setActive client False 226 setActive client False