mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-01-23 02:34:42 +00:00
Update closing websocket
This commit is contained in:
parent
dd6452b533
commit
c42ef403be
6 changed files with 70 additions and 35 deletions
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -14,8 +14,5 @@ type Session struct {
|
|||
// TODO: Decouple this
|
||||
handler *Server
|
||||
|
||||
ServerID string
|
||||
GameName string
|
||||
RoomID string
|
||||
PlayerIndex int
|
||||
ServerID string
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
},
|
||||
|
|
|
|||
|
|
@ -16,5 +16,6 @@ type Session struct {
|
|||
|
||||
// Close close a session
|
||||
func (s *Session) Close() {
|
||||
// TODO: Use event base
|
||||
s.peerconnection.StopClient()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue