packages feed

natskell-1.2.0.0: client/JetStream/Client.hs

-- | High-level client implementation for JetStream.
module JetStream.Client
  ( newJetStream
  , JetStream
  , JetStreamOption
  , JetStreamRequestOption
  , JetStreamConfigError (..)
  , withDomain
  , withRequestTimeout
  , withRequestTimeoutMicros
  ) where

import qualified API                  as Nats
import           JetStream.API        (JetStream)
import qualified JetStream.Consumer   as Consumer
import qualified JetStream.KeyValue   as KeyValue
import qualified JetStream.Management as Management
import qualified JetStream.Message    as Message
import           JetStream.Options
    ( JetStream (..)
    , JetStreamConfigError (..)
    , JetStreamOption
    , tryNewJetStreamContext
    , withDomain
    , withRequestTimeout
    , withRequestTimeoutMicros
    )
import qualified JetStream.Publish    as Publish
import qualified JetStream.Stream     as Stream
import           JetStream.Types      (JetStreamRequestOption)

-- | Build JetStream capabilities from an existing NATS client.
newJetStream :: Nats.Client -> [JetStreamOption] -> Either JetStreamConfigError JetStream
newJetStream client options = do
  ctx <- tryNewJetStreamContext client options
  let streamAPI = Stream.streamAPI ctx
      consumerAPI = Consumer.consumerAPI ctx
      publishAPI = Publish.publishAPI ctx
      messageAPI = Message.messageAPI ctx consumerAPI
  pure JetStream
    { streams = streamAPI
    , consumers = consumerAPI
    , publisher = publishAPI
    , messages = messageAPI
    , management = Management.managementAPI ctx
    , keyValues = KeyValue.keyValueAPI streamAPI publishAPI messageAPI
    }