diff options
Diffstat (limited to 'backend/internal/sse/broadcaster.go')
| -rw-r--r-- | backend/internal/sse/broadcaster.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/backend/internal/sse/broadcaster.go b/backend/internal/sse/broadcaster.go new file mode 100644 index 0000000..02dbc65 --- /dev/null +++ b/backend/internal/sse/broadcaster.go @@ -0,0 +1,42 @@ +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: + } + } +} |