
Introduce an "event bus"-like system. It's more like a fan-out broadcaster for certain events. Instead of directly sending events to SocketIO, they are now sent to the broker, which in turn sends it to any registered "forwarder". Currently there is ony one forwarder, for SocketIO. This opens the door for a proper MQTT client that sends the same events to an MQTT server.
41 lines
663 B
Go
41 lines
663 B
Go
package eventbus
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type (
|
|
EventTopic string
|
|
)
|
|
|
|
type Forwarder interface {
|
|
Broadcast(topic EventTopic, payload interface{})
|
|
}
|
|
|
|
type Broker struct {
|
|
forwarders []Forwarder
|
|
mutex sync.Mutex
|
|
}
|
|
|
|
func NewBroker() *Broker {
|
|
return &Broker{
|
|
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) broadcast(topic EventTopic, payload interface{}) {
|
|
b.mutex.Lock()
|
|
defer b.mutex.Unlock()
|
|
|
|
for _, forwarder := range b.forwarders {
|
|
forwarder.Broadcast(topic, payload)
|
|
}
|
|
}
|