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  }