deec79ab22
Peers can now end their relay session with a post-handshake Disconnect control message, but the relay previously only returned from the peer loop. Explicitly close that peer connection before leaving the room so graceful disconnects are finite from both sides. The relay still runs the normal leave path after the close. That keeps room cleanup, session removal, and PeerLeft notification centralized, while the PeerLeft reason now comes from the peer's Disconnect message. The integration test covers two connected clients. One sends a TimedOut Disconnect, the relay closes that client connection, and the remaining peer receives PeerLeft with the TimedOut reason. Test Plan: - cargo fmt --check - cargo test -p lanparty-relay \ forwards_graceful_disconnect_reason_to_remaining_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