package sse import ( "sync" ) type Broadcaster struct { mu sync.RWMutex subscribers map[chan []byte]struct{} } func NewBroadcaster() *Broadcaster { return &Broadcaster{ subscribers: make(map[chan []byte]struct{}), } } func (b *Broadcaster) Subscribe() chan []byte { ch := make(chan []byte, 64) b.mu.Lock() b.subscribers[ch] = struct{}{} b.mu.Unlock() return ch } func (b *Broadcaster) Unsubscribe(ch chan []byte) { b.mu.Lock() delete(b.subscribers, ch) b.mu.Unlock() close(ch) } func (b *Broadcaster) Publish(data []byte) { b.mu.RLock() defer b.mu.RUnlock() for ch := range b.subscribers { select { case ch <- data: default: } } }