From 8d33218b323c4ae8bc7e89945b0cb6e811bf5ed2 Mon Sep 17 00:00:00 2001 From: giongto35 Date: Sat, 20 Apr 2019 02:05:50 +0800 Subject: [PATCH] Setup overlord --- main.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++++---- overlord.go | 28 ---------------------- ws.go | 9 +++---- 3 files changed, 68 insertions(+), 37 deletions(-) delete mode 100644 overlord.go diff --git a/main.go b/main.go index 29b0c8bc..71f830b0 100644 --- a/main.go +++ b/main.go @@ -63,22 +63,31 @@ func main() { fmt.Println("Use debug version") } if len(os.Args) == 3 { - if os.Args[3] == "overlord" { + if os.Args[2] == "overlord" { IsOverlord = true } + fmt.Println("Running as overlord ") } rand.Seed(time.Now().UTC().UnixNano()) - fmt.Println("http://localhost:8000") rooms = map[string]*Room{} // ignore origin upgrader.CheckOrigin = func(r *http.Request) bool { return true } - http.HandleFunc("/ws", ws) http.HandleFunc("/", getWeb) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))) - http.ListenAndServe(":8000", nil) + http.HandleFunc("/ws", ws) + + if !IsOverlord { + fmt.Println("http://localhost:8000") + http.ListenAndServe(":8000", nil) + } else { + fmt.Println("http://localhost:9000") + // Overlord expose one more path for handle overlord connections + http.HandleFunc("/wso", wso) + http.ListenAndServe(":9000", nil) + } } func getWeb(w http.ResponseWriter, r *http.Request) { @@ -155,7 +164,9 @@ func startSession(webRTC *webrtc.WebRTC, gameName string, roomID string, playerI return roomID } -func ws(w http.ResponseWriter, r *http.Request) { +// If it's overlord, handle overlord connection (from host to overlord) +func wso(w http.ResponseWriter, r *http.Request) { + fmt.Println("Connected") c, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("[!] WS upgrade:", err) @@ -163,6 +174,37 @@ func ws(w http.ResponseWriter, r *http.Request) { } defer c.Close() + client := NewClient(c, webrtc.NewWebRTC()) + + client.syncReceive("ping", func(req WSPacket) WSPacket { + log.Println("received Ping, sending Pong") + return WSPacket{ + ID: "pong", + } + }) + client.listen() +} + +const overlordHost = "ws://localhost:9000/wso" + +func createOverlordClient() (*websocket.Conn, error) { + c, _, err := websocket.DefaultDialer.Dial(overlordHost, nil) + if err != nil { + log.Fatal("dial:", err) + return nil, err + } + + return c, nil +} + +// Handle normal traffic (from browser to host) +func ws(w http.ResponseWriter, r *http.Request) { + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("[!] WS upgrade:", err) + return + } + defer c.Close() var gameName string var roomID string var playerIndex int @@ -244,6 +286,22 @@ func ws(w http.ResponseWriter, r *http.Request) { return res }) + // Create connection to overlord + if !IsOverlord { + oc, err := createOverlordClient() + if err != nil { + log.Println("Cannot connect to overlord") + } + oclient := NewClient(oc, webrtc.NewWebRTC()) + oclient.syncSend(WSPacket{ + ID: "ping", + }, + func(resp WSPacket) { + log.Println("pong") + }, + ) + } + client.listen() } diff --git a/overlord.go b/overlord.go deleted file mode 100644 index 72b7f2a3..00000000 --- a/overlord.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "github.com/gorilla/websocket" -) - -const overlordHost = "http://localhost:9000" - -type Overlord struct { - ws websocket.Conn -} - -//func createOverlordClient() websocket.Conn { -//signal.Notify(interrupt, os.Interrupt) - -////u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"} -////log.Printf("connecting to %s", u.String()) - -//c, _, err := websocket.DefaultDialer.Dial(overlordHost, nil) -//if err != nil { -//log.Fatal("dial:", err) -//} -//overlord := &Overlord{ -//ws: c, -//} - -//return overlord -//} diff --git a/ws.go b/ws.go index e971c410..a529047e 100644 --- a/ws.go +++ b/ws.go @@ -10,8 +10,8 @@ import ( ) type Client struct { - conn *websocket.Conn - wsoverlord *websocket.Conn + conn *websocket.Conn + peerconnection *webrtc.WebRTC // sendCallback is callback based on packetID @@ -35,7 +35,8 @@ func NewClient(conn *websocket.Conn, webrtc *webrtc.WebRTC) *Client { sendCallback := map[string]func(WSPacket){} recvCallback := map[string]func(WSPacket){} return &Client{ - conn: conn, + conn: conn, + peerconnection: webrtc, sendCallback: sendCallback, recvCallback: recvCallback, @@ -49,7 +50,7 @@ func (c *Client) syncSend(packet WSPacket, callback func(msg WSPacket)) { return } - c.conn.WriteMessage(0, data) + c.conn.WriteMessage(websocket.TextMessage, data) c.sendCallback[packet.PacketID] = callback }