package server import ( "crypto/tls" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "github.com/zitadel/zitadel/internal/api/authz" grpc_api "github.com/zitadel/zitadel/internal/api/grpc" "github.com/zitadel/zitadel/internal/api/grpc/server/middleware" "github.com/zitadel/zitadel/internal/logstore" "github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/telemetry/metrics" system_pb "github.com/zitadel/zitadel/pkg/grpc/system" ) type Server interface { Gateway RegisterServer(*grpc.Server) AppName() string MethodPrefix() string AuthMethods() authz.MethodMapping } func CreateServer( verifier *authz.TokenVerifier, authConfig authz.Config, queries *query.Queries, hostHeaderName string, tlsConfig *tls.Config, accessSvc *logstore.Service, ) *grpc.Server { metricTypes := []metrics.MetricType{metrics.MetricTypeTotalCount, metrics.MetricTypeRequestCount, metrics.MetricTypeStatusCode} serverOptions := []grpc.ServerOption{ grpc.UnaryInterceptor( grpc_middleware.ChainUnaryServer( middleware.CallDurationHandler(), middleware.DefaultTracingServer(), middleware.MetricsHandler(metricTypes, grpc_api.Probes...), middleware.NoCacheInterceptor(), middleware.ErrorHandler(), middleware.InstanceInterceptor(queries, hostHeaderName, system_pb.SystemService_MethodPrefix), middleware.AccessStorageInterceptor(accessSvc), middleware.AuthorizationInterceptor(verifier, authConfig), middleware.TranslationHandler(), middleware.ValidationHandler(), middleware.ServiceHandler(), middleware.QuotaExhaustedInterceptor(accessSvc, system_pb.SystemService_MethodPrefix), ), ), } if tlsConfig != nil { serverOptions = append(serverOptions, grpc.Creds(credentials.NewTLS(tlsConfig))) } return grpc.NewServer(serverOptions...) }