package v1 import ( "context" "log/slog" "time" "buf.build/gen/go/grpc/grpc/connectrpc/go/grpc/health/v1/healthv1connect" v1 "buf.build/gen/go/grpc/grpc/protocolbuffers/go/grpc/health/v1" "connectrpc.com/connect" ) const healthCheckInterval = 100 * time.Millisecond var _ healthv1connect.HealthHandler = (*healthServer)(nil) func NewHealthServer(logger *slog.Logger) healthv1connect.HealthHandler { return &healthServer{ logger: logger, } } type healthServer struct { logger *slog.Logger } func (h *healthServer) Check(context.Context, *connect.Request[v1.HealthCheckRequest]) (*connect.Response[v1.HealthCheckResponse], error) { resp := &v1.HealthCheckResponse{ Status: v1.HealthCheckResponse_SERVING, } return connect.NewResponse(resp), nil } func (h *healthServer) Watch(ctx context.Context, _ *connect.Request[v1.HealthCheckRequest], stream *connect.ServerStream[v1.HealthCheckResponse]) error { ticker := time.NewTicker(healthCheckInterval) defer ticker.Stop() select { case <-ticker.C: err := stream.Send(&v1.HealthCheckResponse{ Status: v1.HealthCheckResponse_SERVING, }) if err != nil { h.logger.Error("Failed to send response", slog.String("err", err.Error())) } return nil case <-ctx.Done(): return nil } }