watchtogether/backend/internal/ws/hub.go

70 lines
1.2 KiB
Go

package ws
type Hub struct {
// Registered Clients
Clients map[*Client]bool
// State
State *State
// Inbound messages from the Clients
broadcast chan RawMessage
// Register requests from the Clients
register chan *Client
// Unregister requests from Clients
unregister chan *Client
}
func NewHub() *Hub {
return &Hub{
broadcast: make(chan RawMessage),
register: make(chan *Client),
unregister: make(chan *Client),
Clients: make(map[*Client]bool),
State: NewState(),
}
}
func (h *Hub) handleMessage(rm RawMessage) {
m := rm.UnserializeData()
switch m.Type {
case Identify:
handleIdentifyEvent(&m)
case Ping:
handlePingEvent(&m)
case GetPlayhead:
handleGetPlayhead(&m)
case SetPlayhead:
handleSetPlayhead(&m)
default:
return
}
return
}
func (h *Hub) Run() {
for {
select {
case client := <-h.register:
h.Clients[client] = true
case client := <-h.unregister:
if _, ok := h.Clients[client]; ok {
delete(h.Clients, client)
close(client.send)
}
case message := <-h.broadcast:
go h.handleMessage(message)
//for client := range h.Clients {
// select {
// case client.send <- message:
// default:
// close(client.send)
// delete(h.Clients, client)
// }
//}
}
}
}