Files
feedmee/backend/handlers/broker.go

46 lines
985 B
Go

package handlers
import "log"
type Broker struct {
clients map[chan []byte]bool
add chan chan []byte
remove chan chan []byte
broadcast chan []byte
}
func NewBroker() *Broker {
b := &Broker{
clients: make(map[chan []byte]bool),
add: make(chan chan []byte),
remove: make(chan chan []byte),
broadcast: make(chan []byte),
}
go func() {
for {
select {
case c := <-b.add:
b.clients[c] = true
log.Printf("SSE client added. Total: %d", len(b.clients))
case c := <-b.remove:
if _, ok := b.clients[c]; ok {
delete(b.clients, c)
close(c)
log.Printf("SSE client removed. Total: %d", len(b.clients))
}
case msg := <-b.broadcast:
log.Printf("Broker broadcasting to %d clients", len(b.clients))
for c := range b.clients {
select {
case c <- msg:
log.Println("Message queued for client")
default:
log.Println("Client channel full, skipping")
}
}
}
}
}()
return b
}