github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/common/appsender/appsender_server.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package appsender 5 6 import ( 7 "context" 8 9 "google.golang.org/protobuf/types/known/emptypb" 10 11 "github.com/MetalBlockchain/metalgo/ids" 12 "github.com/MetalBlockchain/metalgo/snow/engine/common" 13 "github.com/MetalBlockchain/metalgo/utils/set" 14 15 appsenderpb "github.com/MetalBlockchain/metalgo/proto/pb/appsender" 16 ) 17 18 var _ appsenderpb.AppSenderServer = (*Server)(nil) 19 20 type Server struct { 21 appsenderpb.UnsafeAppSenderServer 22 appSender common.AppSender 23 } 24 25 // NewServer returns a messenger connected to a remote channel 26 func NewServer(appSender common.AppSender) *Server { 27 return &Server{appSender: appSender} 28 } 29 30 func (s *Server) SendCrossChainAppRequest(ctx context.Context, msg *appsenderpb.SendCrossChainAppRequestMsg) (*emptypb.Empty, error) { 31 chainID, err := ids.ToID(msg.ChainId) 32 if err != nil { 33 return &emptypb.Empty{}, err 34 } 35 36 return &emptypb.Empty{}, s.appSender.SendCrossChainAppRequest(ctx, chainID, msg.RequestId, msg.Request) 37 } 38 39 func (s *Server) SendCrossChainAppResponse(ctx context.Context, msg *appsenderpb.SendCrossChainAppResponseMsg) (*emptypb.Empty, error) { 40 chainID, err := ids.ToID(msg.ChainId) 41 if err != nil { 42 return &emptypb.Empty{}, err 43 } 44 45 return &emptypb.Empty{}, s.appSender.SendCrossChainAppResponse(ctx, chainID, msg.RequestId, msg.Response) 46 } 47 48 func (s *Server) SendCrossChainAppError(ctx context.Context, msg *appsenderpb.SendCrossChainAppErrorMsg) (*emptypb.Empty, error) { 49 chainID, err := ids.ToID(msg.ChainId) 50 if err != nil { 51 return &emptypb.Empty{}, err 52 } 53 54 return &emptypb.Empty{}, s.appSender.SendCrossChainAppError(ctx, chainID, msg.RequestId, msg.ErrorCode, msg.ErrorMessage) 55 } 56 57 func (s *Server) SendAppRequest(ctx context.Context, req *appsenderpb.SendAppRequestMsg) (*emptypb.Empty, error) { 58 nodeIDs := set.NewSet[ids.NodeID](len(req.NodeIds)) 59 for _, nodeIDBytes := range req.NodeIds { 60 nodeID, err := ids.ToNodeID(nodeIDBytes) 61 if err != nil { 62 return nil, err 63 } 64 nodeIDs.Add(nodeID) 65 } 66 err := s.appSender.SendAppRequest(ctx, nodeIDs, req.RequestId, req.Request) 67 return &emptypb.Empty{}, err 68 } 69 70 func (s *Server) SendAppResponse(ctx context.Context, req *appsenderpb.SendAppResponseMsg) (*emptypb.Empty, error) { 71 nodeID, err := ids.ToNodeID(req.NodeId) 72 if err != nil { 73 return nil, err 74 } 75 err = s.appSender.SendAppResponse(ctx, nodeID, req.RequestId, req.Response) 76 return &emptypb.Empty{}, err 77 } 78 79 func (s *Server) SendAppError(ctx context.Context, req *appsenderpb.SendAppErrorMsg) (*emptypb.Empty, error) { 80 nodeID, err := ids.ToNodeID(req.NodeId) 81 if err != nil { 82 return nil, err 83 } 84 85 err = s.appSender.SendAppError(ctx, nodeID, req.RequestId, req.ErrorCode, req.ErrorMessage) 86 return &emptypb.Empty{}, err 87 } 88 89 func (s *Server) SendAppGossip(ctx context.Context, req *appsenderpb.SendAppGossipMsg) (*emptypb.Empty, error) { 90 nodeIDs := set.NewSet[ids.NodeID](len(req.NodeIds)) 91 for _, nodeIDBytes := range req.NodeIds { 92 nodeID, err := ids.ToNodeID(nodeIDBytes) 93 if err != nil { 94 return nil, err 95 } 96 nodeIDs.Add(nodeID) 97 } 98 err := s.appSender.SendAppGossip( 99 ctx, 100 common.SendConfig{ 101 NodeIDs: nodeIDs, 102 Validators: int(req.Validators), 103 NonValidators: int(req.NonValidators), 104 Peers: int(req.Peers), 105 }, 106 req.Msg, 107 ) 108 return &emptypb.Empty{}, err 109 }