Partial: Dedicated Peer distribution system
All checks were successful
CI / Formatting (push) Successful in 1m7s

This is an uncompleted commit to move the work over to my other machine. Should compile though.
This commit is contained in:
Michael Bradley 2025-07-09 19:37:46 -04:00
parent 4db82f328b
commit 1a5a628000
Signed by: MichaelBradley
SSH key fingerprint: SHA256:o/aaeYtRubILK7OYYjYP12DmU7BsPUhKji1AgaQ+ge4
6 changed files with 161 additions and 53 deletions

View file

@ -3,16 +3,18 @@ use std::time::Duration;
use bevy::prelude::*;
use uuid::Uuid;
use crate::net::peer::PotentialPeer;
use super::{
packet::{InboundPacket, OutboundPacket, Packet},
peer::{Peer, PeerChangeEvent, PeerMap, PeerReceiveTiming, PeerSendTiming},
peer::{Peer, PeerChangeEvent, PeerData, PeerMap, PeerReceiveTiming, PeerSendTiming},
queues::{NetworkReceive, NetworkSend},
};
pub fn handle_network_input(
from_socket: Res<NetworkReceive>,
peer_map: Res<PeerMap>,
mut peers: Query<(&Peer, &mut PeerReceiveTiming)>,
mut peers: Query<(&PeerData, &mut PeerReceiveTiming)>,
mut to_app: EventWriter<InboundPacket>,
time: Res<Time>,
mut change_peer: EventWriter<PeerChangeEvent>,
@ -44,8 +46,7 @@ pub fn handle_network_input(
pub fn handle_network_output(
mut from_app: EventReader<OutboundPacket>,
peer_map: Res<PeerMap>,
mut peers: Query<(&Peer, &mut PeerSendTiming)>,
config: Res<Config>,
mut peers: Query<(&PeerData, &mut PeerSendTiming)>,
to_socket: Res<NetworkSend>,
time: Res<Time>,
) -> Result {
@ -53,8 +54,8 @@ pub fn handle_network_output(
let peer_id = peer_map.try_get(&packet.0.peer)?;
let (peer, mut last) = peers.get_mut(*peer_id)?;
// Append our UUID for client identification
let message = [packet.0.message.as_slice(), config.id.as_bytes()].concat();
to_socket.send(message, peer.addr)?;
let message = [packet.0.message.as_slice(), peer.me.as_bytes()].concat();
to_socket.send(message, peer.addr.into())?;
last.update(&time);
}
Ok(())
@ -63,17 +64,24 @@ pub fn handle_network_output(
const TIMEOUT: Duration = Duration::from_secs(10);
pub fn heartbeat(
peers: Query<(&Peer, &PeerSendTiming)>,
peers: Query<(AnyOf<(&Peer, &PotentialPeer)>, &PeerSendTiming)>,
time: Res<Time>,
mut outbound: EventWriter<OutboundPacket>,
) {
) -> Result {
for (peer, last) in peers {
// Allow for 2 consecutive missed heartbeats without timing out
if last.time() + TIMEOUT / 3 > time.elapsed() {
continue;
}
outbound.write(OutboundPacket(Packet::new(Vec::new(), peer.uuid)));
let id = match peer {
(None, None) => return Err("No peer identification".into()),
(None, Some(potential)) => potential.id,
(Some(actual), None) => actual.id,
(Some(_), Some(_)) => return Err("Both a potential and actual peer".into()),
};
outbound.write(OutboundPacket(Packet::new(Vec::new(), id)));
}
Ok(())
}
pub fn timeout(
@ -82,22 +90,9 @@ pub fn timeout(
mut delete: EventWriter<PeerChangeEvent>,
) {
for (peer, last) in peers {
if let Some(previous) = last.time() {
if previous + TIMEOUT < time.elapsed() {
warn!("Peer {} timed out", peer.uuid);
delete.write(PeerChangeEvent::new(peer.uuid, None));
}
if last.time() + TIMEOUT < time.elapsed() {
warn!("Peer {} timed out", peer.id);
delete.write(PeerChangeEvent::new(peer.id, None));
}
}
}
#[derive(Debug, Resource)]
pub struct Config {
pub id: Uuid,
}
impl Config {
pub fn new() -> Self {
Self { id: Uuid::new_v4() }
}
}