diff --git a/README.md b/README.md index 3d5ddc9b..c455c8f9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Klog, Web-based Cloud Gaming Service -- **US West (San Francisco)**: [http://usw.cloud.webgame2d.com](http://usw.cloud.webgame2d.com) - **US East(New York)**: [http://use.cloud.webgame2d.com](http://use.cloud.webgame2d.com) -- **Singapore**: [http://cloud.webgame2d.com](http://sg.cloud.webgame2d.com) - **Europe (London)**: [http://eu.cloud.webgame2d.com](http://eu.cloud.webgame2d.com) +- [http://cloud.webgame2d.com](http://cloud.webgame2d.com) - [**Game Instruction**](document/instruction/) For the best gaming experience, please select the closest region to you. diff --git a/cmd/cmd b/cmd/cmd index 47e7af02..0eaa2397 100755 Binary files a/cmd/cmd and b/cmd/cmd differ diff --git a/config/config.go b/config/config.go index 1c20b1e9..4d949d7c 100644 --- a/config/config.go +++ b/config/config.go @@ -13,8 +13,10 @@ var OverlordHost = flag.String("overlordhost", defaultoverlord, "Specify the pat var Port = flag.String("port", "8000", "Port of the game") var IsMonitor = flag.Bool("monitor", false, "Turn on monitor") var FrontendSTUNTURN = flag.String("stunturn", DefaultSTUNTURN, "Frontend STUN TURN servers") +var Mode = flag.String("mode", "dev", "Environment") var Width = 256 var Height = 240 var WSWait = 20 * time.Second var MatchWorkerRandom = false +var ProdEnv = "prod" diff --git a/go.mod b/go.mod index 31e571a9..ad7998bc 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cloud.google.com/go v0.39.0 github.com/gofrs/uuid v3.2.0+incompatible github.com/gorilla/websocket v1.4.0 - github.com/pion/webrtc/v2 v2.0.15 + github.com/pion/webrtc/v2 v2.0.23 github.com/prometheus/client_golang v0.9.3 github.com/satori/go.uuid v1.2.0 gopkg.in/hraban/opus.v2 v2.0.0-20180426093920-0f2e0b4fc6cd diff --git a/go.sum b/go.sum index e00e2ba7..3fbf59e4 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,9 @@ github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gortc/turn v0.7.1/go.mod h1:3FZ+LvCZKCKu6YYgwuYPqEi3FqCtdjfSFnFqVQNwfjk= +github.com/gortc/turn v0.7.3 h1:CE72C79erbcsfa6L/QDhKztcl2kDq1UK20ImrJWDt/w= +github.com/gortc/turn v0.7.3/go.mod h1:gvguwaGAFyv5/9KrcW9MkCgHALYD+e99mSM7pSCYYho= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -58,10 +61,16 @@ github.com/pion/datachannel v1.4.3 h1:tqS6YiqqAiFCxGGhvn1K7fHEzemK9Aov025dE/isGF github.com/pion/datachannel v1.4.3/go.mod h1:SpMJbuu8v+qbA94m6lWQwSdCf8JKQvgmdSHDNtcbe+w= github.com/pion/dtls v1.3.4 h1:MdOMsCfd44m2iTrxtkzA6UndvYVjLWWjua7hxU8EXEA= github.com/pion/dtls v1.3.4/go.mod h1:CjlPLfQdsTg3G4AEXjJp8FY5bRweBlxHrgoFrN+fQsk= +github.com/pion/dtls v1.3.5 h1:mBioifvh6JSE9pD4FtJh5WoizygoqkOJNJyS5Ns+y1U= +github.com/pion/dtls v1.3.5/go.mod h1:CjlPLfQdsTg3G4AEXjJp8FY5bRweBlxHrgoFrN+fQsk= github.com/pion/ice v0.2.8 h1:DCFMO8yJRB6XGaRjjdHupsHvjcM72LJ9YwL/2Io2EXk= github.com/pion/ice v0.2.8/go.mod h1:HyIp0mppSrUdw7DFLQfPgJWnPRRV96pnTV8irdrBGrA= +github.com/pion/ice v0.4.0 h1:BdTXHTjzdsJHGi9yMFnj9ffgr+Kg2oHVv1qk4B0mQ8A= +github.com/pion/ice v0.4.0/go.mod h1:/gw3aFmD/pBG8UM3TcEHs6HuaOEMSd/v1As3TodE7Ss= github.com/pion/logging v0.2.1 h1:LwASkBKZ+2ysGJ+jLv1E/9H1ge0k1nTfi1X+5zirkDk= github.com/pion/logging v0.2.1/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.2 h1:T22Gg4dSuYVYsZ21oRFh9z7twzAm27+5PEKiABbjCvM= +github.com/pion/mdns v0.0.2/go.mod h1:VrN3wefVgtfL8QgpEblPUC46ag1reLIfpqekCnKunLE= github.com/pion/quic v0.1.1/go.mod h1:zEU51v7ru8Mp4AUBJvj6psrSth5eEFNnVQK5K48oV3k= github.com/pion/rtcp v1.2.0 h1:rT2FptW5YHIern+4XlbGYnnsT26XGxurnkNLnzhtDXg= github.com/pion/rtcp v1.2.0/go.mod h1:a5dj2d6BKIKHl43EnAOIrCczcjESrtPuMgfmL6/K6QM= @@ -71,15 +80,27 @@ github.com/pion/sctp v1.6.3 h1:SC4vKOjcddK8tXiTNj05a+0/GyPpCmuNfeBA/rzNFqs= github.com/pion/sctp v1.6.3/go.mod h1:cCqpLdYvgEUdl715+qbWtgT439CuQrAgy8BZTp0aEfA= github.com/pion/sdp/v2 v2.1.1 h1:i3fAyjiLuQseYNo0BtCOPfzp91Ppb7vasRGmUUTog28= github.com/pion/sdp/v2 v2.1.1/go.mod h1:idSlWxhfWQDtTy9J05cgxpHBu/POwXN2VDRGYxT/EjU= +github.com/pion/sdp/v2 v2.2.0 h1:JiixCEU8g6LbSsh1Bg5SOk0TPnJrn2HBOA1yJ+mRYhI= +github.com/pion/sdp/v2 v2.2.0/go.mod h1:idSlWxhfWQDtTy9J05cgxpHBu/POwXN2VDRGYxT/EjU= github.com/pion/srtp v1.2.4 h1:wwGKC5ewuBukkZ+i+pZ8aO33+t6z2y/XRiYtyP0Xpv0= github.com/pion/srtp v1.2.4/go.mod h1:52qiP0g3FVMG/5NL6Ko8Vr2qirevKH+ukYbNS/4EX40= github.com/pion/stun v0.2.2 h1:0IJCwJFOdEmHzz4oxl9SBGLlJbnNbF+0h6XSOmuE034= github.com/pion/stun v0.2.2/go.mod h1:TChCNKgwnFiFG/c9K+zqEdd6pO6tlODb9yN1W/zVfsE= +github.com/pion/stun v0.3.0/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= +github.com/pion/stun v0.3.1 h1:d09JJzOmOS8ZzIp8NppCMgrxGZpJ4Ix8qirfNYyI3BA= +github.com/pion/stun v0.3.1/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= github.com/pion/transport v0.6.0/go.mod h1:iWZ07doqOosSLMhZ+FXUTq+TamDoXSllxpbGcfkCmbE= github.com/pion/transport v0.7.0 h1:EsXN8TglHMlKZMo4ZGqwK6QgXBu0WYg7wfGMWIXsS+w= github.com/pion/transport v0.7.0/go.mod h1:iWZ07doqOosSLMhZ+FXUTq+TamDoXSllxpbGcfkCmbE= +github.com/pion/transport v0.8.0 h1:YHZnWBBrBuMqkuvMFUHeAETXS+LgfwW1IsVd2K2cyW8= +github.com/pion/transport v0.8.0/go.mod h1:nAmRRnn+ArVtsoNuwktvAD+jrjSD7pA+H3iRmZwdUno= +github.com/pion/turn v1.1.4/go.mod h1:2O2GFDGO6+hJ5gsyExDhoNHtVcacPB1NOyc81gkq0WA= +github.com/pion/turnc v0.0.6 h1:FHsmwYvdJ8mhT1/ZtWWer9L0unEb7AyRgrymfWy6mEY= +github.com/pion/turnc v0.0.6/go.mod h1:4MSFv5i0v3MRkDLdo5eF9cD/xJtj1pxSphHNnxKL2W8= github.com/pion/webrtc/v2 v2.0.15 h1:0n8P+sYfGN515RnkdRyc4SD1r+0BZ5ts7SDSUxxlkmY= github.com/pion/webrtc/v2 v2.0.15/go.mod h1:e1xwQPR2XVoDWTj5uGSKfHB9Xk4oWRt7mk4bVfXHi8E= +github.com/pion/webrtc/v2 v2.0.23 h1:v/tDKsP4zB6Sj+Wx861fLsaNmbwWbxacciHUhetH288= +github.com/pion/webrtc/v2 v2.0.23/go.mod h1:AgremGibyNcHWIEkDbXt4ujKzKBO3tMuoYXybVRa8zo= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -128,6 +149,9 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190403144856-b630fd6fe46b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b h1:lkjdUzSyJ5P1+eal9fxXX9Xg2BTfswsonKUse48C0uE= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/overlord/handlers.go b/overlord/handlers.go index 7869495a..037beb0f 100644 --- a/overlord/handlers.go +++ b/overlord/handlers.go @@ -14,6 +14,7 @@ import ( "github.com/giongto35/cloud-game/config" "github.com/giongto35/cloud-game/cws" "github.com/giongto35/cloud-game/overlord/gamelist" + "github.com/giongto35/cloud-game/util" "github.com/gofrs/uuid" "github.com/gorilla/websocket" ) @@ -81,7 +82,21 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) { log.Println("Overlord: A new server connected to Overlord", serverID) // Register to workersClients map the client connection - client := NewWorkerClient(c, serverID, getRemoteAddress(c)) + address := util.GetRemoteAddress(c) + fmt.Println("Is public", util.IsPublicIP(address)) + fmt.Println("Mode: ", *config.Mode, config.ProdEnv) + if !util.IsPublicIP(address) && *config.Mode == config.ProdEnv { + // Don't accept private IP for worker's address in prod mode + // However, if the worker in the same host with overlord, we can get public IP of worker + log.Printf("Error: address %s is invalid", address) + address = util.GetHostPublicIP() + log.Println("Find public address:", address) + if address == "" || !util.IsPublicIP(address) { + // Skip this worker because we cannot find public IP + return + } + } + client := NewWorkerClient(c, serverID, address) o.workerClients[serverID] = client defer o.cleanConnection(client, serverID) @@ -124,7 +139,6 @@ func (o *Server) WS(w http.ResponseWriter, r *http.Request) { if config.MatchWorkerRandom { serverID, err = o.findBestServerRandom() } else { - //serverID, err = o.findBestServer(frontendAddr) serverID, err = o.findBestServerFromBrowser(client) } @@ -183,15 +197,13 @@ func (o *Server) findBestServerRandom() (string, error) { } // findBestServerFromBrowser returns the best server for a session -// All workers addresses are sent to user and user will ping +// All workers addresses are sent to user and user will ping to get latency func (o *Server) findBestServerFromBrowser(client *BrowserClient) (string, error) { // TODO: Find best Server by latency, currently return by ping if len(o.workerClients) == 0 { return "", errors.New("No server found") } - // TODO: Add timeout - log.Println("Ping worker to get latency for ", client) latencies := o.getLatencyMapFromBrowser(client) log.Println("Latency map", latencies) @@ -261,17 +273,3 @@ func (o *Server) cleanConnection(client *WorkerClient, serverID string) { client.Close() } - -// getRemoteAddress returns public address of websocket connection -func getRemoteAddress(conn *websocket.Conn) string { - var remoteAddr string - log.Println(conn.RemoteAddr().String()) - if parts := strings.Split(conn.RemoteAddr().String(), ":"); len(parts) == 2 { - remoteAddr = parts[0] - } - if remoteAddr == "" { - return "localhost" - } - - return remoteAddr -} diff --git a/static/js/ws.js b/static/js/ws.js index b3682fed..87232043 100644 --- a/static/js/ws.js +++ b/static/js/ws.js @@ -108,8 +108,8 @@ conn.onmessage = e => { //sumLatency += afterTime - beforeTime latenciesMap[addr] = afterTime - beforeTime if (cntResp == addrs.length) { - log(`Send latency list ${latenciesMap}`) - log(curPacketID) + log(`Send latency list`) + console.log(latenciesMap) conn.send(JSON.stringify({"id": "checkLatency", "data": JSON.stringify(latenciesMap), "packet_id": latencyPacketID})); startWebRTC(); @@ -122,7 +122,7 @@ conn.onmessage = e => { latenciesMap[addr] = afterTime - beforeTime if (cntResp == addrs.length) { log(`Send latency list ${latenciesMap}`) - log(curPacketID) + console.log(latenciesMap) //conn.send(JSON.stringify({"id": "checkLatency", "data": latenciesMap, "packet_id": latencyPacketID})); conn.send(JSON.stringify({"id": "checkLatency", "data": JSON.stringify(latenciesMap), "packet_id": latencyPacketID}));