From 5320283f6362e9996c5ecb4e408e9ea91d824322 Mon Sep 17 00:00:00 2001 From: giongto35 Date: Wed, 1 May 2019 21:36:01 +0800 Subject: [PATCH] Clean code --- cmd/main.go | 4 -- handler/browser.go | 26 +------ handler/handlers.go | 162 +++++++------------------------------------- handler/overlord.go | 14 ++-- handler/rooms.go | 16 ++--- handler/session.go | 55 --------------- 6 files changed, 38 insertions(+), 239 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index b37edf59..57ab7fca 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -6,7 +6,6 @@ import ( "net/http" _ "net/http/pprof" "strings" - "time" "github.com/giongto35/cloud-game/config" "github.com/giongto35/cloud-game/handler" @@ -21,9 +20,6 @@ const ( ) // Time allowed to write a message to the peer. -var readWait = 30 * time.Second -var writeWait = 30 * time.Second - var upgrader = websocket.Upgrader{} // initilizeOverlord setup an overlord server diff --git a/handler/browser.go b/handler/browser.go index 5f7fdcb2..4d4fbde3 100644 --- a/handler/browser.go +++ b/handler/browser.go @@ -13,11 +13,6 @@ import ( type BrowserClient struct { *cws.Client - //session *Session - //oclient *OverlordClient - //gameName string - //roomID string - //playerIndex int } func (s *Session) RegisterBrowserClient() { @@ -130,26 +125,7 @@ func (s *Session) RegisterBrowserClient() { // NewOverlordClient returns a client connecting to browser. This connection exchanges information between clients and server func NewBrowserClient(c *websocket.Conn) *BrowserClient { - //roomID := "" - //gameName := "" - //playerIndex := 0 - // Create connection to overlord - browserClient := &BrowserClient{ + return &BrowserClient{ Client: cws.NewClient(c), - //gameName: "", - //roomID: "", - //playerIndex: 0, } - - //sessionID := strconv.Itoa(rand.Int()) - //sessionID := uuid.Must(uuid.NewV4()).String() - - //wssession := &Session{ - //BrowserClient: browserClient, - //OverlordClient: overlordClient, - //peerconnection: webrtc.NewWebRTC(), - //// The server session is maintaining - //} - - return browserClient } diff --git a/handler/handlers.go b/handler/handlers.go index 60bbde51..7e0de6cf 100644 --- a/handler/handlers.go +++ b/handler/handlers.go @@ -7,7 +7,6 @@ import ( "net/http" "time" - "github.com/giongto35/cloud-game/config" "github.com/giongto35/cloud-game/cws" "github.com/giongto35/cloud-game/handler/gamelist" "github.com/giongto35/cloud-game/webrtc" @@ -16,8 +15,6 @@ import ( ) const ( - scale = 3 - title = "NES" gameboyIndex = "./static/gameboy.html" debugIndex = "./static/index_ws.html" ) @@ -29,10 +26,6 @@ var writeWait = 30 * time.Second // Flag to determine if the server is overlord or not var upgrader = websocket.Upgrader{} -// ID to peerconnection -//var peerconnections = map[string]*webrtc.WebRTC{} -//var oclient *OverlordClient - type Handler struct { oClient *OverlordClient rooms map[string]*Room @@ -50,10 +43,6 @@ type Handler struct { // NewHandler returns a new server func NewHandler(overlordConn *websocket.Conn, isDebug bool, gamePath string) *Handler { - //conn, err := createOverlordConnection() - //if err != nil { - //return nil, err - //} return &Handler{ oClient: NewOverlordClient(overlordConn), rooms: map[string]*Room{}, @@ -83,6 +72,8 @@ func (h *Handler) GetWeb(w http.ResponseWriter, r *http.Request) { // WS handles normal traffic (from browser to host) func (h *Handler) WS(w http.ResponseWriter, r *http.Request) { c, err := upgrader.Upgrade(w, r, nil) + defer c.Close() + if err != nil { log.Print("[!] WS upgrade:", err) return @@ -114,135 +105,30 @@ func (h *Handler) WS(w http.ResponseWriter, r *http.Request) { }, nil) wssession.BrowserClient.Listen() - - defer c.Close() - //var gameName string - //var roomID string - //var playerIndex int - - //// Create connection to overlord - //client := NewClient(c) - ////sessionID := strconv.Itoa(rand.Int()) - //sessionID := uuid.Must(uuid.NewV4()).String() - - //wssession := &Session{ - //client: client, - //peerconnection: webrtc.NewWebRTC(), - //// The server session is maintaining - //} - - //client.send(WSPacket{ - //ID: "gamelist", - //Data: getEncodedGameList(), - //}, nil) - - //client.receive("heartbeat", func(resp WSPacket) WSPacket { - //return resp - //}) - - //client.receive("initwebrtc", func(resp WSPacket) WSPacket { - //log.Println("Received user SDP") - //localSession, err := wssession.peerconnection.StartClient(resp.Data, width, height) - //if err != nil { - //log.Fatalln(err) - //} - - //return WSPacket{ - //ID: "sdp", - //Data: localSession, - //SessionID: sessionID, - //} - //}) - - //client.receive("save", func(resp WSPacket) (req WSPacket) { - //log.Println("Saving game state") - //req.ID = "save" - //req.Data = "ok" - //if roomID != "" { - //err = rooms[roomID].director.SaveGame() - //if err != nil { - //log.Println("[!] Cannot save game state: ", err) - //req.Data = "error" - //} - //} else { - //req.Data = "error" - //} - - //return req - //}) - - //client.receive("load", func(resp WSPacket) (req WSPacket) { - //log.Println("Loading game state") - //req.ID = "load" - //req.Data = "ok" - //if roomID != "" { - //err = rooms[roomID].director.LoadGame() - //if err != nil { - //log.Println("[!] Cannot load game state: ", err) - //req.Data = "error" - //} - //} else { - //req.Data = "error" - //} - - //return req - //}) - - //client.receive("start", func(resp WSPacket) (req WSPacket) { - //gameName = resp.Data - //roomID = resp.RoomID - //playerIndex = resp.PlayerIndex - //isNewRoom := false - - //log.Println("Starting game") - //// If we are connecting to overlord, request serverID from roomID - //if oclient != nil { - //roomServerID := getServerIDOfRoom(oclient, roomID) - //log.Println("Server of RoomID ", roomID, " is ", roomServerID) - //if roomServerID != "" && wssession.ServerID != roomServerID { - //// TODO: Re -register - //go bridgeConnection(wssession, roomServerID, gameName, roomID, playerIndex) - //return - //} - //} - - //roomID, isNewRoom = startSession(wssession.peerconnection, gameName, roomID, playerIndex) - //// Register room to overlord if we are connecting to overlord - //if isNewRoom && oclient != nil { - //oclient.send(WSPacket{ - //ID: "registerRoom", - //Data: roomID, - //}, nil) - //} - //req.ID = "start" - //req.RoomID = roomID - //req.SessionID = sessionID - - //return req - //}) - - //client.receive("candidate", func(resp WSPacket) (req WSPacket) { - //// Unuse code - //hi := pionRTC.ICECandidateInit{} - //err = json.Unmarshal([]byte(resp.Data), &hi) - //if err != nil { - //log.Println("[!] Cannot parse candidate: ", err) - //} else { - //// webRTC.AddCandidate(hi) - //} - //req.ID = "candidate" - - //return req - //}) - - //client.Listen() } -func createOverlordConnection() (*websocket.Conn, error) { - c, _, err := websocket.DefaultDialer.Dial(*config.OverlordHost, nil) - if err != nil { - return nil, err +// getRoom returns room from roomID +func (h *Handler) getRoom(roomID string) *Room { + room, ok := h.rooms[roomID] + if !ok { + return nil } - return c, nil + return room +} + +// createNewRoom creates a new room +// Return nil in case of room is existed +func (h *Handler) createNewRoom(gameName string, roomID string, playerIndex int) *Room { + // If the roomID is empty, + // or the roomID doesn't have any running sessions (room was closed) + // we spawn a new room + if roomID == "" || !h.isRoomRunning(roomID) { + room := NewRoom(roomID, gameName) + // TODO: Might have race condition + h.rooms[roomID] = room + return room + } + + return nil } diff --git a/handler/overlord.go b/handler/overlord.go index 62f5e4b0..c6fd13c3 100644 --- a/handler/overlord.go +++ b/handler/overlord.go @@ -114,9 +114,9 @@ func getServerIDOfRoom(oc *OverlordClient, roomID string) string { return packet.Data } -func (session *Session) bridgeConnection(serverID string, gameName string, roomID string, playerIndex int) { +func (s *Session) bridgeConnection(serverID string, gameName string, roomID string, playerIndex int) { log.Println("Bridging connection to other Host ", serverID) - client := session.BrowserClient + client := s.BrowserClient // Ask client to init log.Println("Requesting offer to browser", serverID) @@ -128,20 +128,16 @@ func (session *Session) bridgeConnection(serverID string, gameName string, roomI log.Println("Sending offer to overlord to relay message to target host", resp.TargetHostID) // Ask overlord to relay SDP packet to serverID resp.TargetHostID = serverID - remoteTargetSDP := session.OverlordClient.SyncSend(resp) + remoteTargetSDP := s.OverlordClient.SyncSend(resp) log.Println("Got back remote host SDP, sending to browser") // Send back remote SDP of remote server to browser - //client.syncSend(WSPacket{ - //ID: "sdp", - //Data: remoteTargetSDP.Data, - //}) - session.BrowserClient.Send(cws.WSPacket{ + s.BrowserClient.Send(cws.WSPacket{ ID: "sdp", Data: remoteTargetSDP.Data, }, nil) log.Println("Init session done, start game on target host") - session.OverlordClient.SyncSend(cws.WSPacket{ + s.OverlordClient.SyncSend(cws.WSPacket{ ID: "start", Data: gameName, TargetHostID: serverID, diff --git a/handler/rooms.go b/handler/rooms.go index f6ce1941..1be88557 100644 --- a/handler/rooms.go +++ b/handler/rooms.go @@ -28,15 +28,8 @@ type Room struct { director *emulator.Director } -// generateRoomID generate a unique room ID containing 16 digits -func generateRoomID() string { - roomID := strconv.FormatInt(rand.Int63(), 16) - //roomID := uuid.Must(uuid.NewV4()).String() - return roomID -} - // init initilizes a room returns roomID -func (h *Handler) initRoom(roomID, gameName string) *Room { +func NewRoom(roomID, gameName string) *Room { // if no roomID is given, generate it if roomID == "" { roomID = generateRoomID() @@ -68,6 +61,13 @@ func (h *Handler) initRoom(roomID, gameName string) *Room { return room } +// generateRoomID generate a unique room ID containing 16 digits +func generateRoomID() string { + roomID := strconv.FormatInt(rand.Int63(), 16) + //roomID := uuid.Must(uuid.NewV4()).String() + return roomID +} + // isRoomRunning check if there is any running sessions. // TODO: If we remove sessions from room anytime a session is closed, we can check if the sessions list is empty or not. func (h *Handler) isRoomRunning(roomID string) bool { diff --git a/handler/session.go b/handler/session.go index 6cfd80a7..c344693d 100644 --- a/handler/session.go +++ b/handler/session.go @@ -21,58 +21,3 @@ type Session struct { RoomID string PlayerIndex int } - -// getRoom returns room from roomID -func (h *Handler) getRoom(roomID string) *Room { - room, ok := h.rooms[roomID] - if !ok { - return nil - } - - return room -} - -// createNewRoom creates a new room -// Return nil in case of room is existed -func (h *Handler) createNewRoom(gameName string, roomID string, playerIndex int) *Room { - //cleanSession(peerconnection) - // If the roomID is empty, - // or the roomID doesn't have any running sessions (room was closed) - // we spawn a new room - if roomID == "" || !h.isRoomRunning(roomID) { - room := h.initRoom(roomID, gameName) - h.rooms[roomID] = room - return room - } - - // TODO: Might have race condition - //rooms[roomID].rtcSessions = append(rooms[roomID].rtcSessions, peerconnection) - //room := rooms[roomID] - - //peerconnection.AttachRoomID(roomID) - //go startWebRTCSession(room, peerconnection, playerIndex) - - return nil -} - -// startPeerConnection handles one peerconnection call -//func (s *Handler) startPeerConnection( gameName string, roomID string, playerIndex int) (rRoomID string, isNewRoom bool) { -//isNewRoom = false -//cleanSession(peerconnection) -//// If the roomID is empty, -//// or the roomID doesn't have any running sessions (room was closed) -//// we spawn a new room -//if roomID == "" || !isRoomRunning(roomID) { -//roomID = initRoom(roomID, gameName) -//isNewRoom = true -//} - -//// TODO: Might have race condition -//rooms[roomID].rtcSessions = append(rooms[roomID].rtcSessions, peerconnection) -//room := rooms[roomID] - -//peerconnection.AttachRoomID(roomID) -//go startWebRTCSession(room, peerconnection, playerIndex) - -//return roomID, isNewRoom -//}