1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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)
- }
|