package grpcprocess
import (
)
type ClientConn interface {
grpc.ClientConnInterface
process.Runner
}
type ClientFunc func(context.Context) (*grpc.ClientConn, error)
func ( ClientFunc) ClientConn {
return &client{connect: }
}
type client struct {
connect ClientFunc
conn atomic.Pointer[grpc.ClientConn]
}
func ( *client) ( context.Context, process.Callback) error {
, := .connect()
if != nil {
return
}
.conn.Store()
:= ()
.conn.CompareAndSwap(, nil)
_ = .Close()
return
}
func ( *client) (
context.Context,
string,
, any,
...grpc.CallOption,
) error {
, := .load()
if != nil {
return
}
return .Invoke(, , , , ...)
}
func ( *client) (
context.Context,
*grpc.StreamDesc,
string,
...grpc.CallOption,
) (grpc.ClientStream, error) {
, := .load()
if != nil {
return nil,
}
return .NewStream(, , , ...)
}
func ( *client) () (*grpc.ClientConn, error) {
:= .conn.Load()
if == nil {
return nil, status.Error(
codes.Canceled,
"grpcprocess: client connection is not running",
)
}
return , nil
}