GameBootstrap¶
Point d'entrée et orchestrateur du serveur R-Type.
Synopsis¶
#include "infrastructure/bootstrap/GameBootstrap.hpp"
int main(void) {
using infrastructure::bootstrap::GameBootstrap;
server::logging::Logger::init();
try {
GameBootstrap gameBootstrap;
gameBootstrap.launch();
} catch (const std::exception& e) {
// Handle error
}
server::logging::Logger::shutdown();
return 0;
}
Déclaration¶
namespace infrastructure::bootstrap {
class GameBootstrap {
public:
GameBootstrap() = default;
void launch();
private:
void server();
};
} // namespace infrastructure::bootstrap
Architecture Serveur¶
flowchart TB
subgraph Bootstrap["GameBootstrap"]
IOCtx[boost::asio::io_context]
ThreadPool[Thread Pool<br/>4 workers]
end
subgraph Network["Serveurs Réseau"]
TCP[TCPAuthServer<br/>Port 4125 + TLS]
UDP[UDPServer<br/>Port 4124]
Voice[VoiceUDPServer<br/>Port 4126]
end
subgraph Shared["Composants Partagés"]
SM[SessionManager]
RM[RoomManager]
end
subgraph Persistence["MongoDB"]
UserRepo[UserRepository]
SettingsRepo[UserSettingsRepository]
ChatRepo[ChatMessageRepository]
end
subgraph UI["Interface"]
CLI[ServerCLI]
TUI[TerminalUI]
LogBuffer[LogBuffer]
end
Bootstrap --> Network
Bootstrap --> Shared
Bootstrap --> UI
TCP --> SM
TCP --> RM
UDP --> SM
Voice --> SM
RM --> ChatRepo
style TCP fill:#7c3aed,color:#fff
style UDP fill:#ea580c,color:#fff
style Voice fill:#16a34a,color:#fff
Composants Initialisés¶
Serveurs Réseau¶
| Serveur | Port | Protocole | Description |
|---|---|---|---|
TCPAuthServer |
4125 | TCP + TLS | Authentification, rooms, chat |
UDPServer |
4124 | UDP | Game loop, mouvements, missiles |
VoiceUDPServer |
4126 | UDP | Relay audio Opus |
Composants Partagés¶
| Composant | Partagé entre | Description |
|---|---|---|
SessionManager |
TCP, UDP, Voice | Tokens et sessions utilisateurs |
RoomManager |
TCP | Gestion des salons |
Configuration¶
Variables d'Environnement¶
| Variable | Défaut | Description |
|---|---|---|
MONGODB_URI |
mongodb://localhost:8089 |
URI de connexion MongoDB |
MONGODB_DB |
rtype |
Nom de la base de données |
TLS_CERT_FILE |
certs/server.crt |
Certificat TLS |
TLS_KEY_FILE |
certs/server.key |
Clé privée TLS |
DBConfig¶
struct DBConfig {
std::string connexionString;
std::string dbName;
uint32_t minPoolSize = 1;
uint32_t maxPoolSize = 10;
};
Méthode launch()¶
Lance le serveur et bloque jusqu'à l'arrêt.
Séquence d'initialisation:
- Créer
LogBufferet initialiser le Logger TUI - Créer
boost::asio::io_contextavec work guard - Initialiser MongoDB et les repositories
- Créer
SessionManageretRoomManagerpartagés - Démarrer
TCPAuthServer(port 4125) - Démarrer
UDPServer(port 4124) - Démarrer
VoiceUDPServer(port 4126) - Démarrer
ServerCLIavec callback de shutdown - Configurer gestionnaire de signaux (SIGINT, SIGTERM)
- Lancer thread pool (4 workers)
- Attendre la fin du CLI
Thread Pool¶
constexpr size_t THREAD_POOL_SIZE = 4;
std::vector<std::jthread> threadPool;
for (size_t i = 0; i < THREAD_POOL_SIZE; ++i) {
threadPool.emplace_back([&io_ctx]() {
io_ctx.run();
});
}
Le serveur utilise un pool de 4 threads (std::jthread) pour exécuter les handlers io_context.
Arrêt Propre¶
L'arrêt peut être déclenché par:
- Signal SIGINT/SIGTERM (Ctrl+C)
- Commande CLI (
exitouquit)
// Signal handler
boost::asio::signal_set signals(io_ctx, SIGINT, SIGTERM);
signals.async_wait([&](const boost::system::error_code&, int signum) {
serverCLI.stop();
voiceServer.stop();
udpServer.stop();
tcpAuthServer.stop();
workGuard.reset();
io_ctx.stop();
});
// CLI shutdown callback
serverCLI.setShutdownCallback([&]() {
voiceServer.stop();
udpServer.stop();
tcpAuthServer.stop();
workGuard.reset();
io_ctx.stop();
});
Diagramme de Séquence¶
sequenceDiagram
participant Main
participant Bootstrap as GameBootstrap
participant Logger
participant TCP as TCPAuthServer
participant UDP as UDPServer
participant Voice as VoiceUDPServer
participant CLI as ServerCLI
Main->>Logger: init()
Main->>Bootstrap: launch()
Bootstrap->>Bootstrap: initWithTUI(logBuffer)
Bootstrap->>Bootstrap: Create io_context
Bootstrap->>TCP: start() [port 4125]
Bootstrap->>UDP: start() [port 4124]
Bootstrap->>Voice: start() [port 4126]
Bootstrap->>CLI: start()
Bootstrap->>Bootstrap: Start thread pool (4)
par Thread Pool
loop io_context.run()
TCP-->>TCP: Handle connections
UDP-->>UDP: Handle packets
Voice-->>Voice: Relay audio
end
end
Note over Main: SIGINT received
CLI->>CLI: stop()
Voice->>Voice: stop()
UDP->>UDP: stop()
TCP->>TCP: stop()
Bootstrap-->>Main: return
Main->>Logger: shutdown()
ServerCLI¶
Le serveur inclut une interface en ligne de commande interactive.
| Commande | Description |
|---|---|
status |
Affiche l'état des serveurs |
sessions |
Liste les sessions actives |
rooms |
Liste les salons |
kick <email> |
Expulse un joueur |
exit / quit |
Arrête le serveur |
Repositories MongoDB¶
// Configuration MongoDB
auto mongoConfig = std::make_shared<MongoDBConfiguration>(dbConfig);
// Repositories
auto userRepo = std::make_shared<MongoDBUserRepository>(mongoConfig);
auto userSettingsRepo = std::make_shared<MongoDBUserSettingsRepository>(mongoConfig);
auto chatMessageRepo = std::make_shared<MongoDBChatMessageRepository>(mongoConfig);
| Repository | Collection | Description |
|---|---|---|
MongoDBUserRepository |
users |
Comptes utilisateurs |
MongoDBUserSettingsRepository |
user_settings |
Préférences audio/vidéo |
MongoDBChatMessageRepository |
chat_messages |
Historique chat |