package server2 import ( "context" "fmt" "log/slog" "net" spb "ibd-trader/api/gen/idb/stock/v1" upb "ibd-trader/api/gen/idb/user/v1" "ibd-trader/internal/database" "ibd-trader/internal/leader/manager/ibd/scrape" "ibd-trader/internal/redis/taskqueue" "ibd-trader/internal/server2/idb/stock/v1" "ibd-trader/internal/server2/idb/user/v1" "cloud.google.com/go/longrunning/autogen/longrunningpb" "github.com/redis/go-redis/v9" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) type Server struct { s *grpc.Server port uint16 } func New( ctx context.Context, port uint16, db database.Database, rClient *redis.Client, ) (*Server, error) { scrapeQueue, err := taskqueue.New( ctx, rClient, scrape.Queue, "grpc-server", taskqueue.WithEncoding[scrape.TaskInfo](scrape.QueueEncoding)) if err != nil { return nil, err } s := grpc.NewServer() upb.RegisterUserServiceServer(s, user.New(db)) spb.RegisterStockServiceServer(s, stock.New(db, scrapeQueue)) longrunningpb.RegisterOperationsServer(s, newOperationServer(scrapeQueue)) reflection.Register(s) return &Server{s, port}, nil } func (s *Server) Serve(ctx context.Context) error { lis, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port)) if err != nil { return err } // Graceful shutdown go func() { <-ctx.Done() slog.ErrorContext(ctx, "Shutting down server", "err", ctx.Err(), "cause", context.Cause(ctx), ) s.s.GracefulStop() }() slog.InfoContext(ctx, "Starting gRPC server", "port", s.port) return s.s.Serve(lis) }