// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "zenserver.h" namespace cxxopts { class Options; } namespace zen::LuaConfig { struct Options; } namespace zen { class HttpApiService; class HttpHubService; struct ZenHubServerConfig : public ZenServerConfig { std::string UpstreamNotificationEndpoint; std::string InstanceId; // For use in notifications }; struct ZenHubServerConfigurator : public ZenServerConfiguratorBase { ZenHubServerConfigurator(ZenHubServerConfig& ServerOptions) : ZenServerConfiguratorBase(ServerOptions), m_ServerOptions(ServerOptions) { } ~ZenHubServerConfigurator() = default; private: virtual void AddCliOptions(cxxopts::Options& Options) override; virtual void AddConfigOptions(LuaConfig::Options& Options) override; virtual void ApplyOptions(cxxopts::Options& Options) override; virtual void OnConfigFileParsed(LuaConfig::Options& LuaOptions) override; virtual void ValidateOptions() override; ZenHubServerConfig& m_ServerOptions; }; class ZenHubServerMain : public ZenServerMain { public: ZenHubServerMain(ZenHubServerConfig& ServerOptions); virtual void DoRun(ZenServerState::ZenServerEntry* Entry) override; ZenHubServerMain(const ZenHubServerMain&) = delete; ZenHubServerMain& operator=(const ZenHubServerMain&) = delete; typedef ZenHubServerConfig Config; typedef ZenHubServerConfigurator Configurator; private: ZenHubServerConfig& m_ServerOptions; }; class ZenHubServer : public ZenServerBase { ZenHubServer& operator=(ZenHubServer&&) = delete; ZenHubServer(ZenHubServer&&) = delete; public: ZenHubServer(); ~ZenHubServer(); int Initialize(const ZenHubServerConfig& ServerConfig, ZenServerState::ZenServerEntry* ServerEntry); void Run(); void Cleanup(); void SetDedicatedMode(bool State) { m_IsDedicatedMode = State; } void SetTestMode(bool State) { m_TestMode = State; } void SetDataRoot(std::filesystem::path Root) { m_DataRoot = Root; } void SetContentRoot(std::filesystem::path Root) { m_ContentRoot = Root; } private: bool m_IsDedicatedMode = false; bool m_TestMode = false; std::filesystem::path m_DataRoot; std::filesystem::path m_ContentRoot; bool m_DebugOptionForcedCrash = false; std::unique_ptr m_HubService; std::unique_ptr m_ApiService; void InitializeState(const ZenHubServerConfig& ServerConfig); void InitializeServices(const ZenHubServerConfig& ServerConfig); void RegisterServices(const ZenHubServerConfig& ServerConfig); }; } // namespace zen