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 }