package core import ( "errors" "github.com/sirupsen/logrus" ) type dispatcher struct { listeners map[int16]chan string counter int16 } func NewDispatcher() *dispatcher { return &dispatcher{ listeners: make(map[int16]chan string), counter: 0, } } func (d *dispatcher) Publish(message string) { logrus.Debugf("publish to %v listeners:\n%v\n", len(d.listeners)) logrus.Debug(message) for _, ch := range d.listeners { ch <- message } } func (d *dispatcher) Subscribe() (id int16, receiver <-chan string) { key := d.counter d.counter++ rec := make(chan string) d.listeners[key] = rec return key, rec } func (d *dispatcher) Unsubscribe(id int16) error { receiver, ok := d.listeners[id] if !ok { return errors.New("no subscription with id") } delete(d.listeners, id) close(receiver) return nil }