package server import ( "log" "net/http" ) type Server struct { sessions []*session } func NewServer() *Server { return &Server{} } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/ws": if err := s.WS(w, r); err != nil { log.Println("[ws]", err) } default: http.FileServer(http.Dir("./src/public")).ServeHTTP(w, r) } } func (s *Server) WS(w http.ResponseWriter, r *http.Request) error { sess, err := newSession(w, r, nil) if err != nil { return err } defer sess.Close() sess.cb = func(m message) error { for i := range s.sessions { if s.sessions[i].id != sess.id { select { case s.sessions[i].scatterc <- m: case <-s.sessions[i].ctx.Done(): } } } return nil } s.sessions = append(s.sessions, sess) defer func() { for i := range s.sessions { if s.sessions[i].id == sess.id { s.sessions = append(s.sessions[:i], s.sessions[i+1:]...) return } } }() return sess.Run() }