kafka-device 1.0.0.0 → 1.0.2.0
raw patch · 4 files changed
+41/−15 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Network.UI.Kafka: rawConsumerLoop :: TopicConnection -> (Message -> a) -> (a -> IO ()) -> IO (ExitAction, LoopAction)
+ Network.UI.Kafka: rawProducerLoop :: TopicConnection -> (a -> Message) -> IO [a] -> IO (ExitAction, LoopAction)
Files
- default.nix +1/−1
- kafka-device.cabal +1/−1
- src/Network/UI/Kafka.hs +38/−12
- src/Network/UI/Kafka/Types.hs +1/−1
default.nix view
@@ -5,7 +5,7 @@ mkDerivation { pname = "kafka-device";- version = "1.0.0.0";+ version = "1.0.2.0"; src = ./.; isLibrary = true; isExecutable = true;
kafka-device.cabal view
@@ -1,5 +1,5 @@ name : kafka-device-version : 1.0.0.0+version : 1.0.2.0 synopsis : UI device events via a Kafka message broker description : This package contains functions for passing UI device events to topics on a Kafka message broker \<<https://kafka.apache.org/>\>. Also see \<<https://hackage.haskell.org/package/kafka-device-joystick/>\>, \<<https://hackage.haskell.org/package/kafka-device-glut/>\>, \<<https://hackage.haskell.org/package/kafka-device-spacenav/>\>, \<<https://hackage.haskell.org/package/kafka-device-leap/>\>. license : MIT
src/Network/UI/Kafka.hs view
@@ -24,9 +24,11 @@ -- * Consumption , ConsumerCallback , consumerLoop+, rawConsumerLoop -- * Production , ProducerCallback , producerLoop+, rawProducerLoop ) where @@ -84,18 +86,30 @@ consumerLoop :: TopicConnection -- ^ The Kafka topic name and connection information. -> ConsumerCallback -- ^ The consumer callback. -> IO (ExitAction, LoopAction) -- ^ Action to create the exit and loop actions.-consumerLoop TopicConnection{..} consumer =+consumerLoop topicConnection =+ let+ fromMessage :: Message -> (Sensor, Event)+ fromMessage message =+ let+ (_, _, _, Key (Just (KBytes k)), Value (Just (KBytes v))) = _messageFields message+ in+ (unpack k, decode $ fromStrict v)+ in+ rawConsumerLoop topicConnection fromMessage+ . uncurry+++-- | Consume messages for a Kafka topic.+rawConsumerLoop :: TopicConnection -- ^ The Kafka topic name and connection information.+ -> (Message -> a) -- ^ The decoder.+ -> (a -> IO ()) -- ^ The consumer callback.+ -> IO (ExitAction, LoopAction) -- ^ Action to create the exit and loop actions.+rawConsumerLoop TopicConnection{..} fromMessage consumer = do exitFlag <- newEmptyMVar :: IO (MVar ()) let topic' = fromString topic address' = fromString *** fromIntegral $ address- fromMessage :: Message -> (Sensor, Event)- fromMessage message =- let- (_, _, _, Key (Just (KBytes k)), Value (Just (KBytes v))) = _messageFields message- in- (unpack k, decode $ fromStrict v) loop offset = do result <- withAddressHandle address' $ \handle -> fetch' handle =<< fetchRequest offset 0 topic'@@ -104,7 +118,7 @@ messages = fromMessage . _tamMessage <$> fetchMessages result liftIO $ do- mapM_ (uncurry consumer) messages+ mapM_ consumer messages threadDelay 100 -- FIXME: Is a thread delay really necessary in order not to miss messages? Why? running <- liftIO $ isEmptyMVar exitFlag when running@@ -128,7 +142,19 @@ -> Sensor -- ^ The name of the sensor producing the event. -> ProducerCallback -- ^ The producer callback. -> IO (ExitAction, LoopAction) -- ^ Action to create the exit and loop actions.-producerLoop TopicConnection{..} sensor producer =+producerLoop topicConnection sensor =+ let+ toMessage = makeKeyedMessage (pack sensor) . toStrict . encode+ in+ rawProducerLoop topicConnection toMessage+++-- | Produce messages for a Kafka topic.+rawProducerLoop :: TopicConnection -- ^ The Kafka topic name and connection information.+ -> (a -> Message) -- ^ The encoder.+ -> IO [a] -- ^ The producer callback.+ -> IO (ExitAction, LoopAction) -- ^ Action to create the exit and loop actions.+rawProducerLoop TopicConnection{..} toMessage producer = do exitFlag <- newEmptyMVar :: IO (MVar ()) let@@ -136,12 +162,12 @@ do events <- liftIO producer void- $ produceMessages+ . produceMessages $ map- (TopicAndMessage (fromString topic) . makeKeyedMessage (pack sensor) . toStrict . encode)+ (TopicAndMessage (fromString topic) . toMessage) events running <- liftIO $ isEmptyMVar exitFlag- when running+ when (running && not (null events)) loop return (
src/Network/UI/Kafka/Types.hs view
@@ -3,7 +3,7 @@ Copyright : (c) 2016-19 Brian W Bush License : MIT Maintainer : Brian W Bush <code@functionally.io>-Stability : Beta+Stability : Production Portability : Portable Event types.