Files
Towards/modules/peer_to_peer/src/PeerWorldController.hpp
T
Martin Slachta f4174eb0c7 #1 - quicr module
2026-08-01 22:43:09 +02:00

79 lines
2.5 KiB
C++

#pragma once
#include "PeerLink.hpp"
#include "WorldStepProcessor.hpp"
#include "Peer.pb.h"
#include "world/World.hpp"
#include <chrono>
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
namespace tw::p2p {
// Encapsulates the peer-to-peer networking layer and lock-step simulation.
//
// Owns the PeerLink (transport), WorldStepProcessor (simulation), peer
// registry, action history, and ack tracking. The caller (TestPeerNode)
// only needs to supply a World and forward a few lifecycle calls.
class PeerWorldController {
public:
PeerWorldController(uint32_t self_id, uint16_t port,
std::unique_ptr<PeerLink> link,
const std::string& registry_path,
World* world);
// Write this node's entry into the shared registry.
void register_self();
// Block until at least expected_count entries appear in the registry.
bool wait_until_peers_registered(
uint32_t expected_count,
std::chrono::milliseconds timeout = std::chrono::milliseconds(30000));
// Initiate outgoing connections to all higher-ID peers in the registry.
void discover_and_connect();
// Accept expected_count incoming connections via the PeerLink listener.
void wait_for_connections(
uint32_t expected_count,
std::chrono::milliseconds timeout = std::chrono::milliseconds(2000));
// One simulation tick. Returns true if the world stepped forward.
bool tick();
uint32_t self_id() const { return m_self_id; }
uint32_t current_frame() const { return m_processor.current_frame(); }
uint64_t rollbacks() const { return m_processor.rollbacks(); }
uint64_t stepped_frames() const { return m_processor.stepped_frames(); }
glm::vec3 peer_position(uint32_t peer_id) const {
return m_processor.peer_position(peer_id);
}
const std::vector<uint32_t>& peer_ids() const { return m_peer_ids; }
uint32_t get_peer_latest_snapshot_frame(uint32_t peer_id) {
}
private:
uint32_t m_self_id;
uint16_t m_port;
std::string m_registry_path;
std::unique_ptr<PeerLink> m_link;
WorldStepProcessor m_processor;
std::vector<uint32_t> m_peer_ids;
std::map<uint32_t, mmo::peer::PeerAction> m_self_history;
std::unordered_map<uint32_t, uint32_t> m_peer_acks;
mmo::peer::PeerAction build_local_action(uint32_t frame) const;
void send_history_to(uint32_t peer_id);
};
} // namespace tw::p2p