45 lines
915 B
Go
45 lines
915 B
Go
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
|
|
}
|