aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/sse/broadcaster.go
diff options
context:
space:
mode:
authorzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
committerzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
commit6cc0bfd1d79074df790272b8091b1f0226d14283 (patch)
treecab18b0f708cf3b0eaeeeb98e2cf81459365b33e /backend/internal/sse/broadcaster.go
downloadyaum-6cc0bfd1d79074df790272b8091b1f0226d14283.tar.gz
yaum-6cc0bfd1d79074df790272b8091b1f0226d14283.zip
feat: upload project
Signed-off-by: zwlucas <lucas.fariamo08@gmail.com>
Diffstat (limited to 'backend/internal/sse/broadcaster.go')
-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:
+ }
+ }
+}