module Ecluse.Core.Queue (
MirrorQueue (..),
noMirrorQueue,
MirrorJob (..),
RemoteSpanContext (..),
QueueMessage (..),
encodeJob,
decodeJob,
ReceiptHandle,
mkReceiptHandle,
unReceiptHandle,
Seconds (..),
ReceiptLease (..),
DeadLetterTerminus (..),
DeliveryBudget (..),
defaultDeliveryBudget,
effectiveDeliveryBudget,
retiringDelivery,
deliveryBudgetSpent,
) where
import Data.Aeson (eitherDecodeStrict', object, withObject, (.:), (.:?), (.=))
import Data.Aeson qualified as Aeson
import Data.Aeson.Types (Parser, parseEither)
import Ecluse.Core.Ecosystem (Ecosystem, ecosystemName, parseEcosystem)
import Ecluse.Core.Fault (TransportCause (TransportProtocol), TransportFault, transportFault)
import Ecluse.Core.Package (PackageName, pkgEcosystem, pkgNamespace, unScope, unscopedName)
import Ecluse.Core.Queue.Lease (ReceiptLease (..), Seconds (..))
import Ecluse.Core.Security.Egress (RegistryUrl, registryUrlText)
import Ecluse.Core.Server.Path (Filename, mkFilename, unFilename)
import Ecluse.Core.Version (Version, mkVersion, renderVersion)
data MirrorJob = MirrorJob
{ MirrorJob -> PackageName
jobPackage :: PackageName
, MirrorJob -> Version
jobVersion :: Version
, MirrorJob -> RegistryUrl
jobArtifactUrl :: RegistryUrl
, MirrorJob -> Filename
jobArtifactFilename :: Filename
, MirrorJob -> Maybe RemoteSpanContext
jobTraceContext :: Maybe RemoteSpanContext
}
deriving stock (MirrorJob -> MirrorJob -> Bool
(MirrorJob -> MirrorJob -> Bool)
-> (MirrorJob -> MirrorJob -> Bool) -> Eq MirrorJob
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MirrorJob -> MirrorJob -> Bool
== :: MirrorJob -> MirrorJob -> Bool
$c/= :: MirrorJob -> MirrorJob -> Bool
/= :: MirrorJob -> MirrorJob -> Bool
Eq, Int -> MirrorJob -> ShowS
[MirrorJob] -> ShowS
MirrorJob -> String
(Int -> MirrorJob -> ShowS)
-> (MirrorJob -> String)
-> ([MirrorJob] -> ShowS)
-> Show MirrorJob
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MirrorJob -> ShowS
showsPrec :: Int -> MirrorJob -> ShowS
$cshow :: MirrorJob -> String
show :: MirrorJob -> String
$cshowList :: [MirrorJob] -> ShowS
showList :: [MirrorJob] -> ShowS
Show)
data RemoteSpanContext = RemoteSpanContext
{ RemoteSpanContext -> Text
rscTraceparent :: Text
, RemoteSpanContext -> Text
rscTracestate :: Text
}
deriving stock (RemoteSpanContext -> RemoteSpanContext -> Bool
(RemoteSpanContext -> RemoteSpanContext -> Bool)
-> (RemoteSpanContext -> RemoteSpanContext -> Bool)
-> Eq RemoteSpanContext
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RemoteSpanContext -> RemoteSpanContext -> Bool
== :: RemoteSpanContext -> RemoteSpanContext -> Bool
$c/= :: RemoteSpanContext -> RemoteSpanContext -> Bool
/= :: RemoteSpanContext -> RemoteSpanContext -> Bool
Eq, Int -> RemoteSpanContext -> ShowS
[RemoteSpanContext] -> ShowS
RemoteSpanContext -> String
(Int -> RemoteSpanContext -> ShowS)
-> (RemoteSpanContext -> String)
-> ([RemoteSpanContext] -> ShowS)
-> Show RemoteSpanContext
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RemoteSpanContext -> ShowS
showsPrec :: Int -> RemoteSpanContext -> ShowS
$cshow :: RemoteSpanContext -> String
show :: RemoteSpanContext -> String
$cshowList :: [RemoteSpanContext] -> ShowS
showList :: [RemoteSpanContext] -> ShowS
Show)
encodeJob :: MirrorJob -> Text
encodeJob :: MirrorJob -> Text
encodeJob MirrorJob
job =
ByteString -> Text
forall a b. ConvertUtf8 a b => b -> a
decodeUtf8 (ByteString -> Text) -> (Value -> ByteString) -> Value -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> ByteString
forall a. ToJSON a => a -> ByteString
Aeson.encode (Value -> Text) -> Value -> Text
forall a b. (a -> b) -> a -> b
$
[Pair] -> Value
object
[ Key
"ecosystem" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Ecosystem -> Text
ecosystemName (PackageName -> Ecosystem
pkgEcosystem (MirrorJob -> PackageName
jobPackage MirrorJob
job))
, Key
"namespace" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Scope -> Text
unScope (Scope -> Text) -> Maybe Scope -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PackageName -> Maybe Scope
pkgNamespace (MirrorJob -> PackageName
jobPackage MirrorJob
job))
, Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PackageName -> Text
unscopedName (MirrorJob -> PackageName
jobPackage MirrorJob
job)
, Key
"version" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Version -> Text
renderVersion (MirrorJob -> Version
jobVersion MirrorJob
job)
, Key
"artifactUrl" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= RegistryUrl -> Text
registryUrlText (MirrorJob -> RegistryUrl
jobArtifactUrl MirrorJob
job)
, Key
"filename" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Filename -> Text
unFilename (MirrorJob -> Filename
jobArtifactFilename MirrorJob
job)
, Key
"traceContext" Key -> Maybe Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (RemoteSpanContext -> Value
encodeTraceContext (RemoteSpanContext -> Value)
-> Maybe RemoteSpanContext -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MirrorJob -> Maybe RemoteSpanContext
jobTraceContext MirrorJob
job)
]
encodeTraceContext :: RemoteSpanContext -> Aeson.Value
encodeTraceContext :: RemoteSpanContext -> Value
encodeTraceContext RemoteSpanContext
rsc =
[Pair] -> Value
object
[ Key
"traceparent" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= RemoteSpanContext -> Text
rscTraceparent RemoteSpanContext
rsc
, Key
"tracestate" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= RemoteSpanContext -> Text
rscTracestate RemoteSpanContext
rsc
]
decodeJob ::
(Ecosystem -> Maybe Text -> Text -> Either Text PackageName) ->
(Text -> Either Text RegistryUrl) ->
Text ->
Either Text MirrorJob
decodeJob :: (Ecosystem -> Maybe Text -> Text -> Either Text PackageName)
-> (Text -> Either Text RegistryUrl)
-> Text
-> Either Text MirrorJob
decodeJob Ecosystem -> Maybe Text -> Text -> Either Text PackageName
packageName Text -> Either Text RegistryUrl
egressUrl Text
body =
(String -> Text) -> Either String Value -> Either Text Value
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> Text
forall a. ToText a => a -> Text
toText (ByteString -> Either String Value
forall a. FromJSON a => ByteString -> Either String a
eitherDecodeStrict' (Text -> ByteString
forall a b. ConvertUtf8 a b => a -> b
encodeUtf8 Text
body))
Either Text Value
-> (Value -> Either Text MirrorJob) -> Either Text MirrorJob
forall a b. Either Text a -> (a -> Either Text b) -> Either Text b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (String -> Text)
-> Either String MirrorJob -> Either Text MirrorJob
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> Text
forall a. ToText a => a -> Text
toText (Either String MirrorJob -> Either Text MirrorJob)
-> (Value -> Either String MirrorJob)
-> Value
-> Either Text MirrorJob
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Value -> Parser MirrorJob) -> Value -> Either String MirrorJob
forall a b. (a -> Parser b) -> a -> Either String b
parseEither ((Ecosystem -> Maybe Text -> Text -> Either Text PackageName)
-> (Text -> Either Text RegistryUrl) -> Value -> Parser MirrorJob
parseMirrorJob Ecosystem -> Maybe Text -> Text -> Either Text PackageName
packageName Text -> Either Text RegistryUrl
egressUrl)
parseMirrorJob ::
(Ecosystem -> Maybe Text -> Text -> Either Text PackageName) ->
(Text -> Either Text RegistryUrl) ->
Aeson.Value ->
Parser MirrorJob
parseMirrorJob :: (Ecosystem -> Maybe Text -> Text -> Either Text PackageName)
-> (Text -> Either Text RegistryUrl) -> Value -> Parser MirrorJob
parseMirrorJob Ecosystem -> Maybe Text -> Text -> Either Text PackageName
packageName Text -> Either Text RegistryUrl
egressUrl = String -> (Object -> Parser MirrorJob) -> Value -> Parser MirrorJob
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MirrorJob" ((Object -> Parser MirrorJob) -> Value -> Parser MirrorJob)
-> (Object -> Parser MirrorJob) -> Value -> Parser MirrorJob
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
ecoName <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"ecosystem"
eco <- maybe (fail (unusable "ecosystem" ecoName)) pure (parseEcosystem ecoName)
rawNamespace <- o .:? "namespace"
rawName <- o .: "name"
package <- either (fail . toString) pure (packageName eco rawNamespace rawName)
rawVersion <- o .: "version"
rawArtifactUrl <- o .: "artifactUrl"
artifactUrl <- either (fail . toString) pure (egressUrl rawArtifactUrl)
rawFilename <- o .: "filename"
filename <- maybe (fail (unusable "artifact filename" rawFilename)) pure (mkFilename rawFilename)
traceContext <- o .:? "traceContext" >>= traverse parseTraceContext
pure
MirrorJob
{ jobPackage = package
, jobVersion = mkVersion eco rawVersion
, jobArtifactUrl = artifactUrl
, jobArtifactFilename = filename
, jobTraceContext = traceContext
}
unusable :: String -> Text -> String
unusable :: String -> Text -> String
unusable String
field Text
value = String
"unusable " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
field String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
forall b a. (Show a, IsString b) => a -> b
show Text
value
parseTraceContext :: Aeson.Value -> Parser RemoteSpanContext
parseTraceContext :: Value -> Parser RemoteSpanContext
parseTraceContext = String
-> (Object -> Parser RemoteSpanContext)
-> Value
-> Parser RemoteSpanContext
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"RemoteSpanContext" ((Object -> Parser RemoteSpanContext)
-> Value -> Parser RemoteSpanContext)
-> (Object -> Parser RemoteSpanContext)
-> Value
-> Parser RemoteSpanContext
forall a b. (a -> b) -> a -> b
$ \Object
t ->
Text -> Text -> RemoteSpanContext
RemoteSpanContext (Text -> Text -> RemoteSpanContext)
-> Parser Text -> Parser (Text -> RemoteSpanContext)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
t Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"traceparent" Parser (Text -> RemoteSpanContext)
-> Parser Text -> Parser RemoteSpanContext
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
t Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"tracestate"
newtype ReceiptHandle = ReceiptHandle Text
deriving stock (ReceiptHandle -> ReceiptHandle -> Bool
(ReceiptHandle -> ReceiptHandle -> Bool)
-> (ReceiptHandle -> ReceiptHandle -> Bool) -> Eq ReceiptHandle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReceiptHandle -> ReceiptHandle -> Bool
== :: ReceiptHandle -> ReceiptHandle -> Bool
$c/= :: ReceiptHandle -> ReceiptHandle -> Bool
/= :: ReceiptHandle -> ReceiptHandle -> Bool
Eq, Eq ReceiptHandle
Eq ReceiptHandle =>
(ReceiptHandle -> ReceiptHandle -> Ordering)
-> (ReceiptHandle -> ReceiptHandle -> Bool)
-> (ReceiptHandle -> ReceiptHandle -> Bool)
-> (ReceiptHandle -> ReceiptHandle -> Bool)
-> (ReceiptHandle -> ReceiptHandle -> Bool)
-> (ReceiptHandle -> ReceiptHandle -> ReceiptHandle)
-> (ReceiptHandle -> ReceiptHandle -> ReceiptHandle)
-> Ord ReceiptHandle
ReceiptHandle -> ReceiptHandle -> Bool
ReceiptHandle -> ReceiptHandle -> Ordering
ReceiptHandle -> ReceiptHandle -> ReceiptHandle
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ReceiptHandle -> ReceiptHandle -> Ordering
compare :: ReceiptHandle -> ReceiptHandle -> Ordering
$c< :: ReceiptHandle -> ReceiptHandle -> Bool
< :: ReceiptHandle -> ReceiptHandle -> Bool
$c<= :: ReceiptHandle -> ReceiptHandle -> Bool
<= :: ReceiptHandle -> ReceiptHandle -> Bool
$c> :: ReceiptHandle -> ReceiptHandle -> Bool
> :: ReceiptHandle -> ReceiptHandle -> Bool
$c>= :: ReceiptHandle -> ReceiptHandle -> Bool
>= :: ReceiptHandle -> ReceiptHandle -> Bool
$cmax :: ReceiptHandle -> ReceiptHandle -> ReceiptHandle
max :: ReceiptHandle -> ReceiptHandle -> ReceiptHandle
$cmin :: ReceiptHandle -> ReceiptHandle -> ReceiptHandle
min :: ReceiptHandle -> ReceiptHandle -> ReceiptHandle
Ord, Int -> ReceiptHandle -> ShowS
[ReceiptHandle] -> ShowS
ReceiptHandle -> String
(Int -> ReceiptHandle -> ShowS)
-> (ReceiptHandle -> String)
-> ([ReceiptHandle] -> ShowS)
-> Show ReceiptHandle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReceiptHandle -> ShowS
showsPrec :: Int -> ReceiptHandle -> ShowS
$cshow :: ReceiptHandle -> String
show :: ReceiptHandle -> String
$cshowList :: [ReceiptHandle] -> ShowS
showList :: [ReceiptHandle] -> ShowS
Show)
mkReceiptHandle :: Text -> ReceiptHandle
mkReceiptHandle :: Text -> ReceiptHandle
mkReceiptHandle = Text -> ReceiptHandle
ReceiptHandle
unReceiptHandle :: ReceiptHandle -> Text
unReceiptHandle :: ReceiptHandle -> Text
unReceiptHandle (ReceiptHandle Text
t) = Text
t
data QueueMessage = QueueMessage
{ QueueMessage -> MirrorJob
msgJob :: MirrorJob
, QueueMessage -> ReceiptHandle
msgReceipt :: ReceiptHandle
, QueueMessage -> Int
msgReceiveCount :: Int
, QueueMessage -> Maybe ReceiptLease
msgLease :: Maybe ReceiptLease
}
deriving stock (QueueMessage -> QueueMessage -> Bool
(QueueMessage -> QueueMessage -> Bool)
-> (QueueMessage -> QueueMessage -> Bool) -> Eq QueueMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: QueueMessage -> QueueMessage -> Bool
== :: QueueMessage -> QueueMessage -> Bool
$c/= :: QueueMessage -> QueueMessage -> Bool
/= :: QueueMessage -> QueueMessage -> Bool
Eq, Int -> QueueMessage -> ShowS
[QueueMessage] -> ShowS
QueueMessage -> String
(Int -> QueueMessage -> ShowS)
-> (QueueMessage -> String)
-> ([QueueMessage] -> ShowS)
-> Show QueueMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> QueueMessage -> ShowS
showsPrec :: Int -> QueueMessage -> ShowS
$cshow :: QueueMessage -> String
show :: QueueMessage -> String
$cshowList :: [QueueMessage] -> ShowS
showList :: [QueueMessage] -> ShowS
Show)
newtype DeliveryBudget = DeliveryBudget Int
deriving stock (DeliveryBudget -> DeliveryBudget -> Bool
(DeliveryBudget -> DeliveryBudget -> Bool)
-> (DeliveryBudget -> DeliveryBudget -> Bool) -> Eq DeliveryBudget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeliveryBudget -> DeliveryBudget -> Bool
== :: DeliveryBudget -> DeliveryBudget -> Bool
$c/= :: DeliveryBudget -> DeliveryBudget -> Bool
/= :: DeliveryBudget -> DeliveryBudget -> Bool
Eq, Eq DeliveryBudget
Eq DeliveryBudget =>
(DeliveryBudget -> DeliveryBudget -> Ordering)
-> (DeliveryBudget -> DeliveryBudget -> Bool)
-> (DeliveryBudget -> DeliveryBudget -> Bool)
-> (DeliveryBudget -> DeliveryBudget -> Bool)
-> (DeliveryBudget -> DeliveryBudget -> Bool)
-> (DeliveryBudget -> DeliveryBudget -> DeliveryBudget)
-> (DeliveryBudget -> DeliveryBudget -> DeliveryBudget)
-> Ord DeliveryBudget
DeliveryBudget -> DeliveryBudget -> Bool
DeliveryBudget -> DeliveryBudget -> Ordering
DeliveryBudget -> DeliveryBudget -> DeliveryBudget
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DeliveryBudget -> DeliveryBudget -> Ordering
compare :: DeliveryBudget -> DeliveryBudget -> Ordering
$c< :: DeliveryBudget -> DeliveryBudget -> Bool
< :: DeliveryBudget -> DeliveryBudget -> Bool
$c<= :: DeliveryBudget -> DeliveryBudget -> Bool
<= :: DeliveryBudget -> DeliveryBudget -> Bool
$c> :: DeliveryBudget -> DeliveryBudget -> Bool
> :: DeliveryBudget -> DeliveryBudget -> Bool
$c>= :: DeliveryBudget -> DeliveryBudget -> Bool
>= :: DeliveryBudget -> DeliveryBudget -> Bool
$cmax :: DeliveryBudget -> DeliveryBudget -> DeliveryBudget
max :: DeliveryBudget -> DeliveryBudget -> DeliveryBudget
$cmin :: DeliveryBudget -> DeliveryBudget -> DeliveryBudget
min :: DeliveryBudget -> DeliveryBudget -> DeliveryBudget
Ord, Int -> DeliveryBudget -> ShowS
[DeliveryBudget] -> ShowS
DeliveryBudget -> String
(Int -> DeliveryBudget -> ShowS)
-> (DeliveryBudget -> String)
-> ([DeliveryBudget] -> ShowS)
-> Show DeliveryBudget
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeliveryBudget -> ShowS
showsPrec :: Int -> DeliveryBudget -> ShowS
$cshow :: DeliveryBudget -> String
show :: DeliveryBudget -> String
$cshowList :: [DeliveryBudget] -> ShowS
showList :: [DeliveryBudget] -> ShowS
Show)
defaultDeliveryBudget :: DeliveryBudget
defaultDeliveryBudget :: DeliveryBudget
defaultDeliveryBudget = Int -> DeliveryBudget
DeliveryBudget Int
5
data DeadLetterTerminus
=
TerminusAttached (Maybe DeliveryBudget)
|
TerminusAbsent
deriving stock (DeadLetterTerminus -> DeadLetterTerminus -> Bool
(DeadLetterTerminus -> DeadLetterTerminus -> Bool)
-> (DeadLetterTerminus -> DeadLetterTerminus -> Bool)
-> Eq DeadLetterTerminus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeadLetterTerminus -> DeadLetterTerminus -> Bool
== :: DeadLetterTerminus -> DeadLetterTerminus -> Bool
$c/= :: DeadLetterTerminus -> DeadLetterTerminus -> Bool
/= :: DeadLetterTerminus -> DeadLetterTerminus -> Bool
Eq, Int -> DeadLetterTerminus -> ShowS
[DeadLetterTerminus] -> ShowS
DeadLetterTerminus -> String
(Int -> DeadLetterTerminus -> ShowS)
-> (DeadLetterTerminus -> String)
-> ([DeadLetterTerminus] -> ShowS)
-> Show DeadLetterTerminus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeadLetterTerminus -> ShowS
showsPrec :: Int -> DeadLetterTerminus -> ShowS
$cshow :: DeadLetterTerminus -> String
show :: DeadLetterTerminus -> String
$cshowList :: [DeadLetterTerminus] -> ShowS
showList :: [DeadLetterTerminus] -> ShowS
Show)
effectiveDeliveryBudget :: DeliveryBudget -> DeadLetterTerminus -> DeliveryBudget
effectiveDeliveryBudget :: DeliveryBudget -> DeadLetterTerminus -> DeliveryBudget
effectiveDeliveryBudget DeliveryBudget
configured = \case
TerminusAttached (Just (DeliveryBudget Int
captureAt)) -> DeliveryBudget -> DeliveryBudget -> DeliveryBudget
forall a. Ord a => a -> a -> a
max DeliveryBudget
configured (Int -> DeliveryBudget
DeliveryBudget (Int
captureAt Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1))
TerminusAttached Maybe DeliveryBudget
Nothing -> DeliveryBudget
configured
DeadLetterTerminus
TerminusAbsent -> DeliveryBudget
configured
retiringDelivery :: DeliveryBudget -> Int
retiringDelivery :: DeliveryBudget -> Int
retiringDelivery (DeliveryBudget Int
budget) = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
2 Int
budget
deliveryBudgetSpent :: DeliveryBudget -> QueueMessage -> Bool
deliveryBudgetSpent :: DeliveryBudget -> QueueMessage -> Bool
deliveryBudgetSpent DeliveryBudget
budget QueueMessage
message = QueueMessage -> Int
msgReceiveCount QueueMessage
message Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= DeliveryBudget -> Int
retiringDelivery DeliveryBudget
budget
data MirrorQueue = MirrorQueue
{ MirrorQueue -> MirrorJob -> IO (Either TransportFault ())
enqueue :: MirrorJob -> IO (Either TransportFault ())
, MirrorQueue -> IO (Either TransportFault [QueueMessage])
receive :: IO (Either TransportFault [QueueMessage])
, MirrorQueue -> ReceiptHandle -> IO (Either TransportFault ())
ack :: ReceiptHandle -> IO (Either TransportFault ())
, MirrorQueue
-> ReceiptHandle -> Seconds -> IO (Either TransportFault ())
extendVisibility :: ReceiptHandle -> Seconds -> IO (Either TransportFault ())
, MirrorQueue -> ReceiptHandle -> IO (Either TransportFault ())
deadLetter :: ReceiptHandle -> IO (Either TransportFault ())
, MirrorQueue -> DeliveryBudget
deliveryBudget :: DeliveryBudget
, MirrorQueue -> Either TransportFault DeadLetterTerminus
deadLetterTerminus :: Either TransportFault DeadLetterTerminus
}
noMirrorQueue :: MirrorQueue
noMirrorQueue :: MirrorQueue
noMirrorQueue =
MirrorQueue
{ enqueue :: MirrorJob -> IO (Either TransportFault ())
enqueue = \MirrorJob
_ -> Either TransportFault () -> IO (Either TransportFault ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TransportFault -> Either TransportFault ()
forall a b. a -> Either a b
Left TransportFault
inertFault)
, receive :: IO (Either TransportFault [QueueMessage])
receive = Either TransportFault [QueueMessage]
-> IO (Either TransportFault [QueueMessage])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([QueueMessage] -> Either TransportFault [QueueMessage]
forall a b. b -> Either a b
Right [])
, ack :: ReceiptHandle -> IO (Either TransportFault ())
ack = \ReceiptHandle
_ -> Either TransportFault () -> IO (Either TransportFault ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> Either TransportFault ()
forall a b. b -> Either a b
Right ())
, extendVisibility :: ReceiptHandle -> Seconds -> IO (Either TransportFault ())
extendVisibility = \ReceiptHandle
_ Seconds
_ -> Either TransportFault () -> IO (Either TransportFault ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> Either TransportFault ()
forall a b. b -> Either a b
Right ())
, deadLetter :: ReceiptHandle -> IO (Either TransportFault ())
deadLetter = \ReceiptHandle
_ -> Either TransportFault () -> IO (Either TransportFault ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (() -> Either TransportFault ()
forall a b. b -> Either a b
Right ())
, deliveryBudget :: DeliveryBudget
deliveryBudget = DeliveryBudget
defaultDeliveryBudget
, deadLetterTerminus :: Either TransportFault DeadLetterTerminus
deadLetterTerminus = DeadLetterTerminus -> Either TransportFault DeadLetterTerminus
forall a b. b -> Either a b
Right DeadLetterTerminus
TerminusAbsent
}
where
inertFault :: TransportFault
inertFault = TransportCause -> Text -> TransportFault
transportFault TransportCause
TransportProtocol Text
"no mount mirrors, so no mirror queue is built"