package events import ( "context" "log" ) type Bus struct { subscribers map[chan *Event]struct{} } func NewBus() *Bus { return &Bus{ subscribers: make(map[chan *Event]struct{}), } } func (b *Bus) Subscribe(ctx context.Context) chan *Event { ch := make(chan *Event, 100) b.subscribers[ch] = struct{}{} go func() { <-ctx.Done() b.unsubscribe(ch) close(ch) }() return ch } func (b *Bus) Publish(event *Event) { for ch := range b.subscribers { select { case ch <- event: default: log.Printf("Event channel full, dropping event: %s", event.ID) } } } func (b *Bus) unsubscribe(ch chan *Event) { delete(b.subscribers, ch) }