Our Info panel, hole punch race fix, NAT profiles in relay introduction
- Network Diagnostics: "Our Info" button shows addresses with NAT status, device role, UPnP, HTTP capability. Addresses stacked for mobile. - Hole punch race: re-check for existing connection before and after relay introduction to avoid wasting minutes on redundant punch attempts. - Relay introduction now carries requester/target NAT mapping+filtering so hole punch strategy uses fresh profiles instead of stale stored ones. Critical for phones that switch between WiFi/cellular/VPN. - STUN fix: filter DNS results to IPv4 (was resolving to IPv6 first on dual-stack, causing silent send failure and "NAT unknown"). - Welcome screen: Ready button with loading bar for instant feed access. - LAN addresses show just "LAN" (no misleading punchability label). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e354ccc388
commit
be253e8001
7 changed files with 266 additions and 9 deletions
|
|
@ -461,6 +461,12 @@ pub struct RelayIntroducePayload {
|
|||
pub requester_addresses: Vec<String>,
|
||||
/// Max forwarding hops remaining (0 = relay must know target directly)
|
||||
pub ttl: u8,
|
||||
/// Requester's current NAT mapping type (for hole punch strategy)
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub nat_mapping: Option<String>,
|
||||
/// Requester's current NAT filtering type
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub nat_filtering: Option<String>,
|
||||
}
|
||||
|
||||
/// Target's response to a relay introduction (bi-stream response)
|
||||
|
|
@ -472,6 +478,12 @@ pub struct RelayIntroduceResultPayload {
|
|||
/// Relay is willing to serve as stream relay fallback
|
||||
pub relay_available: bool,
|
||||
pub reject_reason: Option<String>,
|
||||
/// Target's current NAT mapping type (for hole punch strategy)
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub nat_mapping: Option<String>,
|
||||
/// Target's current NAT filtering type
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
pub nat_filtering: Option<String>,
|
||||
}
|
||||
|
||||
/// Open a relay pipe — intermediary splices two bi-streams (bi-stream)
|
||||
|
|
@ -858,6 +870,8 @@ mod tests {
|
|||
requester: [2u8; 32],
|
||||
requester_addresses: vec!["10.0.0.2:4433".to_string()],
|
||||
ttl: 1,
|
||||
nat_mapping: Some("eim".to_string()),
|
||||
nat_filtering: Some("open".to_string()),
|
||||
};
|
||||
let json = serde_json::to_string(&payload).unwrap();
|
||||
let decoded: RelayIntroducePayload = serde_json::from_str(&json).unwrap();
|
||||
|
|
@ -876,6 +890,8 @@ mod tests {
|
|||
target_addresses: vec!["10.0.0.1:4433".to_string(), "192.168.1.1:4433".to_string()],
|
||||
relay_available: true,
|
||||
reject_reason: None,
|
||||
nat_mapping: Some("eim".to_string()),
|
||||
nat_filtering: Some("open".to_string()),
|
||||
};
|
||||
let json = serde_json::to_string(&payload).unwrap();
|
||||
let decoded: RelayIntroduceResultPayload = serde_json::from_str(&json).unwrap();
|
||||
|
|
@ -892,6 +908,8 @@ mod tests {
|
|||
target_addresses: vec![],
|
||||
relay_available: false,
|
||||
reject_reason: Some("target not reachable".to_string()),
|
||||
nat_mapping: None,
|
||||
nat_filtering: None,
|
||||
};
|
||||
let json2 = serde_json::to_string(&rejected).unwrap();
|
||||
let decoded2: RelayIntroduceResultPayload = serde_json::from_str(&json2).unwrap();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue