gyrogpsc/core/dispatcher.go

56 lines
1008 B
Go

package core
import (
"errors"
"fmt"
)
type Subscriber interface {
Subscribe() (int16, <-chan string)
Unsubscribe(id int16) error
}
type Publisher interface {
Publish(message string)
}
type dispatcher struct {
listeners map[int16]chan string
counter int16
}
func NewDispatcher() *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
}