feat: handle cluster events
This commit is contained in:
@@ -2,6 +2,7 @@ package discovery
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
@@ -85,7 +86,10 @@ func (nd *NodeDiscovery) handleUDPMessage(message string, remoteAddr *net.UDPAdd
|
||||
nd.logger.WithField("message", "raw:"+payload).Debug("Received raw message")
|
||||
},
|
||||
"cluster/event": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithField("message", "cluster/event:"+payload).Debug("Received cluster/event message")
|
||||
nd.handleClusterEvent(payload, remoteAddr)
|
||||
},
|
||||
"cluster/broadcast": func(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.handleClusterBroadcast(payload, remoteAddr)
|
||||
},
|
||||
}
|
||||
|
||||
@@ -373,6 +377,55 @@ func (nd *NodeDiscovery) AddCallback(callback NodeUpdateCallback) {
|
||||
nd.callbacks = append(nd.callbacks, callback)
|
||||
}
|
||||
|
||||
// SetClusterEventCallback sets the callback for cluster events
|
||||
func (nd *NodeDiscovery) SetClusterEventCallback(callback ClusterEventBroadcaster) {
|
||||
nd.mutex.Lock()
|
||||
defer nd.mutex.Unlock()
|
||||
nd.clusterEventCallback = callback
|
||||
}
|
||||
|
||||
// handleClusterEvent processes cluster/event messages
|
||||
func (nd *NodeDiscovery) handleClusterEvent(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithFields(log.Fields{
|
||||
"payload": payload,
|
||||
"from": remoteAddr.String(),
|
||||
}).Debug("Received cluster/event message")
|
||||
|
||||
// Forward to websocket if callback is set
|
||||
if nd.clusterEventCallback != nil {
|
||||
nd.clusterEventCallback.BroadcastClusterEvent("cluster/event", payload)
|
||||
}
|
||||
}
|
||||
|
||||
// handleClusterBroadcast processes cluster/broadcast messages
|
||||
func (nd *NodeDiscovery) handleClusterBroadcast(payload string, remoteAddr *net.UDPAddr) {
|
||||
nd.logger.WithFields(log.Fields{
|
||||
"payload": payload,
|
||||
"from": remoteAddr.String(),
|
||||
}).Debug("Received cluster/broadcast message")
|
||||
|
||||
// Parse the payload JSON to extract nested event and data
|
||||
var payloadData struct {
|
||||
Event string `json:"event"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal([]byte(payload), &payloadData); err != nil {
|
||||
nd.logger.WithError(err).Error("Failed to parse cluster/broadcast payload")
|
||||
return
|
||||
}
|
||||
|
||||
nd.logger.WithFields(log.Fields{
|
||||
"event": payloadData.Event,
|
||||
"from": remoteAddr.String(),
|
||||
}).Debug("Parsed cluster/broadcast payload")
|
||||
|
||||
// Forward to websocket if callback is set, mapping event to topic and data to data
|
||||
if nd.clusterEventCallback != nil {
|
||||
nd.clusterEventCallback.BroadcastClusterEvent(payloadData.Event, payloadData.Data)
|
||||
}
|
||||
}
|
||||
|
||||
// GetClusterStatus returns current cluster status
|
||||
func (nd *NodeDiscovery) GetClusterStatus() ClusterStatus {
|
||||
nd.mutex.RLock()
|
||||
|
||||
Reference in New Issue
Block a user