From e19c10a2191ccdae1154d7775d41dec59699d78c Mon Sep 17 00:00:00 2001 From: giongto35 Date: Sun, 21 Apr 2019 18:11:53 +0800 Subject: [PATCH] Only maintains heartbeat from server to overlord --- main.go | 5 ++++- overlord.go | 1 + ws.go | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 1114b99a..37e54a75 100644 --- a/main.go +++ b/main.go @@ -73,12 +73,13 @@ func main() { } if len(os.Args) >= 3 { if os.Args[2] == "overlord" { + fmt.Println("Running as overlord ") IsOverlord = true } else { + fmt.Println("Running as slave ") // If the third arg is not overlord, it is path to overlord overlordHost = os.Args[2] } - fmt.Println("Running as overlord ") } if len(os.Args) >= 4 { port = os.Args[3] @@ -536,6 +537,8 @@ func NewOverlordClient() *Client { return req }, ) + // heartbeat to keep pinging overlord. We not ping from server to browser, so we don't call heartbeat in browserClient + go oclient.heartbeat() go oclient.listen() return oclient diff --git a/overlord.go b/overlord.go index 06c90341..e7d2fdf0 100644 --- a/overlord.go +++ b/overlord.go @@ -62,6 +62,7 @@ func wso(w http.ResponseWriter, r *http.Request) { }) client.receive("getRoom", func(resp WSPacket) WSPacket { + log.Println("Received a getroom request") return WSPacket{ ID: "getRoom", Data: roomToServer[resp.Data], diff --git a/ws.go b/ws.go index 035b4d37..f9d8d4e7 100644 --- a/ws.go +++ b/ws.go @@ -96,6 +96,16 @@ func (c *Client) syncSend(request WSPacket) (response WSPacket) { return <-res } +// heartbeat maintains connection to server +func (c *Client) heartbeat() { + // send heartbeat every 1s + timer := time.Tick(time.Second) + + for range timer { + c.send(WSPacket{ID: "heartbeat"}, nil) + } +} + func (c *Client) listen() { for { log.Println("Waiting for message") @@ -106,20 +116,20 @@ func (c *Client) listen() { } wspacket := WSPacket{} err = json.Unmarshal(rawMsg, &wspacket) - if err != nil { + if err != nil || wspacket.ID == "heartbeat" { continue } // Check if some async send is waiting for the response based on packetID if callback, ok := c.sendCallback[wspacket.PacketID]; ok { - callback(wspacket) + go callback(wspacket) delete(c.sendCallback, wspacket.PacketID) // Skip receiveCallback to avoid duplication continue } // Check if some receiver with the ID is registered if callback, ok := c.recvCallback[wspacket.ID]; ok { - callback(wspacket) + go callback(wspacket) } } }