consumer: BindSession — the reply#2 reader + e2e suite
- BindSession::bind (open → no-auth → BIND → reply#1, capturing
BND.ADDR) + reply1() (the BindReply1 handle) + await_inbound (the
POC #5 read_reply2 — hand-read with the forked read_address codec,
no second codec, ADR-011) returning BindDataPlane (into_inner /
get_socket_mut + AsyncRead/AsyncWrite forwards)
- Teardown ownership (the CONNECT session's posture): Drop sync-reap +
structural EOF, close() graceful, teardown-at-birth on in-stream
refusals, no Clone (compile_fail-asserted)
- Typed error surface: open failures ride SocksSessionError::Open
(ADR-049 reasons); the command gate's 0x02 and factory-failure
reply#1 codes surface from bind as Rfc; accept-stage reply#2 codes
surface at await_inbound
- tests/consumer-bind.rs: 9 e2e tests over the harness (round-trip,
data-plane accessors, gate refusal, both failure mappings,
quiet-wait garbage, drop teardown + health, the CONNECT+BIND
regression guard, the Send probe)
Verification: cargo test (259 incl. the doctest), clippy -D warnings
(native + wasm), fmt, both wasm checks, cargo doc clean.