retry socket creation (#1093)

* retry sockey creation

* more

* more

* more

* more
This commit is contained in:
Logan McNaughton 2026-06-16 16:22:53 +02:00 committed by GitHub
parent b123ed9fa3
commit f211eede3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -363,6 +363,16 @@ fn advance_frame(device: &mut device::Device) {
}
}
fn create_socket(builder: matchbox_socket::WebRtcSocketBuilder) -> matchbox_socket::WebRtcSocket {
let (socket, loop_fut) = builder.build();
tokio::spawn(async move {
if let Err(e) = loop_fut.await {
eprintln!("WebRTC loop failed: {}", e);
}
});
socket
}
pub fn init(
device: &mut device::Device,
netplay_config: &NetplayConfig,
@ -384,17 +394,11 @@ pub fn init(
eprintln!("Using default ICE config");
}
let (mut socket, loop_fut) = builder.build();
tokio::spawn(async move {
if let Err(e) = loop_fut.await {
eprintln!("WebRTC loop failed: {}", e);
}
});
let mut socket = create_socket(builder.clone());
let now = std::time::Instant::now();
let timeout = std::time::Duration::from_secs(30);
let socket_timeout = std::time::Duration::from_secs_f64(rand::random_range(8.0..10.0));
let mut player_numbers = std::collections::BTreeMap::new();
player_numbers.insert(netplay_config.player_number, None);
ui::video::onscreen_message(
"Connecting to netplay peers...",
@ -408,16 +412,23 @@ pub fn init(
.connected_peers()
.collect::<Vec<matchbox_socket::PeerId>>();
send_player_number(socket.channel_mut(1), peers, netplay_config.player_number);
get_player_numbers(socket.channel_mut(1), &mut player_numbers);
if player_numbers.len() == netplay_config.number_of_players {
break;
if peers.len() == netplay_config.number_of_players - 1 {
player_numbers.insert(netplay_config.player_number, None);
send_player_number(socket.channel_mut(1), peers, netplay_config.player_number);
get_player_numbers(socket.channel_mut(1), &mut player_numbers);
if player_numbers.len() == netplay_config.number_of_players {
break;
}
} else if now.elapsed() > socket_timeout {
socket.close();
ui::video::onscreen_message(
"Could not connect to netplay peers, retrying...",
ui::video::MESSAGE_LENGTH_MESSAGE_SHORT,
);
player_numbers.clear();
socket = create_socket(builder.clone());
}
if now.elapsed() > timeout {
eprintln!("Could not connect to netplay peers");
return None;
}
unsafe { sdl3_sys::events::SDL_PumpEvents() };
ui::video::render_frame();
ui::video::update_screen();
@ -474,6 +485,7 @@ pub fn init(
let mut session = session_builder.start_p2p_session(matchbox_channel).unwrap();
let now = std::time::Instant::now();
let timeout = std::time::Duration::from_secs(10);
while session.current_state() != ggrs::SessionState::Running {
session.poll_remote_clients();
if now.elapsed() > timeout {