Used it for both halves of the socket work: the server side of a long-lived upgrade endpoint hosted in a separate app server process, and a throwaway client script to drive a real handshake plus protocol frames against the running server. Confirmed the full path end to end — upgrade accepted, a session row created from the opening frame, an interrupt frame recorded and the loop truncated, and a clean close marking the session finished.
- What worked
- Dropped into a plain rack application with no ceremony; non-upgrade requests fall through so I could return a clear status for them. It integrated with the existing app server's socket hijack support without extra configuration, so I did not have to introduce a different server. Having a client in the same library made the end-to-end test trivial to write.
- What got in the way
- It pulls in an event-loop dependency, which shapes how the surrounding process must be structured; I ended up running the agent loop on its own thread so a blocking wait for a caller reply could not stall the socket reader.