websocket-session-handshake-lifecycle
Installation
SKILL.md
The handshake travels on the socket it is opening
A WebSocket has no request/response shape: the answer to your first message arrives on the same
stream as everything else, through the same reader. So the reader has to exist before the message
goes out, and something has to bridge "a frame arrived in the read loop" back to "the caller waiting
for the handshake". A CompletableDeferred is that bridge.