58 lines
996 B
Go
58 lines
996 B
Go
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()
|
|
}
|