github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/common/appsender/appsender_client.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  	"github.com/MetalBlockchain/metalgo/ids"
    10  	"github.com/MetalBlockchain/metalgo/snow/engine/common"
    11  	"github.com/MetalBlockchain/metalgo/utils/set"
    12  
    13  	appsenderpb "github.com/MetalBlockchain/metalgo/proto/pb/appsender"
    14  )
    15  
    16  var _ common.AppSender = (*Client)(nil)
    17  
    18  type Client struct {
    19  	client appsenderpb.AppSenderClient
    20  }
    21  
    22  // NewClient returns a client that is connected to a remote AppSender.
    23  func NewClient(client appsenderpb.AppSenderClient) *Client {
    24  	return &Client{client: client}
    25  }
    26  
    27  func (c *Client) SendCrossChainAppRequest(ctx context.Context, chainID ids.ID, requestID uint32, appRequestBytes []byte) error {
    28  	_, err := c.client.SendCrossChainAppRequest(
    29  		ctx,
    30  		&appsenderpb.SendCrossChainAppRequestMsg{
    31  			ChainId:   chainID[:],
    32  			RequestId: requestID,
    33  			Request:   appRequestBytes,
    34  		},
    35  	)
    36  	return err
    37  }
    38  
    39  func (c *Client) SendCrossChainAppResponse(ctx context.Context, chainID ids.ID, requestID uint32, appResponseBytes []byte) error {
    40  	_, err := c.client.SendCrossChainAppResponse(
    41  		ctx,
    42  		&appsenderpb.SendCrossChainAppResponseMsg{
    43  			ChainId:   chainID[:],
    44  			RequestId: requestID,
    45  			Response:  appResponseBytes,
    46  		},
    47  	)
    48  	return err
    49  }
    50  
    51  func (c *Client) SendCrossChainAppError(ctx context.Context, chainID ids.ID, requestID uint32, errorCode int32, errorMessage string) error {
    52  	_, err := c.client.SendCrossChainAppError(
    53  		ctx,
    54  		&appsenderpb.SendCrossChainAppErrorMsg{
    55  			ChainId:      chainID[:],
    56  			RequestId:    requestID,
    57  			ErrorCode:    errorCode,
    58  			ErrorMessage: errorMessage,
    59  		},
    60  	)
    61  
    62  	return err
    63  }
    64  
    65  func (c *Client) SendAppRequest(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) error {
    66  	nodeIDsBytes := make([][]byte, nodeIDs.Len())
    67  	i := 0
    68  	for nodeID := range nodeIDs {
    69  		nodeIDsBytes[i] = nodeID.Bytes()
    70  		i++
    71  	}
    72  	_, err := c.client.SendAppRequest(
    73  		ctx,
    74  		&appsenderpb.SendAppRequestMsg{
    75  			NodeIds:   nodeIDsBytes,
    76  			RequestId: requestID,
    77  			Request:   request,
    78  		},
    79  	)
    80  	return err
    81  }
    82  
    83  func (c *Client) SendAppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error {
    84  	_, err := c.client.SendAppResponse(
    85  		ctx,
    86  		&appsenderpb.SendAppResponseMsg{
    87  			NodeId:    nodeID.Bytes(),
    88  			RequestId: requestID,
    89  			Response:  response,
    90  		},
    91  	)
    92  	return err
    93  }
    94  
    95  func (c *Client) SendAppError(ctx context.Context, nodeID ids.NodeID, requestID uint32, errorCode int32, errorMessage string) error {
    96  	_, err := c.client.SendAppError(ctx,
    97  		&appsenderpb.SendAppErrorMsg{
    98  			NodeId:       nodeID[:],
    99  			RequestId:    requestID,
   100  			ErrorCode:    errorCode,
   101  			ErrorMessage: errorMessage,
   102  		},
   103  	)
   104  
   105  	return err
   106  }
   107  
   108  func (c *Client) SendAppGossip(
   109  	ctx context.Context,
   110  	config common.SendConfig,
   111  	msg []byte,
   112  ) error {
   113  	nodeIDs := make([][]byte, config.NodeIDs.Len())
   114  	i := 0
   115  	for nodeID := range config.NodeIDs {
   116  		nodeIDs[i] = nodeID.Bytes()
   117  		i++
   118  	}
   119  	_, err := c.client.SendAppGossip(
   120  		ctx,
   121  		&appsenderpb.SendAppGossipMsg{
   122  			NodeIds:       nodeIDs,
   123  			Validators:    uint64(config.Validators),
   124  			NonValidators: uint64(config.NonValidators),
   125  			Peers:         uint64(config.Peers),
   126  			Msg:           msg,
   127  		},
   128  	)
   129  	return err
   130  }