package socket import ( "sync" "github.com/gorilla/websocket" ) // Это хранилище для всех подключённых сокетов. // Оно обеспечивает потокобезопасный доступ к ним, // позволяя добавлять, удалять и получать сокеты без риска // гонок данных. // Здесь содержатся только соединения прошедшие рукопожатие type Connection struct { Identificator string //Подсоединенный сокет Socket *websocket.Conn } // Потокобезопасное хранилище подключённых сокетов var ( handshakeCompletedSockets = make(map[string]*Connection) socketsMutex = sync.RWMutex{} ) // Добавление сокета в хранилище func AddSocket(conn *Connection) { socketsMutex.Lock() defer socketsMutex.Unlock() handshakeCompletedSockets[conn.Identificator] = conn } // Удаление сокета из хранилища func RemoveSocket(identificator string) { socketsMutex.Lock() defer socketsMutex.Unlock() delete(handshakeCompletedSockets, identificator) } // Получение сокета по идентификатору func GetSocket(identificator string) (*Connection, bool) { socketsMutex.RLock() defer socketsMutex.RUnlock() conn, exists := handshakeCompletedSockets[identificator] return conn, exists } // Получение всех сокетов func GetAllSockets() []*Connection { socketsMutex.RLock() defer socketsMutex.RUnlock() connections := make([]*Connection, 0, len(handshakeCompletedSockets)) for _, conn := range handshakeCompletedSockets { connections = append(connections, conn) } return connections }