Files
nginx-ui/internal/notification/websocket.go

63 lines
1.5 KiB
Go

package notification
import (
"sync"
"github.com/0xJacky/Nginx-UI/model"
)
// WebSocketNotificationManager manages WebSocket notification subscriptions
type WebSocketNotificationManager struct {
subscribers map[chan *model.Notification]struct{}
mutex sync.RWMutex
}
var (
wsManager *WebSocketNotificationManager
wsManagerOnce sync.Once
)
// GetWebSocketManager returns the singleton WebSocket notification manager
func GetWebSocketManager() *WebSocketNotificationManager {
wsManagerOnce.Do(func() {
wsManager = &WebSocketNotificationManager{
subscribers: make(map[chan *model.Notification]struct{}),
}
})
return wsManager
}
// Subscribe adds a channel to receive notifications
func (m *WebSocketNotificationManager) Subscribe(ch chan *model.Notification) {
m.mutex.Lock()
defer m.mutex.Unlock()
m.subscribers[ch] = struct{}{}
}
// Unsubscribe removes a channel from receiving notifications
func (m *WebSocketNotificationManager) Unsubscribe(ch chan *model.Notification) {
m.mutex.Lock()
defer m.mutex.Unlock()
delete(m.subscribers, ch)
close(ch)
}
// Broadcast sends a notification to all subscribers
func (m *WebSocketNotificationManager) Broadcast(data *model.Notification) {
m.mutex.RLock()
defer m.mutex.RUnlock()
for ch := range m.subscribers {
select {
case ch <- data:
default:
// Skip if channel buffer is full
}
}
}
// BroadcastToWebSocket is a convenience function to broadcast notifications
func BroadcastToWebSocket(data *model.Notification) {
GetWebSocketManager().Broadcast(data)
}