mitiru::network
Networking primitives: socket abstraction, RPC, replication, and the lockstep transport used by deterministic multiplayer.
Networking primitives: socket abstraction, RPC, replication, and the lockstep transport used by deterministic multiplayer.
class INetworkTransport 9
virtual ~INetworkTransport() = defaultvirtual bool listen(std::uint16_t port) = 0virtual bool connect(std::string_view host, std::uint16_t port) = 0virtual void disconnect(ConnectionId id) = 0virtual void send(ConnectionId id, const std::vector<std::uint8_t>& data) = 0[[nodiscard]] virtual std::vector<NetworkMessage> poll() = 0[[nodiscard]] virtual bool isConnected(ConnectionId id) const = 0[[nodiscard]] virtual NetworkStats stats() const = 0using Timestamp = std::uint64_t;struct TimestampedState 1
Timestamp time = 0class LagCompensator 12
using LerpFunc = std::function<State(const State&, const State&, float)>;explicit LagCompensator(std::size_t capacity = kDefaultCapacity)void setLerpFunction(LerpFunc func)void recordState(Timestamp time, State state)[[nodiscard]] std::optional<State> rewindTo(Timestamp time) const[[nodiscard]] std::optional<State> interpolate( Timestamp t1, Timestamp t2, float alpha) const[[nodiscard]] std::optional<State> interpolateAt(Timestamp time) const[[nodiscard]] std::size_t stateCount() const noexcept[[nodiscard]] std::size_t capacity() const noexcept[[nodiscard]] Timestamp oldestTimestamp() const noexcept[[nodiscard]] Timestamp newestTimestamp() const noexceptvoid clear() noexceptclass Lobby 7
void addPlayer(ConnectionId id, std::string name)void removePlayer(ConnectionId id)void setReady(ConnectionId id, bool ready)[[nodiscard]] bool allReady() const[[nodiscard]] std::size_t playerCount() const noexcept[[nodiscard]] const std::vector<Player>& players() const noexcept[[nodiscard]] std::string toJson() constenum RoomState : std::uint8_t 4
Waiting = 0Starting = 1InGame = 2Closed = 3enum LobbyEvent : std::uint8_t 8
RoomCreated = 0RoomDestroyed = 1PlayerJoined = 2PlayerLeft = 3PlayerReady = 4AllReady = 5GameStarting = 6RoomDiscovered = 7struct RoomInfo 13
std::uint32_t roomId = 0std::string namestd::string hostAddressstd::uint16_t hostPort = 0std::uint32_t currentPlayers = 0std::uint32_t maxPlayers = 4RoomState state = RoomState::Waitingstd::string gameModefloat lastSeenTime = 0.0f[[nodiscard]] bool isFull() const noexcept[[nodiscard]] bool isJoinable() const noexcept[[nodiscard]] nlohmann::json toJson() const[[nodiscard]] static std::optional<RoomInfo> fromJson(const nlohmann::json& j)struct LobbyEventInfo 4
LobbyEvent event = LobbyEvent::RoomCreatedstd::uint32_t roomId = 0ConnectionId playerId = INVALID_CONNECTIONstd::string detailstruct LobbyConfig 4
std::uint16_t discoveryPort = 27016float broadcastIntervalSec = 2.0ffloat roomTimeoutSec = 10.0fstd::string discoveryMagic = "MITIRU_LOBBY_V1"class LobbySystem 25
using EventCallback = std::function<void(const LobbyEventInfo&)>;using GameStartCallback = std::function<void(const RoomInfo&, const Lobby&)>;std::uint32_t createRoom(std::string_view name, std::uint32_t maxPlayers = 4, std::string_view gameMode = "")void destroyRoom(std::uint32_t roomId)bool joinRoom(std::uint32_t roomId, ConnectionId playerId, std::string_view playerName)void leaveRoom(std::uint32_t roomId, ConnectionId playerId)void setReady(std::uint32_t roomId, ConnectionId playerId, bool ready)bool tryStartGame(std::uint32_t roomId)bool startDiscovery()void stopDiscovery()void update(float deltaTimeSec)[[nodiscard]] std::vector<RoomInfo> discoveredRooms() const[[nodiscard]] const RoomInfo* getRoom(std::uint32_t roomId) const[[nodiscard]] const Lobby* getLobby(std::uint32_t roomId) const[[nodiscard]] std::size_t hostedRoomCount() const noexcept[[nodiscard]] LobbyConfig& config() noexcept[[nodiscard]] const LobbyConfig& config() const noexceptvoid setEventCallback(EventCallback callback)void setGameStartCallback(GameStartCallback callback)~LobbySystem()LobbySystem() = defaultLobbySystem(const LobbySystem&) = deleteLobbySystem& operator=(const LobbySystem&) = deleteLobbySystem(LobbySystem&&) = deleteLobbySystem& operator=(LobbySystem&&) = deleteclass LocalTransport : public INetworkTransport 8
static void pair(LocalTransport& a, LocalTransport& b)bool listen(std::uint16_t ) overridebool connect(std::string_view , std::uint16_t ) overridevoid disconnect(ConnectionId ) overridevoid send(ConnectionId id, const std::vector<std::uint8_t>& data) override[[nodiscard]] std::vector<NetworkMessage> poll() override[[nodiscard]] bool isConnected(ConnectionId ) const override[[nodiscard]] NetworkStats stats() const overrideenum MessageType : std::uint8_t 8
Connect = 0Disconnect = 1Heartbeat = 2GameState = 3Input = 4RPC = 5LobbyAction = 6Custom = 255enum DeliveryMode : std::uint8_t 8
Unreliable = 0Reliable = 1ReliableOrdered = 2[[nodiscard]] inline GameMessage heartbeat(ConnectionId senderId)[[nodiscard]] inline GameMessage connectRequest(std::string_view playerName)[[nodiscard]] inline GameMessage disconnectNotice( ConnectionId senderId, std::string_view reason = "")[[nodiscard]] inline GameMessage gameState( ConnectionId senderId, const nlohmann::json& stateJson)[[nodiscard]] inline GameMessage input( ConnectionId senderId, const nlohmann::json& inputJson)struct GameMessage 14
MessageType type = MessageType::CustomConnectionId senderId = INVALID_CONNECTIONstd::uint32_t sequenceNumber = 0std::uint64_t timestampMs = 0DeliveryMode delivery = DeliveryMode::Reliablestd::uint8_t channel = 0std::vector<std::uint8_t> payloadvoid stampNow() noexceptvoid setJsonPayload(const nlohmann::json& j)[[nodiscard]] std::optional<nlohmann::json> jsonPayload() constvoid setTextPayload(std::string_view text)[[nodiscard]] std::string textPayload() const[[nodiscard]] std::vector<std::uint8_t> toBytes() const[[nodiscard]] static std::optional<GameMessage> fromBytes( const std::vector<std::uint8_t>& data)struct ReplicatedProperty 3
std::string nameint numValues = 3uint32_t lastUpdateFrame = 0struct ReplicatedEntity 5
int nodeId = -1uint32_t networkId = 0uint8_t ownerPeerId = 0std::vector<ReplicatedProperty> propertiesbool dirty = falsestruct DeadReckoningState 2
double timestamp = 0.0void predict(double t, float outPos[3]) const noexceptclass ReplicationManager 4
void registerEntity(int nodeId, uint8_t ownerPeerId)void updateProperty(uint32_t networkId, const std::string& propName, const float* values, int numValues)[[nodiscard]] std::vector<uint8_t> serializeDirty()[[nodiscard]] size_t entityCount() const noexceptenum SessionMode : std::uint8_t 4
None = 0Server = 1Client = 2P2P = 3enum PeerState : std::uint8_t 4
Connecting = 0Connected = 1Disconnecting = 2Disconnected = 3enum SessionEvent : std::uint8_t 5
PeerConnected = 0PeerDisconnected = 1PeerTimedOut = 2SessionStarted = 3SessionEnded = 4struct PeerInfo 7
ConnectionId connectionId = INVALID_CONNECTIONstd::string namePeerState state = PeerState::Disconnectedfloat latencyMs = 0.0ffloat lastHeartbeatTime = 0.0ffloat connectedSince = 0.0fstd::uint32_t nextSequence = 0struct SessionConfig 6
float heartbeatIntervalSec = 1.0ffloat timeoutSec = 10.0ffloat reconnectDelaySec = 3.0fstd::uint32_t maxPeers = 16bool autoReconnect = truestd::string playerName = "Player"struct SessionEventInfo 3
SessionEvent event = SessionEvent::PeerConnectedConnectionId peerId = INVALID_CONNECTIONstd::string detailclass NetworkSession 25
using EventCallback = std::function<void(const SessionEventInfo&)>;using MessageHandler = std::function<void(const GameMessage&)>;bool hostAsServer(std::uint16_t port, std::shared_ptr<INetworkTransport> transport)bool joinAsClient(std::string_view host, std::uint16_t port, std::shared_ptr<INetworkTransport> transport)bool startP2P(std::uint16_t port, std::shared_ptr<INetworkTransport> transport)void shutdown()void update(float deltaTimeSec)void sendTo(ConnectionId peerId, GameMessage msg)void broadcast(GameMessage msg)void broadcastGameState(const nlohmann::json& stateJson)void sendInput(const nlohmann::json& inputJson)[[nodiscard]] std::vector<GameMessage> receive()[[nodiscard]] const PeerInfo* getPeer(ConnectionId peerId) const[[nodiscard]] const std::unordered_map<ConnectionId, PeerInfo>& peers() const noexcept[[nodiscard]] std::size_t connectedPeerCount() const noexceptvoid disconnectPeer(ConnectionId peerId, std::string_view reason = "")[[nodiscard]] SessionConfig& config() noexcept[[nodiscard]] const SessionConfig& config() const noexcept[[nodiscard]] SessionMode mode() const noexceptvoid setLocalId(ConnectionId id) noexcept[[nodiscard]] ConnectionId localId() const noexceptvoid setEventCallback(EventCallback callback)void onMessage(MessageType type, MessageHandler handler)[[nodiscard]] bool isActive() const noexcept[[nodiscard]] float elapsedTime() const noexceptenum AuthorityMode : std::uint8_t 4
HostAuthoritative = 0OwnerAuthoritative = 1Shared = 2[[nodiscard]] inline nlohmann::json lerpJsonNumeric( const nlohmann::json& a, const nlohmann::json& b, float alpha)class SyncableComponent 9
virtual ~SyncableComponent() = default[[nodiscard]] virtual std::uint32_t syncId() const = 0[[nodiscard]] virtual nlohmann::json serialize() const = 0virtual void deserialize(const nlohmann::json& j) = 0[[nodiscard]] virtual bool isDirty() constvirtual void clearDirty()void markDirty()[[nodiscard]] ConnectionId ownerId() const noexceptvoid setOwnerId(ConnectionId id) noexceptstruct StateDelta 5
std::uint64_t version = 0std::uint64_t timestampMs = 0nlohmann::json states[[nodiscard]] nlohmann::json toJson() const[[nodiscard]] static std::optional<StateDelta> fromJson(const nlohmann::json& j)struct SyncSnapshot 2
std::uint64_t timestampMs = 0nlohmann::json stateclass SyncManager 16
`using InterpolateFunc = std::function<nlohmann::json( const nlohmann::json&, const nlohmann::json&, float)>;`void registerComponent(SyncableComponent* component)void unregisterComponent(std::uint32_t syncId)void setAuthorityMode(AuthorityMode mode) noexceptvoid setLocalPeerId(ConnectionId id) noexcept[[nodiscard]] bool hasAuthority(std::uint32_t syncId) constvoid setIsHost(bool isHost) noexcept[[nodiscard]] StateDelta collectDirtyStates()void applyRemoteDelta(const StateDelta& delta)void interpolate(std::uint64_t renderTimeMs)void extrapolate(std::uint64_t currentTimeMs, std::uint64_t maxExtrapolateMs = 200)void setInterpolateFunc(InterpolateFunc func)[[nodiscard]] std::size_t componentCount() const noexcept[[nodiscard]] nlohmann::json fullSnapshot() constvoid applyFullSnapshot(const nlohmann::json& snapshot)void clearSnapshots()enum NetworkEvent 6
ConnectedDisconnectedDataReceivedErrorusing ConnectionId = std::uint32_t;constexpr ConnectionId INVALID_CONNECTION = 0struct PacketHeader 3
std::uint32_t size = 0std::uint32_t type = 0std::uint32_t sequence = 0struct NetworkMessage 3
ConnectionId sender = INVALID_CONNECTIONPacketHeader headerstd::vector<std::uint8_t> payloadstruct NetworkStats 6
std::uint64_t bytesSent = 0std::uint64_t bytesReceived = 0std::uint64_t packetsSent = 0std::uint64_t packetsReceived = 0float latencyMs = 0.0ffloat packetLoss = 0.0fstruct TestResult 3
std::string namebool passed = falsestd::string detailstruct ValidationReport 3
bool allPassed = falsestd::vector<TestResult> results[[nodiscard]] std::string toJson() constclass NetworkValidator 5
[[nodiscard]] bool testLocalTransport() const[[nodiscard]] bool testTcpLoopback() const[[nodiscard]] bool testStateSync() const[[nodiscard]] bool testLobby() const[[nodiscard]] ValidationReport runAll() constenum ConnectionStatus : std::uint8_t 5
Connecting = 0ConnectedDisconnectedFailed[[nodiscard]] inline std::unique_ptr<IReliableTransport> createReliableTransport()struct ReceivedPacket 4
ConnectionId connectionId = INVALID_CONNECTIONstd::vector<std::uint8_t> datastd::uint32_t size = 0bool reliable = trueclass IReliableTransport 11
virtual ~IReliableTransport() = defaultvirtual bool listen(std::uint16_t port) = 0virtual ConnectionId connect(std::string_view address, std::uint16_t port) = 0virtual void disconnect(ConnectionId connId) = 0virtual void send(ConnectionId connId, const void* data, std::uint32_t size, bool reliable = true) = 0[[nodiscard]] virtual std::vector<ReceivedPacket> receive() = 0virtual void poll() = 0[[nodiscard]] virtual ConnectionStatus getConnectionStatus( ConnectionId connId) const = 0void setOnConnected(std::function<void(ConnectionId)> callback)void setOnDisconnected(std::function<void(ConnectionId)> callback)void setOnData(std::function<void(const ReceivedPacket&)> callback)class GnsReliableTransport : public IReliableTransport 13
GnsReliableTransport()~GnsReliableTransport() overrideGnsReliableTransport(const GnsReliableTransport&) = deleteGnsReliableTransport& operator=(const GnsReliableTransport&) = deleteGnsReliableTransport(GnsReliableTransport&&) = deleteGnsReliableTransport& operator=(GnsReliableTransport&&) = deletebool listen(std::uint16_t port) overrideConnectionId connect(std::string_view address, std::uint16_t port) overridevoid disconnect(ConnectionId connId) overridevoid send(ConnectionId connId, const void* data, std::uint32_t size, bool reliable) override[[nodiscard]] std::vector<ReceivedPacket> receive() overridevoid poll() override[[nodiscard]] ConnectionStatus getConnectionStatus( ConnectionId connId) const overrideclass NullReliableTransport : public IReliableTransport 19
bool listen([[maybe_unused]] std::uint16_t port) overrideConnectionId connect([[maybe_unused]] std::string_view address, [[maybe_unused]] std::uint16_t port) overridevoid disconnect([[maybe_unused]] ConnectionId connId) overridevoid send([[maybe_unused]] ConnectionId connId, [[maybe_unused]] const void* data, [[maybe_unused]] std::uint32_t size, [[maybe_unused]] bool reliable) override[[nodiscard]] std::vector<ReceivedPacket> receive() overridevoid poll() override[[nodiscard]] ConnectionStatus getConnectionStatus( [[maybe_unused]] ConnectionId connId) const overrideusing SocketHandle = SOCKET;using SocketHandle = int;inline constexpr SocketHandle INVALID_SOCK = INVALID_SOCKETinline constexpr SocketHandle INVALID_SOCK = -1inline constexpr int SOCK_ERR = SOCKET_ERRORinline constexpr int SOCK_ERR = -1inline constexpr int WOULD_BLOCK_ERR = WSAEWOULDBLOCKinline constexpr int WOULD_BLOCK_ERR = EWOULDBLOCK[[nodiscard]] inline int lastSocketError() noexcept[[nodiscard]] inline bool isWouldBlock(int err) noexceptinline void closeSocket(SocketHandle sock) noexcept[[nodiscard]] inline bool setNonBlocking(SocketHandle sock) noexceptclass WsaGuard 7
WsaGuard() noexcept~WsaGuard() noexcept[[nodiscard]] bool isInitialized() const noexceptWsaGuard(const WsaGuard&) = deleteWsaGuard& operator=(const WsaGuard&) = deleteWsaGuard(WsaGuard&&) = deleteWsaGuard& operator=(WsaGuard&&) = deleteclass StateSync 6
void setAuthority(bool isServer) noexceptvoid pushState(std::string stateJson)[[nodiscard]] std::string latestState() const[[nodiscard]] std::uint64_t stateVersion() const noexceptvoid acknowledgeVersion(std::uint64_t version)[[nodiscard]] std::size_t pendingCount() const noexceptclass TcpTransport : public INetworkTransport 16
TcpTransport() = default~TcpTransport() overrideTcpTransport(const TcpTransport&) = deleteTcpTransport& operator=(const TcpTransport&) = deleteTcpTransport(TcpTransport&&) = deleteTcpTransport& operator=(TcpTransport&&) = delete[[nodiscard]] bool isWsaInitialized() const noexcept[[nodiscard]] uint16_t getLocalPort() const noexceptbool listen(std::uint16_t port) overridebool connect(std::string_view host, std::uint16_t port) overridevoid disconnect(ConnectionId id) overridevoid send(ConnectionId id, const std::vector<std::uint8_t>& data) override[[nodiscard]] std::vector<NetworkMessage> poll() override[[nodiscard]] bool isConnected(ConnectionId id) const override[[nodiscard]] NetworkStats stats() const override[[nodiscard]] bool isListening() const noexceptclass UdpTransport : public INetworkTransport 16
UdpTransport() = default~UdpTransport() overrideUdpTransport(const UdpTransport&) = deleteUdpTransport& operator=(const UdpTransport&) = deleteUdpTransport(UdpTransport&&) = deleteUdpTransport& operator=(UdpTransport&&) = delete[[nodiscard]] bool isInitialized() const noexcept[[nodiscard]] uint16_t getLocalPort() const noexceptbool listen(std::uint16_t port) overridebool connect(std::string_view host, std::uint16_t port) overridevoid disconnect(ConnectionId id) overridevoid send(ConnectionId id, const std::vector<std::uint8_t>& data) override[[nodiscard]] std::vector<NetworkMessage> poll() override[[nodiscard]] bool isConnected(ConnectionId id) const override[[nodiscard]] NetworkStats stats() const override[[nodiscard]] bool isServerMode() const noexceptenum WsOpcode : std::uint8_t 6
Continuation = 0x0Text = 0x1Binary = 0x2Close = 0x8Ping = 0x9Pong = 0xAstruct WsFrameHeader 5
bool fin = falseWsOpcode opcode = WsOpcode::Binarybool masked = falsestd::uint64_t payloadLen = 0std::size_t headerSize = 0class WebSocketTransport : public INetworkTransport 14
WebSocketTransport() = default~WebSocketTransport() overrideWebSocketTransport(const WebSocketTransport&) = deleteWebSocketTransport& operator=(const WebSocketTransport&) = deleteWebSocketTransport(WebSocketTransport&&) = deleteWebSocketTransport& operator=(WebSocketTransport&&) = deletebool listen(std::uint16_t port) overridebool connect(std::string_view host, std::uint16_t port) overridevoid disconnect(ConnectionId id) overridevoid send(ConnectionId id, const std::vector<std::uint8_t>& data) override[[nodiscard]] std::vector<NetworkMessage> poll() override[[nodiscard]] bool isConnected(ConnectionId id) const override[[nodiscard]] NetworkStats stats() const override[[nodiscard]] uint16_t getLocalPort() const noexceptSourced from docs/API_CATALOG.md, auto-generated by tools/generate_api_catalog.py.