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

@@ -9,7 +9,7 @@ use std::{
use futures::stream::FuturesUnordered;
use lanspread_db::content_manifest::ContentId;
use lanspread_proto::PeerEndpoint;
use tokio::sync::mpsc::UnboundedSender;
use crate::PeerEventSender;
use tokio_util::sync::CancellationToken;
use super::{
@@ -153,7 +153,7 @@ pub(crate) struct DownloadGameRequest<'a> {
pub(crate) sources: &'a [PeerEndpoint],
pub(crate) content_id: ContentId,
pub(crate) quarantine: &'a ContentQuarantine,
pub(crate) tx_notify_ui: UnboundedSender<PeerEvent>,
pub(crate) tx_notify_ui: PeerEventSender,
pub(crate) cancel_token: CancellationToken,
pub(crate) quic: QuicConnector,
}
@@ -372,7 +372,7 @@ struct TransferContext<'a> {
sources: &'a [PeerEndpoint],
content_id: ContentId,
quarantine: &'a ContentQuarantine,
tx_notify_ui: &'a UnboundedSender<PeerEvent>,
tx_notify_ui: &'a PeerEventSender,
cancel_token: &'a CancellationToken,
quic: &'a QuicConnector,
version_buffer: Arc<VersionIniBuffer>,