1- {-# LANGUAGE FlexibleContexts #-}
2- {-# LANGUAGE OverloadedStrings #-}
3- {-# LANGUAGE StandaloneDeriving #-}
1+ {-# LANGUAGE FlexibleContexts #-}
2+ {-# LANGUAGE OverloadedStrings #-}
3+ {-# LANGUAGE StandaloneDeriving #-}
4+ {-# LANGUAGE TypeApplications #-}
5+ {-# LANGUAGE UndecidableInstances #-}
46
57module DMQ.NodeToClient.LocalMsgSubmission where
68
79import Control.Concurrent.Class.MonadSTM
10+ import Control.Monad.Class.MonadThrow
811import Control.Tracer
912import Data.Aeson (ToJSON (.. ), object , (.=) )
1013import Data.Aeson qualified as Aeson
14+ import Data.Typeable
1115
1216import DMQ.Protocol.LocalMsgSubmission.Server
1317import DMQ.Protocol.LocalMsgSubmission.Type
@@ -16,55 +20,78 @@ import Ouroboros.Network.TxSubmission.Mempool.Simple
1620-- | Local transaction submission server, for adding txs to the 'Mempool'
1721--
1822localMsgSubmissionServer ::
19- MonadSTM m
20- => (sig -> sigid )
23+ forall msgid msg idx m .
24+ ( MonadSTM m
25+ , MonadThrow m
26+ , Typeable msgid
27+ , Typeable msg
28+ , Show msgid
29+ , Show (MempoolAddFail msg ))
30+ => (msg -> msgid )
2131 -- ^ get message id
22- -> Tracer m (TraceLocalMsgSubmission sig sigid )
23- -> MempoolWriter sigid sig failure idx m
32+ -> Tracer m (TraceLocalMsgSubmission msg msgid )
33+ -> MempoolWriter msgid msg idx m
2434 -- ^ duplicate error tag in case the mempool returns the empty list on failure
25- -> m (LocalMsgSubmissionServer sig m () )
35+ -> m (LocalMsgSubmissionServer msg m () )
2636localMsgSubmissionServer getMsgId tracer MempoolWriter { mempoolAddTxs } =
2737 pure server
2838 where
29- process (sigid, e@ (SubmitFail reason)) =
30- (e, server) <$ traceWith tracer (TraceSubmitFailure sigid reason)
31- process (sigid, success) =
32- (success, server) <$ traceWith tracer (TraceSubmitAccept sigid)
39+ process (Left (msgid, reason)) = do
40+ traceWith tracer (TraceSubmitFailure msgid reason)
41+ throwIO $ MsgValidationException msgid reason
42+ process (Right [(msgid, e@ (SubmitFail reason))]) =
43+ (e, server) <$ traceWith tracer (TraceSubmitFailure msgid reason)
44+ process (Right [(msgid, SubmitSuccess )]) =
45+ (SubmitSuccess , server) <$ traceWith tracer (TraceSubmitAccept msgid)
46+ process _ = throwIO (TooManyMessages @ msgid @ msg )
3347
3448 server = LocalTxSubmissionServer {
35- recvMsgSubmitTx = \ sig -> do
36- traceWith tracer $ TraceReceivedMsg (getMsgId sig )
37- process . head =<< mempoolAddTxs [sig ]
49+ recvMsgSubmitTx = \ msg -> do
50+ traceWith tracer $ TraceReceivedMsg (getMsgId msg )
51+ process =<< mempoolAddTxs [msg ]
3852
3953 , recvMsgDone = ()
4054 }
4155
4256
43- data TraceLocalMsgSubmission sig sigid =
44- TraceReceivedMsg sigid
57+ data TraceLocalMsgSubmission msg msgid =
58+ TraceReceivedMsg msgid
4559 -- ^ A signature was received.
46- | TraceSubmitFailure sigid (MempoolAddFail sig )
47- | TraceSubmitAccept sigid
60+ | TraceSubmitFailure msgid (MempoolAddFail msg )
61+ | TraceSubmitAccept msgid
4862
4963deriving instance
50- (Show sig , Show sigid , Show (MempoolAddFail sig ))
51- => Show (TraceLocalMsgSubmission sig sigid )
64+ (Show msg , Show msgid , Show (MempoolAddFail msg ))
65+ => Show (TraceLocalMsgSubmission msg msgid )
5266
53- instance (ToJSON sigid , ToJSON (MempoolAddFail sig ))
54- => ToJSON (TraceLocalMsgSubmission sig sigid ) where
55- toJSON (TraceReceivedMsg sigid) =
67+
68+
69+ data MsgSubmissionServerException msgid msg =
70+ MsgValidationException msgid (MempoolAddFail msg )
71+ | TooManyMessages
72+
73+ deriving instance (Show (MempoolAddFail msg ), Show msgid )
74+ => Show (MsgSubmissionServerException msgid msg )
75+
76+ instance (Typeable msgid , Typeable msg , Show (MempoolAddFail msg ), Show msgid )
77+ => Exception (MsgSubmissionServerException msgid msg ) where
78+
79+
80+ instance (ToJSON msgid , ToJSON (MempoolAddFail msg ))
81+ => ToJSON (TraceLocalMsgSubmission msg msgid ) where
82+ toJSON (TraceReceivedMsg msgid) =
5683 -- TODO: once we have verbosity levels, we could include the full tx, for
5784 -- now one can use `TraceSendRecv` tracer for the mini-protocol to see full
5885 -- msgs.
5986 object [ " kind" .= Aeson. String " TraceReceivedMsg"
60- , " sigId" .= sigid
87+ , " sigId" .= msgid
6188 ]
62- toJSON (TraceSubmitFailure sigid reject) =
89+ toJSON (TraceSubmitFailure msgid reject) =
6390 object [ " kind" .= Aeson. String " TraceSubmitFailure"
64- , " sigId" .= sigid
91+ , " sigId" .= msgid
6592 , " reason" .= reject
6693 ]
67- toJSON (TraceSubmitAccept sigid ) =
94+ toJSON (TraceSubmitAccept msgid ) =
6895 object [ " kind" .= Aeson. String " TraceSubmitAccept"
69- , " sigId" .= sigid
96+ , " sigId" .= msgid
7097 ]
0 commit comments