7#include <grpcpp/grpcpp.h>
12#include "absl/strings/str_format.h"
16#include "protos/canvas_automation.grpc.pb.h"
23YazeGRPCServer::YazeGRPCServer() : is_running_(false) {}
25YazeGRPCServer::~YazeGRPCServer() {
29absl::Status YazeGRPCServer::Initialize(
30 int port, test::TestManager* test_manager, RomGetter rom_getter,
31 net::RomVersionManager* version_mgr,
32 net::ProposalApprovalManager* approval_mgr,
33 CanvasAutomationServiceImpl* canvas_service) {
35 return absl::FailedPreconditionError(
"Server is already running");
41 if (config_.enable_test_harness && test_manager) {
42 test_harness_service_ =
43 std::make_unique<test::ImGuiTestHarnessServiceImpl>(test_manager);
44 std::cout <<
"✓ ImGuiTestHarness service initialized\n";
48 if (config_.enable_rom_service && rom_getter) {
49 rom_service_ = std::make_unique<net::RomServiceImpl>(
50 rom_getter, version_mgr, approval_mgr);
53 net::RomServiceImpl::Config rom_config;
54 rom_config.require_approval_for_writes =
55 config_.require_approval_for_rom_writes;
56 rom_service_->SetConfig(rom_config);
58 std::cout <<
"✓ ROM service initialized\n";
59 }
else if (config_.enable_rom_service) {
60 std::cout <<
"⚠ ROM service requested but no ROM provided\n";
64 if (config_.enable_canvas_automation && canvas_service) {
66 canvas_service_ = canvas_service;
67 std::cout <<
"✓ Canvas Automation service initialized\n";
68 }
else if (config_.enable_canvas_automation) {
69 std::cout <<
"⚠ Canvas Automation requested but no service provided\n";
72 if (!test_harness_service_ && !rom_service_ && !canvas_service_) {
73 return absl::InvalidArgumentError(
74 "At least one service must be enabled and initialized");
77 return absl::OkStatus();
80absl::Status YazeGRPCServer::Start() {
81 auto status = BuildServer();
86 std::cout <<
"✓ YAZE gRPC automation server listening on 0.0.0.0:"
87 << config_.port <<
"\n";
89 if (test_harness_service_) {
90 std::cout <<
" ✓ ImGuiTestHarness available\n";
93 std::cout <<
" ✓ ROM service available\n";
95 if (canvas_service_) {
96 std::cout <<
" ✓ Canvas Automation available\n";
99 std::cout <<
"\nServer is ready to accept requests...\n";
104 return absl::OkStatus();
107absl::Status YazeGRPCServer::StartAsync() {
108 auto status = BuildServer();
113 std::cout <<
"✓ Unified gRPC server started on port " << config_.port <<
"\n";
116 return absl::OkStatus();
119absl::Status YazeGRPCServer::AddService(
120 std::unique_ptr<grpc::Service> service) {
122 return absl::InvalidArgumentError(
"Service is null");
125 return absl::FailedPreconditionError(
126 "Cannot add services after the server has started");
128 extra_services_.push_back(std::move(service));
129 return absl::OkStatus();
132void YazeGRPCServer::Shutdown() {
133 if (server_ && is_running_) {
134 std::cout <<
"⏹ Shutting down unified gRPC server...\n";
138 std::cout <<
"✓ Server stopped\n";
142bool YazeGRPCServer::IsRunning()
const {
146absl::Status YazeGRPCServer::BuildServer() {
148 return absl::FailedPreconditionError(
"Server already running");
151 std::string server_address = absl::StrFormat(
"0.0.0.0:%d", config_.port);
153 grpc::ServerBuilder builder;
156 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
159 if (test_harness_service_) {
161 test_harness_grpc_wrapper_ =
162 test::CreateImGuiTestHarnessServiceGrpc(test_harness_service_.get());
163 std::cout <<
" Registering ImGuiTestHarness service...\n";
164 builder.RegisterService(test_harness_grpc_wrapper_.get());
168 std::cout <<
" Registering ROM service...\n";
169 builder.RegisterService(rom_service_.get());
172 if (canvas_service_) {
173 std::cout <<
" Registering Canvas Automation service...\n";
175 canvas_grpc_service_ = CreateCanvasAutomationServiceGrpc(canvas_service_);
176 builder.RegisterService(canvas_grpc_service_.get());
179 for (
auto& service : extra_services_) {
180 builder.RegisterService(service.get());
184 server_ = builder.BuildAndStart();
187 return absl::InternalError(
188 absl::StrFormat(
"Failed to start server on %s", server_address));
193 return absl::OkStatus();