The /logs and /events handlers wrote frames with conn.WriteMessage and never set a write deadline. A client that stopped reading but kept the TCP connection open could fill the kernel send buffer and park the handler goroutine on a write forever, leaking the request context, the broker subscription, and the log producer.
Add a wsWriteWait constant (10s) and call SetWriteDeadline before every WriteMessage in the logs drain loop and in streamEvents. The keep-alive ping and the closing close-frame already used WriteControl, which takes a deadline argument directly; raise their bounds from 1s to wsWriteWait for consistency. A stuck peer now fails the next write within ~10s and the handler unwinds cleanly.