fix(peer): coalesce full UI view publications

Keep one queued and one replaceable pending snapshot for remote-library and Call-to-Play views while preserving lifecycle-event FIFO delivery. Generation barriers and fenced drains prevent stale nonempty views from crossing disable or acknowledgement boundaries.

Test Plan:
- just test
- just clippy
- focused burst, lifecycle ordering, fence, repeated-barrier, and stale-view tests
- independent ordering review
- git diff --check
This commit is contained in:
ddidderr committed 2026-09-12 13:06:10 +02:00
1 parent 470e119515
commit 37420e26ed
17 files changed
+828 -251

No files matched your search

+4 -2
View File
@@ -34,6 +34,7 @@ use lanspread_peer::{
PeerCommand,
PeerEndpoint,
PeerEvent,
PeerEventReceiver,
PeerGameDB,
PeerIdentity,
PeerRuntimeComponent,
@@ -44,6 +45,7 @@ use lanspread_peer::{
StreamInstallSettings,
load_peer_identity,
migrate_legacy_state,
peer_event_channel,
start_peer_with_options,
};
use lanspread_peer_cli::{
@@ -308,7 +310,7 @@ async fn main() -> eyre::Result<()> {
let fixture_seeds = seed_fixtures(&args.games_dir, &args.fixtures)?;
let migration = migrate_legacy_state(&args.games_dir, &args.state_dir).await;
let (tx_events, rx_events) = mpsc::unbounded_channel();
let (tx_events, rx_events) = peer_event_channel();
let peer_game_db = Arc::new(RwLock::new(PeerGameDB::new()));
let catalog_game_db = Arc::new(catalog_game_db);
let active_outbound_transfers: OutboundTransfers = Arc::new(RwLock::new(HashMap::new()));
@@ -865,7 +867,7 @@ async fn wait_peers(shared: &SharedState, count: usize, timeout: Duration) -> ey
}
async fn event_loop(
mut rx_events: mpsc::UnboundedReceiver<PeerEvent>,
mut rx_events: PeerEventReceiver,
shared: Arc<SharedState>,
writer: JsonlWriter,
) {