package server import ( "context" "fmt" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_zap "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" "go.uber.org/zap" "google.golang.org/grpc" "net" "penahub.gitlab.yandexcloud.net/backend/quiz/core/internal/initialize" "penahub.gitlab.yandexcloud.net/backend/quiz/core/internal/proto/notifyer" "time" ) type GRPC struct { grpc *grpc.Server logger *zap.Logger } func NewGRPC(logger *zap.Logger) (*GRPC, error) { grpcStreamInterceptor := grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( grpc_zap.StreamServerInterceptor(logger), grpc_recovery.StreamServerInterceptor(), )) grpcUnaryInterceptor := grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer( grpc_zap.UnaryServerInterceptor(logger), grpc_recovery.UnaryServerInterceptor(), )) return &GRPC{ grpc: grpc.NewServer(grpcStreamInterceptor, grpcUnaryInterceptor, grpc.ConnectionTimeout(5*time.Second)), logger: logger, }, nil } type DepsGrpcRun struct { Host string Port string } func (g *GRPC) Run(config DepsGrpcRun) { connectionString := fmt.Sprintf("%s:%s", config.Host, config.Port) g.logger.Info("Starting GRPC Server", zap.String("host", connectionString)) if err := g.listen(connectionString); err != nil && err != grpc.ErrServerStopped { g.logger.Error("GRPC Listen error", zap.Error(err)) } } func (g *GRPC) Stop(_ context.Context) error { g.grpc.GracefulStop() g.logger.Info("Shutting down GRPC server...") return nil } func (g *GRPC) Register(reg initialize.GRpcControllers) *GRPC { notifyer.RegisterQuizServiceServer(g.grpc, reg.MailNotify) // another return g } func (g *GRPC) listen(address string) error { listener, err := net.Listen("tcp", address) if err != nil { return err } return g.grpc.Serve(listener) }