0e09a1ed4b
The 1680-line server.rs is split: - handshake.rs: perform_auth_handshake helper + close_with_auth_failed + auth tests + start_auth_listener / close_listener_auth_failed test helpers + AuthListenerResult enum - server.rs: crdt_sync_handler (now invokes perform_auth_handshake) + wait_for_sync_text + broadcast/e2e/keepalive tests Auth handshake (Steps 1-3 of the WebSocket handshake) is a self-contained sequence that takes &mut SplitSink + &mut SplitStream and returns Option<AuthMessage>. The caller observes None to mean the connection has already been closed with the appropriate close code. No behaviour change. All 63 crdt_sync tests pass; full suite green.