// Package client is an interface for an RPC client package client import ( "context" "time" "go.unistack.org/micro/v4/codec" "go.unistack.org/micro/v4/metadata" ) var ( // DefaultClient is the global default client DefaultClient = NewClient() // DefaultContentType is the default content-type if not specified DefaultContentType = "" // DefaultBackoff is the default backoff function for retries (minimum 10 millisecond and maximum 5 second) DefaultBackoff = BackoffInterval(10*time.Millisecond, 5*time.Second) // DefaultRetry is the default check-for-retry function for retries DefaultRetry = RetryNever // DefaultRetries is the default number of times a request is tried DefaultRetries = 0 // DefaultRequestTimeout is the default request timeout DefaultRequestTimeout = time.Second * 5 // DefaultPoolSize sets the connection pool size DefaultPoolSize = 100 // DefaultPoolTTL sets the connection pool ttl DefaultPoolTTL = time.Minute ) // Client is the interface used to make requests to services. // It also supports bidirectional streaming of requests. type Client interface { Name() string Init(opts ...Option) error Options() Options NewRequest(service string, endpoint string, req interface{}, opts ...RequestOption) Request Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error) String() string } type ( FuncCall func(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error HookCall func(next FuncCall) FuncCall FuncStream func(ctx context.Context, req Request, opts ...CallOption) (Stream, error) HookStream func(next FuncStream) FuncStream ) // Request is the interface for a synchronous request used by Call or Stream type Request interface { // The service to call Service() string // The action to take Method() string // The endpoint to invoke Endpoint() string // The content type ContentType() string // The unencoded request body Body() interface{} // Write to the encoded request writer. This is nil before a call is made Codec() codec.Codec // indicates whether the request will be a streaming one rather than unary Stream() bool } // Response is the response received from a service type Response interface { // Read the response Codec() codec.Codec // Header data Header() metadata.Metadata // Read the undecoded response Read() ([]byte, error) } // Stream is the interface for a bidirectional synchronous stream type Stream interface { // Context for the stream Context() context.Context // The request made Request() Request // The response read Response() Response // Send will encode and send a request Send(msg interface{}) error // Recv will decode and read a response Recv(msg interface{}) error // SendMsg will encode and send a request SendMsg(msg interface{}) error // RecvMsg will decode and read a response RecvMsg(msg interface{}) error // Error returns the stream error Error() error // Close closes the stream Close() error // CloseSend closes the send direction of the stream CloseSend() error } // Option used by the Client type Option func(*Options) // CallOption used by Call or Stream type CallOption func(*CallOptions) // RequestOption used by NewRequest type RequestOption func(*RequestOptions)