start()'s "never received an ANSWER" branch called session.stop() directly (blocking, unbounded, not even off the async runtime's worker thread) and capture.close().await with no timeout -- the exact same freeze-the-whole-daemon hazard Self::stop() was just bounded against, just at a different call site. An unresponsive receiver hits this path by definition (that's what a negotiation timeout means), so it's not a hypothetical: reproduced live just now, wedging the daemon for over a minute with no way to recover short of kill -9. Factored the bound into stop_session_bounded/close_capture_bounded so both call sites share one implementation instead of drifting. |
||
|---|---|---|
| .. | ||
| src | ||
| Cargo.toml | ||