package main import ( "context" "log" "sync" "sync/atomic" "git.ali33.ru/fcg-xvii/go-tools/containers/concurrent" "git.ali33.ru/fcg-xvii/go-tools/json" "github.com/gorilla/websocket" ) func NewWSClients() *WSClients { return &WSClients{ List: concurrent.NewList(), rStore: new(sync.Map), } } type WSClients struct { *concurrent.List rStore *sync.Map counter uint32 } func (s *WSClients) Broadcast(mes json.Map) { for e := s.First(); e != nil; e = e.Next() { e.Val().(*WSClient).SendSingle(mes) } } func (s *WSClients) clientConnected(conn *websocket.Conn) *WSClient { cctx, cancel := context.WithCancel(context.Background()) cl := &WSClient{ conn: conn, clients: s, ctx: cctx, cancel: cancel, } s.PushBack(cl) return cl } func (s *WSClients) clientDisconnected(cl *WSClient) { log.Println("DISCONNECTED") if e := s.Search(cl); e != nil { s.Remove(e) } } func (s *WSClients) nextID() int64 { return int64(atomic.AddUint32(&s.counter, 1)) }