路由分拆
This commit is contained in:
		
							
								
								
									
										61
									
								
								models/WebSocketMnager.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								models/WebSocketMnager.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/google/uuid"
 | 
			
		||||
	"github.com/gorilla/websocket"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type WebSocketManager struct {
 | 
			
		||||
	connections map[string]*websocket.Conn
 | 
			
		||||
	listeners   map[string]map[chan struct{}]struct{}
 | 
			
		||||
	mutex       sync.RWMutex
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewWebSocketManager() *WebSocketManager {
 | 
			
		||||
	return &WebSocketManager{
 | 
			
		||||
		connections: make(map[string]*websocket.Conn),
 | 
			
		||||
		mutex:       sync.RWMutex{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mgr *WebSocketManager) AddConnection(conn *websocket.Conn) string {
 | 
			
		||||
	mgr.mutex.Lock()
 | 
			
		||||
	defer mgr.mutex.Unlock()
 | 
			
		||||
 | 
			
		||||
	id := uuid.New().String() // 为每个连接生成一个唯一的 ID
 | 
			
		||||
	mgr.connections[id] = conn
 | 
			
		||||
 | 
			
		||||
	return id
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mgr *WebSocketManager) RemoveConnection(id string) {
 | 
			
		||||
	mgr.mutex.Lock()
 | 
			
		||||
	defer mgr.mutex.Unlock()
 | 
			
		||||
	delete(mgr.connections, id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mgr *WebSocketManager) ListenForChanges(target string, callback func()) {
 | 
			
		||||
	notifications := make(chan struct{})
 | 
			
		||||
	mgr.mutex.Lock()
 | 
			
		||||
	defer mgr.mutex.Unlock()
 | 
			
		||||
 | 
			
		||||
	if _, ok := mgr.listeners[target]; !ok {
 | 
			
		||||
		mgr.listeners[target] = make(map[chan struct{}]struct{})
 | 
			
		||||
	}
 | 
			
		||||
	mgr.listeners[target][notifications] = struct{}{}
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		for {
 | 
			
		||||
			callback()
 | 
			
		||||
			for listener := range mgr.listeners[target] {
 | 
			
		||||
				select {
 | 
			
		||||
				case listener <- struct{}{}:
 | 
			
		||||
				default:
 | 
			
		||||
					delete(mgr.listeners[target], listener)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user