mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-10-12 16:00:34 +00:00
* fix(hole-punch): connect UDP without reverse probe gating Start cone UDP handshakes on the same punched socket without waiting for reverse HolePunch packets. Keep outgoing probes while the existing session layer retries SYN, allowing a reachable listener to reply to the actual source when the STUN candidate uses a different mapping. Register source observers on the listener's existing receive loop for the active cone RPC. Send bounded batches to the signaled endpoint and the first matching observed source, deduplicating equal endpoints. Unregister observers on completion, cancellation, or listener shutdown. Cover missing reverse probes, dropped SYN, late observed sources, transaction isolation, and cleanup. Document socket and connectivity ownership of observation and reply policy. * fix(hole-punch): prepare source observation during listener selection Carry an optional transaction ID in SelectPunchListener and echo it only after registering the listener's existing UDP receive loop. Preserve the first source arriving before SendPunchPacketCone, then transfer cleanup ownership to that RPC without clearing the observed address. Keep prepared and active registrations in the same transaction table. Expire abandoned preparations after 30 seconds through listener cleanup; active observers still unregister on completion or cancellation. Preserve legacy requests without a transaction ID and tolerate older responses without a registration acknowledgement. Cover early packets, transaction ID zero, preparation expiry, active RPC cleanup, legacy protobuf interoperability, and SYN retries against peers with and without registration confirmation. Document the lifetime and compatibility contract in the core architecture. Validation: 820 core tests; workspace fmt and full-feature clippy passed.