July 13 2026
Fixed
- Make
SubscriptionManager.Destroysafe to call concurrently and more than once by guarding teardown withsync.Once, flippingchannelsOpenunder the write lock, and closing each exit channel exactly once, eliminating the data race andclose of closed channelpanic. - Bound each
ListenerManager.announce*send with a 60s per-listener deadline so a stalled or absent consumer no longer parks the announce goroutine (and the event it holds) indefinitely, fixing an unbounded goroutine leak;copyListenersnow takes anRLocksince it only reads.