grim/amongchat

Initial revision
draft default tip
2020-09-23, Gary Kramlich
dead8a9014bd
Initial revision
package muxer
type Muxer struct {
secret string
clients map[*Client]bool
queue chan interface{}
register chan *Client
shutdown chan bool
unregister chan *Client
}
func New(secret string) *Muxer {
return &Muxer{
secret: secret,
queue: make(chan interface{}, 10),
register: make(chan *Client),
shutdown: make(chan bool),
unregister: make(chan *Client),
}
}
// Run manages all of the client connections and sends messages to them when
// necessary.
func (m *Muxer) Run() error {
for {
select {
case client := <-m.unregister:
if _, found := m.clients[client]; found {
delete(m.clients, client)
close(client.queue)
}
case client := <-m.register:
m.clients[client] = true
case message := <-m.queue:
for client := range m.clients {
select {
case client.queue <- message:
default:
m.unregister <- client
}
}
case <-m.shutdown:
break
}
}
return nil
}
// Close closes all connections and exits the run loop.
func (m *Muxer) Close() {
for client := range m.clients {
m.unregister <- client
}
m.shutdown <- true
}