47 lines
851 B
Go
47 lines
851 B
Go
package dispatcher
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
type Dispatcher struct {
|
|
listeners map[int16]chan string
|
|
counter int16
|
|
}
|
|
|
|
func New() *Dispatcher {
|
|
fmt.Println("new dispatcher")
|
|
return &Dispatcher{
|
|
listeners: make(map[int16]chan string),
|
|
counter: 0,
|
|
}
|
|
}
|
|
|
|
func (d *Dispatcher) Publish(message string) {
|
|
fmt.Println("publish to listeners", len(d.listeners))
|
|
for _, ch := range d.listeners {
|
|
ch <- message
|
|
}
|
|
}
|
|
|
|
func (d *Dispatcher) Subscribe() (id int16, receiver <-chan string) {
|
|
fmt.Println("subscribe")
|
|
key := d.counter
|
|
d.counter++
|
|
rec := make(chan string)
|
|
d.listeners[key] = rec
|
|
return key, rec
|
|
}
|
|
|
|
func (d *Dispatcher) Unsubscribe(id int16) error {
|
|
fmt.Println("unsubscribe")
|
|
receiver, ok := d.listeners[id]
|
|
if !ok {
|
|
return errors.New("no subscription with id")
|
|
}
|
|
delete(d.listeners, id)
|
|
close(receiver)
|
|
return nil
|
|
}
|