mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2026-05-06 22:12:23 +08:00
63 lines
1.5 KiB
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)
|
|
}
|