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

import qualified API                as Nats
import           JetStream.API      (JetStream (..))
import qualified JetStream.Consumer as Consumer
import qualified JetStream.Message  as Message
import           JetStream.Options
    ( JetStreamOption
    , newJetStreamContext
    , withDomain
    , withRequestTimeoutMicros
    )
import qualified JetStream.Publish  as Publish
import qualified JetStream.Stream   as Stream

-- | Build a JetStream capability record from an existing NATS client.
newJetStream :: Nats.Client -> [JetStreamOption] -> JetStream
newJetStream :: Client -> [JetStreamOption] -> JetStream
newJetStream Client
client [JetStreamOption]
options =
  let ctx :: JetStreamContext
ctx = Client -> [JetStreamOption] -> JetStreamContext
newJetStreamContext Client
client [JetStreamOption]
options
  in JetStream
    { streams :: StreamAPI
streams = JetStreamContext -> StreamAPI
Stream.streamAPI JetStreamContext
ctx
    , consumers :: ConsumerAPI
consumers = JetStreamContext -> ConsumerAPI
Consumer.consumerAPI JetStreamContext
ctx
    , publisher :: PublishAPI
publisher = JetStreamContext -> PublishAPI
Publish.publishAPI JetStreamContext
ctx
    , messages :: MessageAPI
messages = JetStreamContext -> MessageAPI
Message.messageAPI JetStreamContext
ctx
    }