diff --git a/main.go b/main.go index 428c3a4d..fef5222b 100644 --- a/main.go +++ b/main.go @@ -12,11 +12,7 @@ import ( "github.com/giongto35/game-online/ui" "github.com/giongto35/game-online/util" "github.com/giongto35/game-online/webrtc" - - // "github.com/gorilla/mux" - "github.com/gorilla/websocket" - - "encoding/json" + "github.com/gorilla/mux" ) // var webRTC *webrtc.WebRTC @@ -26,13 +22,6 @@ var gameName = "supermariobros.rom" // var FPS = 60 -var upgrader = websocket.Upgrader{} - -type WSPacket struct { - ID string `json:"id"` - Data string `json:"data"` -} - func init() { } @@ -45,18 +34,18 @@ func main() { fmt.Println("http://localhost:8000") // webRTC = webrtc.NewWebRTC() - // router := mux.NewRouter() - // router.HandleFunc("/", getWeb).Methods("GET") - // router.HandleFunc("/session", postSession).Methods("POST") - // http.ListenAndServe(":8000", router) + router := mux.NewRouter() + router.HandleFunc("/", getWeb).Methods("GET") + router.HandleFunc("/session", postSession).Methods("POST") - // ignore origin - upgrader.CheckOrigin = func(r *http.Request) bool { return true } + // go http.ListenAndServe(":8000", router) + http.ListenAndServe(":8000", router) - http.HandleFunc("/", getWeb) - http.HandleFunc("/ws", ws) + // start screenshot loop, wait for connection - http.ListenAndServe(":8000", nil) + // go screenshotLoop(imageChannel) + // startGame("games/"+gameName, imageChannel, webRTC.InputChannel) + // time.Sleep(time.Minute) } func getWeb(w http.ResponseWriter, r *http.Request) { @@ -67,91 +56,27 @@ func getWeb(w http.ResponseWriter, r *http.Request) { w.Write(bs) } -func ws(w http.ResponseWriter, r *http.Request) { - c, err := upgrader.Upgrade(w, r, nil) +func postSession(w http.ResponseWriter, r *http.Request) { + bs, err := ioutil.ReadAll(r.Body) if err != nil { - log.Print("upgrade:", err) - return + log.Fatal(err) } - defer c.Close() + r.Body.Close() webRTC := webrtc.NewWebRTC() - localSession, err := webRTC.StartClient(width, height) + + localSession, err := webRTC.StartClient(string(bs), width, height) if err != nil { log.Fatalln(err) } - // streaming game - // imageChannel := make(chan *image.RGBA, 100) - // go screenshotLoop(imageChannel, webRTC) - // go startGame("games/" + gameName, imageChannel, webRTC.InputChannel, webRTC) + imageChannel := make(chan *image.RGBA, 100) + go screenshotLoop(imageChannel, webRTC) + go startGame("games/"+gameName, imageChannel, webRTC.InputChannel, webRTC) - // start new games and webrtc stuff? - for { - mt, message, err := c.ReadMessage() - if err != nil { - log.Println("read:", err) - break - } - - req := WSPacket{} - err = json.Unmarshal(message, &req) - if err != nil { - log.Println("json unmarshal:", err) - break - } - log.Println(req) - - // connectivity - res := WSPacket{} - switch req.ID { - case "ping": - res.ID = "pong" - - case "sdp": - webRTC.SetRemoteSession(res.Data) - res.ID = "sdp" - res.Data = localSession - - case "candidate": - res.ID = "candidate" - } - - stRes, err := json.Marshal(res) - if err != nil { - log.Println("json marshal:", err) - } - - err = c.WriteMessage(mt, []byte(stRes)) - if err != nil { - log.Println("write:", err) - break - } - - } + w.Write([]byte(localSession)) } -// func postSession(w http.ResponseWriter, r *http.Request) { -// bs, err := ioutil.ReadAll(r.Body) -// if err != nil { -// log.Fatal(err) -// } -// r.Body.Close() - -// webRTC := webrtc.NewWebRTC() - -// localSession, err := webRTC.StartClient(string(bs), width, height) -// if err != nil { -// log.Fatalln(err) -// } - -// imageChannel := make(chan *image.RGBA, 100) -// go screenshotLoop(imageChannel, webRTC) -// go startGame("games/"+gameName, imageChannel, webRTC.InputChannel, webRTC) - -// w.Write([]byte(localSession)) -// } - // func screenshotLoop(imageChannel chan *image.RGBA) { func screenshotLoop(imageChannel chan *image.RGBA, webRTC *webrtc.WebRTC) { for image := range imageChannel { diff --git a/webrtc/webrtc.go b/webrtc/webrtc.go index a529f0bf..095109af 100644 --- a/webrtc/webrtc.go +++ b/webrtc/webrtc.go @@ -108,14 +108,14 @@ type WebRTC struct { connection *webrtc.PeerConnection encoder *vpxEncoder.VpxEncoder isConnected bool - isClosed bool + isClosed bool // for yuvI420 image ImageChannel chan []byte InputChannel chan int } // StartClient start webrtc -func (w *WebRTC) StartClient(width, height int) (string, error) { +func (w *WebRTC) StartClient(remoteSession string, width, height int) (string, error) { defer func() { if err := recover(); err != nil { fmt.Println(err) @@ -151,7 +151,6 @@ func (w *WebRTC) StartClient(width, height int) (string, error) { return "", err } - // WebRTC state callback w.connection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { fmt.Printf("ICE Connection State has changed: %s\n", connectionState.String()) if connectionState == webrtc.ICEConnectionStateConnected { @@ -167,7 +166,8 @@ func (w *WebRTC) StartClient(width, height int) (string, error) { } }) - // Data channel callback + //w.listenInputChannel() + // Data channel w.connection.OnDataChannel(func(d *webrtc.DataChannel) { fmt.Printf("New DataChannel %s %d\n", d.Label(), d.ID()) @@ -184,28 +184,23 @@ func (w *WebRTC) StartClient(width, height int) (string, error) { }) }) + offer := webrtc.SessionDescription{} + Decode(remoteSession, &offer) + if err != nil { + return "", err + } + err = w.connection.SetRemoteDescription(offer) + if err != nil { + return "", err + } answer, err := w.connection.CreateAnswer(nil) if err != nil { return "", err } - localSession := Encode(answer) return localSession, nil } -func (w *WebRTC) SetRemoteSession(remoteSession string) error { - offer := webrtc.SessionDescription{} - - Decode(remoteSession, &offer) - - err := w.connection.SetRemoteDescription(offer) - if err != nil { - return err - } - - return nil -} - // StopClient disconnect func (w *WebRTC) StopClient() { fmt.Println("===StopClient===")