64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package websocket
 | |
| 
 | |
| import "sync"
 | |
| 
 | |
| type Hub struct {
 | |
| 	Clients    map[string]*Client
 | |
| 	Register   chan *Client
 | |
| 	Unregister chan *Client
 | |
| 	mu         sync.RWMutex
 | |
| }
 | |
| 
 | |
| func NewHub() *Hub {
 | |
| 	return &Hub{
 | |
| 		Clients:    make(map[string]*Client),
 | |
| 		Register:   make(chan *Client),
 | |
| 		Unregister: make(chan *Client),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *Hub) Run() {
 | |
| 	for {
 | |
| 		select {
 | |
| 		case client := <-h.Register:
 | |
| 			h.mu.Lock()
 | |
| 			h.Clients[client.ID] = client
 | |
| 			h.mu.Unlock()
 | |
| 		case client := <-h.Unregister:
 | |
| 			h.mu.Lock()
 | |
| 			if _, ok := h.Clients[client.ID]; ok {
 | |
| 				delete(h.Clients, client.ID)
 | |
| 				close(client.Send)
 | |
| 			}
 | |
| 			h.mu.Unlock()
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *Hub) SendToClient(id string, msg []byte) {
 | |
| 	h.mu.RLock()
 | |
| 	defer h.mu.RUnlock()
 | |
| 	if c, ok := h.Clients[id]; ok {
 | |
| 		c.Send <- msg
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *Hub) SendToAll(ids []string, msg []byte) {
 | |
| 	h.mu.RLock()
 | |
| 	defer h.mu.RUnlock()
 | |
| 
 | |
| 	for _, id := range ids {
 | |
| 		if c, ok := h.Clients[id]; ok {
 | |
| 			c.Send <- msg
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (h *Hub) Broadcast(msg []byte) {
 | |
| 	h.mu.RLock()
 | |
| 	defer h.mu.RUnlock()
 | |
| 	for _, client := range h.Clients {
 | |
| 		client.Send <- msg
 | |
| 	}
 | |
| }
 |