7#include <grpcpp/grpcpp.h>
12#include "absl/strings/str_format.h"
17#include "protos/canvas_automation.grpc.pb.h"
24YazeGRPCServer::YazeGRPCServer() : is_running_(false) {}
26YazeGRPCServer::~YazeGRPCServer() {
30absl::Status YazeGRPCServer::Initialize(
32 emu::IEmulator* emulator,
35 test::TestManager* test_manager,
36 net::RomVersionManager* version_mgr,
37 net::ProposalApprovalManager* approval_mgr,
38 CanvasAutomationServiceImpl* canvas_service) {
40 return absl::FailedPreconditionError(
"Server is already running");
46 if (config_.enable_test_harness && test_manager) {
47 test_harness_service_ =
48 std::make_unique<test::ImGuiTestHarnessServiceImpl>(test_manager);
49 std::cout <<
"✓ ImGuiTestHarness service initialized\n";
53 if (config_.enable_emulator_service && emulator) {
54 emulator_service_ = std::make_unique<net::EmulatorServiceImpl>(
55 emulator, rom_getter, rom_loader);
56 std::cout <<
"✓ Emulator service initialized\n";
57 }
else if (config_.enable_emulator_service) {
58 std::cout <<
"⚠ Emulator service requested but no emulator provided\n";
62 if (config_.enable_rom_service && rom_getter) {
63 rom_service_ = std::make_unique<net::RomServiceImpl>(
64 rom_getter, version_mgr, approval_mgr);
67 net::RomServiceImpl::Config rom_config;
68 rom_config.require_approval_for_writes =
69 config_.require_approval_for_rom_writes;
70 rom_service_->SetConfig(rom_config);
72 std::cout <<
"✓ ROM service initialized\n";
73 }
else if (config_.enable_rom_service) {
74 std::cout <<
"⚠ ROM service requested but no ROM provided\n";
78 if (config_.enable_canvas_automation && canvas_service) {
80 canvas_service_ = canvas_service;
81 std::cout <<
"✓ Canvas Automation service initialized\n";
82 }
else if (config_.enable_canvas_automation) {
83 std::cout <<
"⚠ Canvas Automation requested but no service provided\n";
86 if (!test_harness_service_ && !rom_service_ && !canvas_service_ && !emulator_service_) {
87 return absl::InvalidArgumentError(
88 "At least one service must be enabled and initialized");
91 return absl::OkStatus();
94absl::Status YazeGRPCServer::Start() {
95 auto status = BuildServer();
100 std::cout <<
"✓ YAZE gRPC automation server listening on 0.0.0.0:"
101 << config_.port <<
"\n";
103 if (test_harness_service_) {
104 std::cout <<
" ✓ ImGuiTestHarness available\n";
106 if (emulator_service_) {
107 std::cout <<
" ✓ EmulatorService available\n";
110 std::cout <<
" ✓ ROM service available\n";
112 if (canvas_service_) {
113 std::cout <<
" ✓ Canvas Automation available\n";
116 std::cout <<
"\nServer is ready to accept requests...\n";
121 return absl::OkStatus();
124absl::Status YazeGRPCServer::StartAsync() {
125 auto status = BuildServer();
130 std::cout <<
"✓ Unified gRPC server started on port " << config_.port <<
"\n";
133 return absl::OkStatus();
136absl::Status YazeGRPCServer::AddService(
137 std::unique_ptr<grpc::Service> service) {
139 return absl::InvalidArgumentError(
"Service is null");
142 return absl::FailedPreconditionError(
143 "Cannot add services after the server has started");
145 extra_services_.push_back(std::move(service));
146 return absl::OkStatus();
149void YazeGRPCServer::Shutdown() {
150 if (server_ && is_running_) {
151 std::cout <<
"⏹ Shutting down unified gRPC server...\n";
155 std::cout <<
"✓ Server stopped\n";
159bool YazeGRPCServer::IsRunning()
const {
163absl::Status YazeGRPCServer::BuildServer() {
165 return absl::FailedPreconditionError(
"Server already running");
168 std::string server_address = absl::StrFormat(
"0.0.0.0:%d", config_.port);
170 grpc::ServerBuilder builder;
173 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
176 if (test_harness_service_) {
178 test_harness_grpc_wrapper_ =
179 test::CreateImGuiTestHarnessServiceGrpc(test_harness_service_.get());
180 std::cout <<
" Registering ImGuiTestHarness service...\n";
181 builder.RegisterService(test_harness_grpc_wrapper_.get());
184 if (emulator_service_) {
185 std::cout <<
" Registering EmulatorService...\n";
186 builder.RegisterService(emulator_service_.get());
190 std::cout <<
" Registering ROM service...\n";
191 builder.RegisterService(rom_service_.get());
194 if (canvas_service_) {
195 std::cout <<
" Registering Canvas Automation service...\n";
197 canvas_grpc_service_ = CreateCanvasAutomationServiceGrpc(canvas_service_);
198 builder.RegisterService(canvas_grpc_service_.get());
201 for (
auto& service : extra_services_) {
202 builder.RegisterService(service.get());
206 server_ = builder.BuildAndStart();
209 return absl::InternalError(
210 absl::StrFormat(
"Failed to start server on %s", server_address));
215 return absl::OkStatus();