Initial commit
This commit is contained in:
commit
c5111cb551
20 changed files with 1764 additions and 0 deletions
53
broker/broker.go
Normal file
53
broker/broker.go
Normal file
|
@ -0,0 +1,53 @@
|
|||
package broker
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type EventBroker struct {
|
||||
handlers map[string][]EventHandler
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
type EventHandler interface {
|
||||
Handle(ctx context.Context, event Event) error
|
||||
}
|
||||
|
||||
type Event interface {
|
||||
Name() string
|
||||
Payload() interface{}
|
||||
}
|
||||
|
||||
func NewEventBroker() *EventBroker {
|
||||
return &EventBroker{
|
||||
handlers: make(map[string][]EventHandler),
|
||||
}
|
||||
}
|
||||
|
||||
func (b *EventBroker) Register(eventType string, handler EventHandler) {
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
b.handlers[eventType] = append(b.handlers[eventType], handler)
|
||||
}
|
||||
|
||||
func (b *EventBroker) Publish(eventType string, event Event) {
|
||||
b.mu.RLock()
|
||||
defer b.mu.RUnlock()
|
||||
for _, handler := range b.handlers[eventType] {
|
||||
handler.Handle(context.Background(), event)
|
||||
}
|
||||
}
|
||||
|
||||
func (b *EventBroker) Unregister(eventType string, handler EventHandler) {
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
handlers := b.handlers[eventType]
|
||||
for i, h := range handlers {
|
||||
if h == handler {
|
||||
// Remove the handler from the slice
|
||||
b.handlers[eventType] = append(handlers[:i], handlers[i+1:]...)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue