# RabbitMQ Messaging API supporting request-response [![Build Status](https://travis-ci.org/salemove/freddy-hs.svg?branch=master)](https://travis-ci.org/salemove/freddy-hs) [![Code Climate](https://codeclimate.com/github/salemove/freddy-hs/badges/gpa.svg)](https://codeclimate.com/github/salemove/freddy-hs) ## Setup * Create a connection: ```haskell import qualified Network.Freddy as Freddy import qualified Network.Freddy.Request as R connection <- Freddy.connect "127.0.0.1" "/" "guest" "guest" ``` ## Delivering messages ### Simple delivery #### Send and forget Sends a `message` to the given `destination`. If there is no consumer then the message stays in the queue until somebody consumes it. ```haskell Freddy.deliver connection R.newReq { R.queueName = "notifications.user_signed_in", R.body = "{\"user_id\": 1}" } ``` #### Expiring messages Sends a `message` to the given `destination`. If nobody consumes the message in `timeoutInMs` milliseconds then the message is discarded. This is useful for showing notifications that must happen in a certain timeframe but guaranteed delivery is not a strict requirement. ```haskell Freddy.deliver connection R.newReq { R.queueName = "notifications.user_signed_in", R.body = "{\"user_id\": 1}", R.timeoutIsMs = 5000 } ``` ### Request delivery Sends a `message` to the given `destination`. Has a default timeout of 3 seconds and discards the message from the queue if a response hasn't been returned in that time. ```haskell response <- Freddy.deliverWithResponse connection R.newReq { R.queueName = "echo", R.body = "{\"msg\": \"what did you say?\"}" } case response of Right payload -> putStrLn "Received positive result" Left (Freddy.InvalidRequest payload) -> putStrLn "Received error" Left Freddy.TimeoutError -> putStrLn "Request timed out" ``` ## Responding to messages ```haskell processMessage (Freddy.Delivery body replyWith failWith) = replyWith body connection <- Freddy.connect "127.0.0.1" "/" "guest" "guest" Freddy.respondTo connection "echo" processMessage ``` ## Tapping into messages Listens for messages on a given destination or destinations without consuming them. ```haskell processMessage body = putStrLn body connection <- Freddy.connect "127.0.0.1" "/" "guest" "guest" Freddy.tapInto connection "notifications.*" processMessage ``` * Note that it is not possible to respond to the message while tapping. * When tapping the following wildcards are supported in the `queueName`: * `#` matching 0 or more words * `*` matching exactly one word Examples: ```haskell Freddy.tapInto connection "i.#.free" processMessage ``` receives messages that are delivered to `"i.want.to.break.free"` ```haskell Freddy.tapInto connection "somebody.*.love" processMessage ``` receives messages that are delivered to `somebody.to.love` but doesn't receive messages delivered to `someboy.not.to.love`