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,80 @@ 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+ (SubmitFail reason, server) <$ traceWith tracer (TraceSubmitFailure msgid reason)
41+
42+ process (Right [(msgid, e@ (SubmitFail reason))]) =
43+ (e, server) <$ traceWith tracer (TraceSubmitFailure msgid reason)
44+
45+ process (Right [(msgid, SubmitSuccess )]) =
46+ (SubmitSuccess , server) <$ traceWith tracer (TraceSubmitAccept msgid)
47+
48+ process _ = throwIO (TooManyMessages @ msgid @ msg )
3349
3450 server = LocalTxSubmissionServer {
35- recvMsgSubmitTx = \ sig -> do
36- traceWith tracer $ TraceReceivedMsg (getMsgId sig )
37- process . head =<< mempoolAddTxs [sig ]
51+ recvMsgSubmitTx = \ msg -> do
52+ traceWith tracer $ TraceReceivedMsg (getMsgId msg )
53+ process =<< mempoolAddTxs [msg ]
3854
3955 , recvMsgDone = ()
4056 }
4157
4258
43- data TraceLocalMsgSubmission sig sigid =
44- TraceReceivedMsg sigid
59+ data TraceLocalMsgSubmission msg msgid =
60+ TraceReceivedMsg msgid
4561 -- ^ A signature was received.
46- | TraceSubmitFailure sigid (MempoolAddFail sig )
47- | TraceSubmitAccept sigid
62+ | TraceSubmitFailure msgid (MempoolAddFail msg )
63+ | TraceSubmitAccept msgid
4864
4965deriving instance
50- (Show sig , Show sigid , Show (MempoolAddFail sig ))
51- => Show (TraceLocalMsgSubmission sig sigid )
66+ (Show msg , Show msgid , Show (MempoolAddFail msg ))
67+ => Show (TraceLocalMsgSubmission msg msgid )
68+
69+
70+
71+ data MsgSubmissionServerException msgid msg =
72+ MsgValidationException msgid (MempoolAddFail msg )
73+ | TooManyMessages
74+
75+ deriving instance (Show (MempoolAddFail msg ), Show msgid )
76+ => Show (MsgSubmissionServerException msgid msg )
77+
78+ instance (Typeable msgid , Typeable msg , Show (MempoolAddFail msg ), Show msgid )
79+ => Exception (MsgSubmissionServerException msgid msg ) where
80+
5281
53- instance (ToJSON sigid , ToJSON (MempoolAddFail sig ))
54- => ToJSON (TraceLocalMsgSubmission sig sigid ) where
55- toJSON (TraceReceivedMsg sigid ) =
82+ instance (ToJSON msgid , ToJSON (MempoolAddFail msg ))
83+ => ToJSON (TraceLocalMsgSubmission msg msgid ) where
84+ toJSON (TraceReceivedMsg msgid ) =
5685 -- TODO: once we have verbosity levels, we could include the full tx, for
5786 -- now one can use `TraceSendRecv` tracer for the mini-protocol to see full
5887 -- msgs.
5988 object [ " kind" .= Aeson. String " TraceReceivedMsg"
60- , " sigId" .= sigid
89+ , " sigId" .= msgid
6190 ]
62- toJSON (TraceSubmitFailure sigid reject) =
91+ toJSON (TraceSubmitFailure msgid reject) =
6392 object [ " kind" .= Aeson. String " TraceSubmitFailure"
64- , " sigId" .= sigid
93+ , " sigId" .= msgid
6594 , " reason" .= reject
6695 ]
67- toJSON (TraceSubmitAccept sigid ) =
96+ toJSON (TraceSubmitAccept msgid ) =
6897 object [ " kind" .= Aeson. String " TraceSubmitAccept"
69- , " sigId" .= sigid
98+ , " sigId" .= msgid
7099 ]
0 commit comments