501f76ac6dce6428e0111b458b42e548a5d61641
The I/O edge of the friends-only idle listener: bind/probe/serve a ping->pong over a dedicated ALPN (peerspeak/friends/0), adapted from pixelpass's proven control plane. Request/response, one exchange per connection: probe sends a Ping and reads the Pong; serve accepts, authenticates the remote id, and asks an injected handler (which wraps presence::should_answer + builds the pong) what to reply -- None for a stranger/invisible, so the listener reveals nothing to non-friends. Verified by a loopback integration test over two real iroh endpoints (ignored by default): the allowed prober gets a Pong with the room; a fresh stranger id gets an empty, unusable reply. 256 lib tests + the loopback (run with --ignored) green, clippy clean (incl --all-targets), release builds. DEFERRED (next session, needs care + 2 machines): spawning serve on a persistent endpoint OUTSIDE the per-join room session, and the ping scheduler. Real fork noted in the module: a second always-on endpoint shares our node id with the room endpoint (possible relay collision) vs refactoring to one persistent endpoint -- intentionally not decided at 5am. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>