Hermes/src/client_notifier/notifier.go

58 lines
957 B
Go

package client_notifier
import "sync"
type ClientNotifier interface {
RegisterClient(id string) <-chan Event
UnregisterClient(id string)
NotifyClient(id string, e Event)
}
type client struct {
id string
eventChan chan Event
}
func NewBasicNotifier() ClientNotifier {
return &basicNotifier{
m: &sync.RWMutex{},
clients: map[string]client{},
}
}
type basicNotifier struct {
m *sync.RWMutex
clients map[string]client
}
func (p *basicNotifier) RegisterClient(id string) <-chan Event {
p.m.Lock()
defer p.m.Unlock()
eventChan := make(chan Event)
p.clients[id] = client{
id: id,
eventChan: eventChan,
}
return eventChan
}
func (p *basicNotifier) UnregisterClient(id string) {
p.m.Lock()
defer p.m.Unlock()
delete(p.clients, id)
}
func (p *basicNotifier) NotifyClient(id string, e Event) {
p.m.RLock()
defer p.m.RUnlock()
client, ok := p.clients[id]
if !ok {
return
}
client.eventChan <- e
}