packages feed

natskell-0.3.0.0: jetstream/JetStream/Publish.hs

module JetStream.Publish
  ( publishAPI
  , module JetStream.Publish.API
  ) where

import qualified API                        as Nats
import           JetStream.Error            (JetStreamError (JetStreamNoReply))
import           JetStream.Options          (JetStreamContext)
import           JetStream.Protocol.Headers (statusError)
import           JetStream.Protocol.Request
    ( decodeJetStreamResponse
    , requestMsg
    )
import           JetStream.Publish.API
import           JetStream.Publish.Types    (publishHeaders)
import           JetStream.Types            (Payload, Subject)

publishAPI :: JetStreamContext -> PublishAPI
publishAPI context =
  PublishAPI
    { publish = publishMessage context
    }

publishMessage
  :: JetStreamContext
  -> Subject
  -> Payload
  -> [PublishOption]
  -> IO (Either JetStreamError PublishAck)
publishMessage context subject payload options = do
  msgResult <- requestMsg context subject (Just payload) (publishHeaders options)
  pure $ do
    msg <- msgResult
    case statusError msg of
      Just err ->
        Left err
      Nothing ->
        case Nats.payload msg of
          Nothing ->
            Left JetStreamNoReply
          Just ackPayload ->
            decodeJetStreamResponse ackPayload