Something went wrong on our end
Select Git revision
event-bus.go
-
Volker Schukai authoredVolker Schukai authored
event-bus.go 1.54 KiB
package jobqueue
import (
"sync"
)
type EventName string
const (
JobAdded EventName = "JobAdded"
JobRemoved EventName = "JobRemoved"
ExecuteJob EventName = "ExecuteJob"
JobReady EventName = "JobReady"
QueueJob EventName = "QueueJob"
// add more events as needed
)
type Event struct {
Name EventName
Data any
}
// EventBus is a simple event bus
type EventBus struct {
subscribers map[EventName][]chan interface{}
mu sync.RWMutex
}
// NewEventBus creates a new event bus
func NewEventBus() *EventBus {
return &EventBus{
subscribers: make(map[EventName][]chan interface{}),
}
}
// Subscribe adds a channel to the subscribers list
func (eb *EventBus) Subscribe(name EventName, ch chan interface{}) {
eb.mu.Lock()
defer eb.mu.Unlock()
if _, found := eb.subscribers[name]; !found {
eb.subscribers[name] = []chan interface{}{}
}
eb.subscribers[name] = append(eb.subscribers[name], ch)
}
// Unsubscribe removes a channel from the subscribers list
func (eb *EventBus) Unsubscribe(name EventName, ch chan interface{}) {
eb.mu.Lock()
defer eb.mu.Unlock()
if channels, found := eb.subscribers[name]; found {
for i := range channels {
if channels[i] == ch {
eb.subscribers[name] = append(channels[:i], channels[i+1:]...)
break
}
}
}
}
// Publish publishes an event to all subscribers
func (eb *EventBus) Publish(name EventName, data interface{}) {
eb.mu.RLock()
defer eb.mu.RUnlock()
if channels, found := eb.subscribers[name]; found {
for _, ch := range channels {
ch <- Event{Name: name, Data: data}
}
}
}