aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/sse
diff options
context:
space:
mode:
Diffstat (limited to 'backend/internal/sse')
-rw-r--r--backend/internal/sse/broadcaster.go42
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:
+ }
+ }
+}