58 lines
957 B
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
|
|
}
|