package grpc import ( "fmt" "net" "os" "os/signal" "github.com/go-logr/logr" "edge-infra.dev/pkg/lib/fog" syscall "golang.org/x/sys/unix" "google.golang.org/grpc" "google.golang.org/grpc/reflection" "edge-infra.dev/pkg/edge/datasync/chirp/persister" "edge-infra.dev/pkg/edge/datasync/chirp/server/http" "edge-infra.dev/pkg/edge/datasync/internal/config" protos "edge-infra.dev/pkg/edge/datasync/internal/protos/upload" ) type Server struct { server *grpc.Server logger logr.Logger config *config.Config } func NewServer(msgPersister persister.MessagePersister, cfg *config.Config) *Server { server := grpc.NewServer() messagingService := NewMessagingService(msgPersister, cfg) protos.RegisterMessagingServiceServer(server, messagingService) reflection.Register(server) return &Server{server: server, logger: fog.New(), config: cfg} } func (s *Server) ListenAndServe() { port := s.config.GrpcPort lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) if err != nil { s.logger.Error(err, "failed to listen on tcp address") } else { http.SetIsGRPCServerReady(true) } term := make(chan os.Signal, 1) signal.Notify(term, syscall.SIGINT, syscall.SIGTERM) go func() { <-term s.logger.Info("got termination signal. attempting graceful shutdown") s.server.GracefulStop() }() s.logger.Info("starting gRPC server") err = s.server.Serve(lis) if err != nil { s.logger.Error(err, "failed to serve gRPC") } s.logger.Info("gRPC server shutdown completed") }