package server import ( "sync" "g.fc.run/misc/byre/internal/api" ) type hub struct { mu sync.Mutex subs map[chan api.Event]bool } func newHub() *hub { return &hub{subs: map[chan api.Event]bool{}} } func (h *hub) subscribe() chan api.Event { h.mu.Lock() defer h.mu.Unlock() ch := make(chan api.Event, 256) h.subs[ch] = true return ch } func (h *hub) unsubscribe(ch chan api.Event) { h.mu.Lock() defer h.mu.Unlock() _, ok := h.subs[ch] if !ok { return } delete(h.subs, ch) close(ch) } func (h *hub) publish(ev api.Event) { h.mu.Lock() defer h.mu.Unlock() for ch := range h.subs { select { case ch <- ev: default: delete(h.subs, ch) close(ch) } } } func (h *hub) count() int { h.mu.Lock() defer h.mu.Unlock() return len(h.subs) }