package app import ( "context" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "imageStorage/config" "net" "time" ) type App struct { config *config.Config grpcServer *grpc.Server } type Deps struct { Config *config.Config GrpcServer *grpc.Server } func NewApp(deps Deps) *App { return &App{ config: deps.Config, grpcServer: deps.GrpcServer, } } func (app *App) Start(ctx context.Context) error { serverErr := make(chan error, 1) endpoint := net.JoinHostPort(app.config.App.Host, app.config.App.GrpcPort) go func() { listener, err := net.Listen("tcp", endpoint) if err != nil { log.WithField("err", err).Error("gRPC Server | Listener") serverErr <- err } err = app.grpcServer.Serve(listener) if err != nil { log.WithField("err", err).Error("gRPC Server | Serve") serverErr <- err } }() log.Infof("Starting gRPC server on : %s", endpoint) select { case <-ctx.Done(): log.Info("Shutting down server") shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() done := make(chan struct{}) go func() { app.grpcServer.GracefulStop() close(done) }() select { case <-done: log.Info("Server shutdown complete") case <-shutdownCtx.Done(): app.grpcServer.Stop() } return nil case err := <-serverErr: return err } }