Update closing websocket

This commit is contained in:
giongto35 2019-05-19 17:51:48 +08:00
parent dd6452b533
commit c42ef403be
6 changed files with 70 additions and 35 deletions

View file

@ -67,12 +67,6 @@ func initializeWorker() {
worker.Close()
}()
worker.Run()
// ignore origin
//upgrader.CheckOrigin = func(r *http.Request) bool { return true }
//http.ListenAndServe(":"+*config.Port, nil)
//log.Println("http://localhost:" + *config.Port)
}
func monitor() {

View file

@ -34,8 +34,9 @@ func (s *Session) RouteBrowser() {
// relay SDP to target worker and get back SDP of the worker
// TODO: Async
log.Println("Overlord: serverID: ", s.ServerID)
sdp := s.handler.servers[s.ServerID].SyncSend(
log.Println("Overlord: serverID: ", s.ServerID, resp.SessionID)
resp.SessionID = s.ID
sdp := s.handler.workerClients[s.ServerID].SyncSend(
resp,
)
@ -47,7 +48,8 @@ func (s *Session) RouteBrowser() {
log.Println("Overlord: Relay quit request from a browser to worker")
// TODO: Async
resp = s.handler.servers[s.ServerID].SyncSend(
resp.SessionID = s.ID
resp = s.handler.workerClients[s.ServerID].SyncSend(
resp,
)
@ -58,7 +60,8 @@ func (s *Session) RouteBrowser() {
log.Println("Overlord: Received a relay start request from a browser")
log.Println("Overlord: Relay start request from a browser to worker")
// TODO: Async
resp = s.handler.servers[s.ServerID].SyncSend(
resp.SessionID = s.ID
resp = s.handler.workerClients[s.ServerID].SyncSend(
resp,
)

View file

@ -22,8 +22,8 @@ const (
type Server struct {
roomToServer map[string]string
// servers are the map serverID to server Client
servers map[string]*cws.Client
// workerClients are the map serverID to worker Client
workerClients map[string]*WorkerClient
}
var upgrader = websocket.Upgrader{}
@ -32,7 +32,7 @@ var errNotFound = errors.New("Not found")
func NewServer() *Server {
return &Server{
// Mapping serverID to client
servers: map[string]*cws.Client{},
workerClients: map[string]*WorkerClient{},
// Mapping roomID to server
roomToServer: map[string]string{},
}
@ -61,9 +61,9 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) {
serverID := uuid.Must(uuid.NewV4()).String()
log.Println("Overlord: A new server connected to Overlord", serverID)
// Register to servers map the client connection
client := cws.NewClient(c)
o.servers[serverID] = client
// Register to workersClients map the client connection
client := NewWorkerClient(c)
o.workerClients[serverID] = client
defer o.cleanConnection(client, serverID)
// Sendback the ID to server
@ -102,11 +102,11 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) {
func (o *Server) WS(w http.ResponseWriter, r *http.Request) {
log.Println("Browser connected to overlord")
//TODO: Add it back
//defer func() {
//if r := recover(); r != nil {
//log.Println("Warn: Something wrong. Recovered in ", r)
//}
//}()
defer func() {
if r := recover(); r != nil {
log.Println("Warn: Something wrong. Recovered in ", r)
}
}()
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
@ -115,19 +115,25 @@ func (o *Server) WS(w http.ResponseWriter, r *http.Request) {
}
defer c.Close()
client := NewBrowserClient(c)
// Set up server
// SessionID will be the unique per frontend connection
sessionID := uuid.Must(uuid.NewV4()).String()
serverID, err := o.findBestServer()
if err != nil {
log.Fatal(err)
}
client := NewBrowserClient(c)
// Setup session
wssession := &Session{
ID: sessionID,
BrowserClient: client,
handler: o,
BrowserClient: client,
WorkerClient: o.workerClients[serverID],
ServerID: serverID,
}
// TODO:?
//defer wssession.Close()
log.Println("New client will conect to server", wssession.ServerID)
@ -138,18 +144,34 @@ func (o *Server) WS(w http.ResponseWriter, r *http.Request) {
Data: gamelist.GetEncodedGameList(gamePath),
}, nil)
// If peerconnection is done (client.Done is signalled), we close peerconnection
go func() {
<-client.Done
// Notify worker to clean session
wssession.WorkerClient.Send(
cws.WSPacket{
ID: "terminateSession",
SessionID: sessionID,
},
nil,
)
//log.Println("Socket terminated, detach connection")
//h.detachPeerConn(wssession.peerconnection)
}()
wssession.BrowserClient.Listen()
}
// findBestServer returns the best server for a session
func (o *Server) findBestServer() (string, error) {
// TODO: Find best Server by latency, currently return by ping
if len(o.servers) == 0 {
if len(o.workerClients) == 0 {
return "", errors.New("No server found")
}
r := rand.Intn(len(o.servers))
for k, _ := range o.servers {
r := rand.Intn(len(o.workerClients))
for k, _ := range o.workerClients {
if r == 0 {
return k, nil
}
@ -159,10 +181,10 @@ func (o *Server) findBestServer() (string, error) {
return "", errors.New("No server found")
}
func (o *Server) cleanConnection(client *cws.Client, serverID string) {
func (o *Server) cleanConnection(client *WorkerClient, serverID string) {
log.Println("Unregister server from overlord")
// Remove serverID from servers
delete(o.servers, serverID)
delete(o.workerClients, serverID)
// Clean all rooms connecting to that server
for roomID, roomServer := range o.roomToServer {
if roomServer == serverID {

View file

@ -14,8 +14,5 @@ type Session struct {
// TODO: Decouple this
handler *Server
ServerID string
GameName string
RoomID string
PlayerIndex int
ServerID string
}

View file

@ -59,7 +59,7 @@ func (h *Handler) RouteOverlord() {
}
h.sessions[resp.SessionID] = session
log.Println("Start peerconnection")
log.Println("Start peerconnection", resp.SessionID)
if err != nil {
log.Println("Error: Cannot create new webrtc session", err)
return cws.EmptyPacket
@ -77,7 +77,8 @@ func (h *Handler) RouteOverlord() {
"start",
func(resp cws.WSPacket) (req cws.WSPacket) {
log.Println("Received a start request from overlord")
session := h.sessions[resp.SessionID]
session, ok := h.sessions[resp.SessionID]
log.Println("Find ", resp.SessionID, session, ok)
peerconnection := session.peerconnection
room := h.startGameHandler(resp.Data, resp.RoomID, resp.PlayerIndex, peerconnection)
@ -96,13 +97,30 @@ func (h *Handler) RouteOverlord() {
"quit",
func(resp cws.WSPacket) (req cws.WSPacket) {
log.Println("Received a quit request from overlord")
session := h.sessions[resp.SessionID]
session, ok := h.sessions[resp.SessionID]
log.Println("Find ", resp.SessionID, session, ok)
room := h.getRoom(session.RoomID)
// Defensive coding, check if the peerconnection is in room
if room.IsPCInRoom(session.peerconnection) {
h.detachPeerConn(session.peerconnection)
}
//session.Close()
return cws.EmptyPacket
},
)
oclient.Receive(
"terminateSession",
func(resp cws.WSPacket) (req cws.WSPacket) {
log.Println("Received a terminate session ", resp.SessionID)
session, ok := h.sessions[resp.SessionID]
log.Println("Find ", session, ok)
if ok {
session.Close()
delete(h.sessions, resp.SessionID)
}
return cws.EmptyPacket
},

View file

@ -16,5 +16,6 @@ type Session struct {
// Close close a session
func (s *Session) Close() {
// TODO: Use event base
s.peerconnection.StopClient()
}