tts-room/src/server/server.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()
}