@@ -2,13 +2,16 @@ package eventconsumer
22
33import (
44 "context"
5+ "encoding/json"
6+ "errors"
57 "fmt"
68 "time"
79
810 "github.com/fystack/mpcium/pkg/event"
911 "github.com/fystack/mpcium/pkg/logger"
1012 "github.com/fystack/mpcium/pkg/messaging"
1113 "github.com/fystack/mpcium/pkg/mpc"
14+ "github.com/fystack/mpcium/pkg/types"
1215 "github.com/google/uuid"
1316 "github.com/nats-io/nats.go"
1417 "github.com/nats-io/nats.go/jetstream"
@@ -31,22 +34,30 @@ type KeygenConsumer interface {
3134
3235// keygenConsumer implements KeygenConsumer.
3336type keygenConsumer struct {
34- natsConn * nats.Conn
35- pubsub messaging.PubSub
36- jsBroker messaging.MessageBroker
37- peerRegistry mpc.PeerRegistry
37+ natsConn * nats.Conn
38+ pubsub messaging.PubSub
39+ jsBroker messaging.MessageBroker
40+ peerRegistry mpc.PeerRegistry
41+ keygenResultQueue messaging.MessageQueue
3842
3943 // jsSub holds the JetStream subscription, so it can be cleaned up during Close().
4044 jsSub messaging.MessageSubscription
4145}
4246
4347// NewKeygenConsumer returns a new instance of KeygenConsumer.
44- func NewKeygenConsumer (natsConn * nats.Conn , jsBroker messaging.MessageBroker , pubsub messaging.PubSub , peerRegistry mpc.PeerRegistry ) KeygenConsumer {
48+ func NewKeygenConsumer (
49+ natsConn * nats.Conn ,
50+ jsBroker messaging.MessageBroker ,
51+ pubsub messaging.PubSub ,
52+ peerRegistry mpc.PeerRegistry ,
53+ keygenResultQueue messaging.MessageQueue ,
54+ ) KeygenConsumer {
4555 return & keygenConsumer {
46- natsConn : natsConn ,
47- pubsub : pubsub ,
48- jsBroker : jsBroker ,
49- peerRegistry : peerRegistry ,
56+ natsConn : natsConn ,
57+ pubsub : pubsub ,
58+ jsBroker : jsBroker ,
59+ peerRegistry : peerRegistry ,
60+ keygenResultQueue : keygenResultQueue ,
5061 }
5162}
5263
@@ -110,9 +121,21 @@ func (sc *keygenConsumer) Run(ctx context.Context) error {
110121}
111122
112123func (sc * keygenConsumer ) handleKeygenEvent (msg jetstream.Msg ) {
124+ raw := msg .Data ()
125+ var keygenMsg types.GenerateKeyMessage
126+ sessionID := msg .Headers ().Get ("SessionID" )
127+
128+ err := json .Unmarshal (raw , & keygenMsg )
129+ if err != nil {
130+ logger .Error ("SigningConsumer: Failed to unmarshal keygen message" , err )
131+ sc .handleKeygenError (keygenMsg , event .ErrorCodeUnmarshalFailure , err , sessionID )
132+ _ = msg .Nak ()
133+ return
134+ }
113135
114136 if ! sc .peerRegistry .ArePeersReady () {
115- logger .Warn ("KeygenConsumer: Not all peers are ready to sign, skipping message processing" )
137+ logger .Warn ("KeygenConsumer: Not all peers are ready to gen key, skipping message processing" )
138+ sc .handleKeygenError (keygenMsg , event .ErrorCodeClusterNotReady , errors .New ("not all peers are ready" ), sessionID )
116139 return
117140 }
118141
@@ -167,6 +190,33 @@ func (sc *keygenConsumer) handleKeygenEvent(msg jetstream.Msg) {
167190 _ = msg .Nak ()
168191}
169192
193+ func (sc * keygenConsumer ) handleKeygenError (keygenMsg types.GenerateKeyMessage , errorCode event.ErrorCode , err error , sessionID string ) {
194+ keygenResult := event.KeygenResultEvent {
195+ ResultType : event .ResultTypeError ,
196+ ErrorCode : string (errorCode ),
197+ WalletID : keygenMsg .WalletID ,
198+ ErrorReason : err .Error (),
199+ }
200+
201+ keygenResultBytes , err := json .Marshal (keygenResult )
202+ if err != nil {
203+ logger .Error ("Failed to marshal keygen result event" , err ,
204+ "walletID" , keygenResult .WalletID ,
205+ )
206+ return
207+ }
208+
209+ topic := fmt .Sprintf (mpc .TypeGenerateWalletResultFmt , keygenResult .WalletID )
210+ err = sc .keygenResultQueue .Enqueue (topic , keygenResultBytes , & messaging.EnqueueOptions {
211+ IdempotententKey : buildIdempotentKey (keygenMsg .WalletID , sessionID , mpc .TypeGenerateWalletResultFmt ),
212+ })
213+ if err != nil {
214+ logger .Error ("Failed to enqueue keygen result event" , err ,
215+ "walletID" , keygenMsg .WalletID ,
216+ )
217+ }
218+ }
219+
170220// Close unsubscribes from the JetStream subject and cleans up resources.
171221func (sc * keygenConsumer ) Close () error {
172222 if sc .jsSub != nil {
0 commit comments