@@ -1380,11 +1380,13 @@ fn calculate_relay_set_internal(
13801380 _ => 2 , // unreachable due to filter
13811381 } ) ;
13821382
1383- let limit = max_relays. unwrap_or ( usize:: MAX ) ;
1383+ let contact_relay_limit = max_relays. unwrap_or ( usize:: MAX ) ;
1384+ let user_relay_count = relay_set. len ( ) ;
13841385
13851386 // Pass 2: Add first relay from each contact (priority order)
13861387 for contact in & eligible_contacts {
1387- if relay_set. len ( ) >= limit {
1388+ let contact_relays_added = relay_set. len ( ) - user_relay_count;
1389+ if contact_relays_added >= contact_relay_limit {
13881390 break ;
13891391 }
13901392 if let Some ( first_relay) = contact. relays . first ( ) {
@@ -1395,7 +1397,8 @@ fn calculate_relay_set_internal(
13951397 // Pass 3: Fill remaining slots with additional contact relays
13961398 for contact in & eligible_contacts {
13971399 for relay in contact. relays . iter ( ) . skip ( 1 ) {
1398- if relay_set. len ( ) >= limit {
1400+ let contact_relays_added = relay_set. len ( ) - user_relay_count;
1401+ if contact_relays_added >= contact_relay_limit {
13991402 return relay_set;
14001403 }
14011404 relay_set. insert ( relay. clone ( ) ) ;
@@ -1458,6 +1461,30 @@ mod relay_calculation_tests {
14581461 assert ! ( result. contains( & url:: Url :: parse( "wss://trusted.com" ) . unwrap( ) ) ) ;
14591462 }
14601463
1464+ #[ test]
1465+ fn test_contact_relays_added_when_user_relays_exceed_limit ( ) {
1466+ let user_relays = vec ! [
1467+ url:: Url :: parse( "wss://user1.com" ) . unwrap( ) ,
1468+ url:: Url :: parse( "wss://user2.com" ) . unwrap( ) ,
1469+ url:: Url :: parse( "wss://user3.com" ) . unwrap( ) ,
1470+ ] ;
1471+ let contacts = vec ! [
1472+ create_test_contact( TrustLevel :: Trusted , vec![ "wss://contact1.com" ] ) ,
1473+ create_test_contact( TrustLevel :: Trusted , vec![ "wss://contact2.com" ] ) ,
1474+ ] ;
1475+ let max_relays = Some ( 2 ) ; // Lower than user relay count
1476+
1477+ let result = calculate_relay_set_internal ( & user_relays, & contacts, max_relays) ;
1478+
1479+ // Should have all 3 user relays + 2 contact relays (user relays exempt from limit)
1480+ assert_eq ! ( result. len( ) , 5 ) ;
1481+ assert ! ( result. contains( & url:: Url :: parse( "wss://user1.com" ) . unwrap( ) ) ) ;
1482+ assert ! ( result. contains( & url:: Url :: parse( "wss://user2.com" ) . unwrap( ) ) ) ;
1483+ assert ! ( result. contains( & url:: Url :: parse( "wss://user3.com" ) . unwrap( ) ) ) ;
1484+ assert ! ( result. contains( & url:: Url :: parse( "wss://contact1.com" ) . unwrap( ) ) ) ;
1485+ assert ! ( result. contains( & url:: Url :: parse( "wss://contact2.com" ) . unwrap( ) ) ) ;
1486+ }
1487+
14611488 #[ test]
14621489 fn test_one_relay_per_contact_guaranteed ( ) {
14631490 let user_relays = vec ! [ ] ;
0 commit comments