Hi Darren, I believe what you want can for the most part be accomplished by:
1. first calling uv_shutdown(), then
2. waiting a few milliseconds to read any outstanding data and receive
the EOF (in case of a cooperating client), and
3. finish by calling uv_close().
You probably cannot completely avoid TIME_WAIT that way, though. A
client that simply stops replying at the TCP level because of (e.g.) a
network error could still get stuck in that state. I think in that
specific case it would make sense to set SO_LINGER to zero before
closing the socket.
If you want to pursue this, can you file an issue in the bug tracker?