
This introduces the concept of 'event listener', which is now used by the farm status service to respond to events on the event bus. This makes it possible to reduce the regular poll period from 5 to 30 seconds. That's now only necessary as backup, just in case events are missed or otherwise things change without the event bus logic noticing.
61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package eventbus
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type (
|
|
EventTopic string
|
|
)
|
|
|
|
// Listener is the interface for internal components that want to respond to events.
|
|
type Listener interface {
|
|
OnEvent(topic EventTopic, payload interface{})
|
|
}
|
|
|
|
// Forwarder is the interface for components that forward events to external systems.
|
|
type Forwarder interface {
|
|
Broadcast(topic EventTopic, payload interface{})
|
|
}
|
|
|
|
type Broker struct {
|
|
listeners []Listener
|
|
forwarders []Forwarder
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
func NewBroker() *Broker {
|
|
return &Broker{
|
|
listeners: []Listener{},
|
|
forwarders: []Forwarder{},
|
|
mutex: sync.Mutex{},
|
|
}
|
|
}
|
|
|
|
func (b *Broker) AddForwarder(forwarder Forwarder) {
|
|
b.mutex.Lock()
|
|
defer b.mutex.Unlock()
|
|
b.forwarders = append(b.forwarders, forwarder)
|
|
}
|
|
|
|
func (b *Broker) AddListener(listener Listener) {
|
|
b.mutex.Lock()
|
|
defer b.mutex.Unlock()
|
|
b.listeners = append(b.listeners, listener)
|
|
}
|
|
|
|
func (b *Broker) broadcast(topic EventTopic, payload interface{}) {
|
|
b.mutex.Lock()
|
|
defer b.mutex.Unlock()
|
|
|
|
for _, listener := range b.listeners {
|
|
listener.OnEvent(topic, payload)
|
|
}
|
|
|
|
for _, forwarder := range b.forwarders {
|
|
forwarder.Broadcast(topic, payload)
|
|
}
|
|
}
|