github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/abci/client/client.go (about)

     1  package abciclient
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sync"
     7  
     8  	"github.com/ari-anchor/sei-tendermint/abci/types"
     9  	"github.com/ari-anchor/sei-tendermint/libs/log"
    10  	"github.com/ari-anchor/sei-tendermint/libs/service"
    11  )
    12  
    13  const (
    14  	dialRetryIntervalSeconds = 3
    15  	echoRetryIntervalSeconds = 1
    16  )
    17  
    18  //go:generate ../../scripts/mockery_generate.sh Client
    19  
    20  // Client defines the interface for an ABCI client.
    21  //
    22  // NOTE these are client errors, eg. ABCI socket connectivity issues.
    23  // Application-related errors are reflected in response via ABCI error codes
    24  // and (potentially) error response.
    25  type Client interface {
    26  	service.Service
    27  	types.Application
    28  
    29  	Error() error
    30  	Flush(context.Context) error
    31  	Echo(context.Context, string) (*types.ResponseEcho, error)
    32  }
    33  
    34  //----------------------------------------
    35  
    36  // NewClient returns a new ABCI client of the specified transport type.
    37  // It returns an error if the transport is not "socket" or "grpc"
    38  func NewClient(logger log.Logger, addr, transport string, mustConnect bool) (Client, error) {
    39  	switch transport {
    40  	case "socket":
    41  		return NewSocketClient(logger, addr, mustConnect), nil
    42  	case "grpc":
    43  		return NewGRPCClient(logger, addr, mustConnect), nil
    44  	default:
    45  		return nil, fmt.Errorf("unknown abci transport %s", transport)
    46  	}
    47  }
    48  
    49  type requestAndResponse struct {
    50  	*types.Request
    51  	*types.Response
    52  
    53  	mtx    sync.Mutex
    54  	signal chan struct{}
    55  }
    56  
    57  func makeReqRes(req *types.Request) *requestAndResponse {
    58  	return &requestAndResponse{
    59  		Request:  req,
    60  		Response: nil,
    61  		signal:   make(chan struct{}),
    62  	}
    63  }
    64  
    65  // markDone marks the ReqRes object as done.
    66  func (r *requestAndResponse) markDone() {
    67  	r.mtx.Lock()
    68  	defer r.mtx.Unlock()
    69  
    70  	close(r.signal)
    71  }