package grpc import ( "context" "crypto/tls" "net" "github.com/micro/go-micro/v2/broker" "github.com/micro/go-micro/v2/codec" "github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/server" "github.com/micro/go-micro/v2/transport" "google.golang.org/grpc" "google.golang.org/grpc/encoding" ) type codecsKey struct{} type grpcOptions struct{} type netListener struct{} type maxMsgSizeKey struct{} type tlsAuth struct{} // gRPC Codec to be used to encode/decode requests for a given content type func Codec(contentType string, c encoding.Codec) server.Option { return func(o *server.Options) { codecs := make(map[string]encoding.Codec) if o.Context == nil { o.Context = context.Background() } if v := o.Context.Value(codecsKey{}); v != nil { codecs = v.(map[string]encoding.Codec) } codecs[contentType] = c o.Context = context.WithValue(o.Context, codecsKey{}, codecs) } } // AuthTLS should be used to setup a secure authentication using TLS func AuthTLS(t *tls.Config) server.Option { return func(o *server.Options) { if o.Context == nil { o.Context = context.Background() } o.Context = context.WithValue(o.Context, tlsAuth{}, t) } } // Listener specifies the net.Listener to use instead of the default func Listener(l net.Listener) server.Option { return func(o *server.Options) { if o.Context == nil { o.Context = context.Background() } o.Context = context.WithValue(o.Context, netListener{}, l) } } // Options to be used to configure gRPC options func Options(opts ...grpc.ServerOption) server.Option { return func(o *server.Options) { if o.Context == nil { o.Context = context.Background() } o.Context = context.WithValue(o.Context, grpcOptions{}, opts) } } // // MaxMsgSize set the maximum message in bytes the server can receive and // send. Default maximum message size is 4 MB. // func MaxMsgSize(s int) server.Option { return func(o *server.Options) { if o.Context == nil { o.Context = context.Background() } o.Context = context.WithValue(o.Context, maxMsgSizeKey{}, s) } } func newOptions(opt ...server.Option) server.Options { opts := server.Options{ Codecs: make(map[string]codec.NewCodec), Metadata: map[string]string{}, } for _, o := range opt { o(&opts) } if opts.Broker == nil { opts.Broker = broker.DefaultBroker } if opts.Registry == nil { opts.Registry = registry.DefaultRegistry } if opts.Transport == nil { opts.Transport = transport.DefaultTransport } if len(opts.Address) == 0 { opts.Address = server.DefaultAddress } if len(opts.Name) == 0 { opts.Name = server.DefaultName } if len(opts.Id) == 0 { opts.Id = server.DefaultId } if len(opts.Version) == 0 { opts.Version = server.DefaultVersion } return opts }