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 }