eedd03b98c
The relay now sends PeerJoined catch-up events to a newly accepted peer for peers that were already present in the room. This makes lifecycle delivery symmetric enough for clients and gateways to learn the current room membership after welcome, not only future joins. The catch-up list is built from a cloned room snapshot before opening control event streams, so room state is not locked across QUIC I/O. Delivery remains best-effort and uses the same one-frame unidirectional control stream path as live PeerJoined and PeerLeft notifications. Test Plan: - cargo fmt --check - cargo test -p lanparty-relay \ forwards_ethernet_datagrams_between_joined_peers -- --nocapture - cargo test -p lanparty-relay - cargo clippy -p lanparty-relay --all-targets -- -D warnings - cargo test --workspace - cargo clippy --workspace --all-targets -- -D warnings - git diff --check Refs: PLAN.md