diff --git a/cmd/main.go b/cmd/main.go index d52b5066..bf01e97f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -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() { diff --git a/overlord/browser.go b/overlord/browser.go index 66d19af9..a96113e4 100644 --- a/overlord/browser.go +++ b/overlord/browser.go @@ -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, ) diff --git a/overlord/handlers.go b/overlord/handlers.go index 88bffb66..112110d8 100644 --- a/overlord/handlers.go +++ b/overlord/handlers.go @@ -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 { diff --git a/overlord/session.go b/overlord/session.go index 0b9e015b..f1cb1565 100644 --- a/overlord/session.go +++ b/overlord/session.go @@ -14,8 +14,5 @@ type Session struct { // TODO: Decouple this handler *Server - ServerID string - GameName string - RoomID string - PlayerIndex int + ServerID string } diff --git a/worker/overlord.go b/worker/overlord.go index 2ae25f42..196de07a 100644 --- a/worker/overlord.go +++ b/worker/overlord.go @@ -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 }, diff --git a/worker/session.go b/worker/session.go index 2f5c6066..60afb6c6 100644 --- a/worker/session.go +++ b/worker/session.go @@ -16,5 +16,6 @@ type Session struct { // Close close a session func (s *Session) Close() { + // TODO: Use event base s.peerconnection.StopClient() }