46 lines
985 B
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
|
|
}
|