Handle for an in-flight UDP session whose forwarder task already
runs in the background. join resolves with the session’s terminal
CloseReason after the forwarder unwinds (idle timeout, peer EOF,
listener cancellation, or upstream send failure). cancel
propagates the executor’s cancel token (typically the listener’s
force_cancel) into the forwarder loop. The fetch is responsible
for inserting the matching DispatchTable entry on session start
and removing it as the join future resolves — vane-core stays
agnostic about the table type.
Bridge between the executor’s ByteTunnel arm and a fetch’s chosen
transport. Bidi is the stream-pair shape that
tokio::io::copy_bidirectional consumes — covers TCP forward, TLS
passthrough, and the H1 WebSocket post-upgrade path. Udp is the
session-driven shape: the fetch has already spawned the per-5-tuple
forwarder task; the executor’s role degenerates to awaiting
join so ConnContext cleanup runs at the right moment.