diff --git a/main.go b/main.go index bc71cd8f..b9c55ff9 100644 --- a/main.go +++ b/main.go @@ -1,31 +1,25 @@ package main import ( - "html/template" - "math/rand" - "os" - "strconv" - "time" - - pionRTC "github.com/pion/webrtc" - + "encoding/json" "fmt" "image" "io/ioutil" "log" + "math/rand" "net/http" + _ "net/http/pprof" + "strconv" + "time" "github.com/giongto35/cloud-game/ui" "github.com/giongto35/cloud-game/util" "github.com/giongto35/cloud-game/webrtc" - "github.com/gorilla/websocket" - - "encoding/json" + pionRTC "github.com/pion/webrtc" ) const gameboyIndex = "./static/gameboy.html" -const httpIndex = "./static/index_http.html" const wsIndex = "./static/index_ws.html" var width = 256 @@ -50,12 +44,6 @@ type WSPacket struct { PlayerIndex int `json:"player_index"` } -type SessionPacket struct { - Game string `json:"game"` - RoomID string `json:"room_id"` - SDP string `json:"sdp"` -} - type Room struct { imageChannel chan *image.RGBA inputChannel chan int @@ -64,54 +52,33 @@ type Room struct { var rooms map[string]*Room -func init() { -} - -func startGame(path string, roomID string, imageChannel chan *image.RGBA, inputChannel chan int) { - ui.Run([]string{path}, roomID, imageChannel, inputChannel) -} - func main() { rand.Seed(time.Now().UTC().UnixNano()) - fmt.Printf("Usage: %s [ws]\n", os.Args[0]) fmt.Println("http://localhost:8000") rooms = map[string]*Room{} - if len(os.Args) > 1 { - service = "ws" - log.Println("Using websocket") - - // ignore origin - upgrader.CheckOrigin = func(r *http.Request) bool { return true } - http.HandleFunc("/ws", ws) - } else { - log.Println("Using http") - http.HandleFunc("/session", postSession) - } + // 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) } -func getWeb(w http.ResponseWriter, r *http.Request) { - if indexFN != gameboyIndex { - bs, err := ioutil.ReadFile(indexFN) - if err != nil { - log.Fatal(err) - } - w.Write(bs) - } else { - // gameboy index - tmpl := template.Must(template.ParseFiles(indexFN)) - data := IndexPageData{ - Service: service, - } - tmpl.Execute(w, data) - } +func startGame(path string, roomID string, imageChannel chan *image.RGBA, inputChannel chan int) { + ui.Run([]string{path}, roomID, imageChannel, inputChannel) } -// initRoom initilize room returns roomID +func getWeb(w http.ResponseWriter, r *http.Request) { + bs, err := ioutil.ReadFile(indexFN) + if err != nil { + log.Fatal(err) + } + w.Write(bs) +} + +// init initilize room returns roomID func initRoom(roomID, gameName string) string { roomID = generateRoomID() imageChannel := make(chan *image.RGBA, 100) @@ -127,7 +94,9 @@ func initRoom(roomID, gameName string) string { return roomID } +// startSession handles one session call func startSession(webRTC *webrtc.WebRTC, gameName string, roomID string, playerIndex int) string { + // If the roomID is empty, we spawn a new room if roomID == "" { roomID = initRoom(roomID, gameName) } @@ -168,15 +137,15 @@ func ws(w http.ResponseWriter, r *http.Request) { } req := WSPacket{} + res := 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": gameName = req.Data @@ -228,64 +197,6 @@ func ws(w http.ResponseWriter, r *http.Request) { } } -func postSession(w http.ResponseWriter, r *http.Request) { - bs, err := ioutil.ReadAll(r.Body) - if err != nil { - log.Fatal(err) - } - r.Body.Close() - - var postPacket SessionPacket - err = json.Unmarshal(bs, &postPacket) - if err != nil { - log.Fatalln(err) - } - - log.Println("Got session with game request:", postPacket.Game) - - webRTC := webrtc.NewWebRTC() - - localSession, err := webRTC.StartClient(postPacket.SDP, width, height) - if err != nil { - log.Fatalln(err) - } - - roomID := postPacket.RoomID - if roomID == "" { - fmt.Println("Init Room") - //generate new room - roomID = generateRoomID() - - imageChannel := make(chan *image.RGBA, 100) - inputChannel := make(chan int, 100) - rooms[roomID] = &Room{ - imageChannel: imageChannel, - inputChannel: inputChannel, - rtcSessions: []*webrtc.WebRTC{}, - } - go fanoutScreen(imageChannel, roomID) - go startGame("games/"+postPacket.Game, roomID, imageChannel, inputChannel) - // fanin input channel - // fanout output channel - } else { - // if there is room, reuse image channel, add webRTC session - } - rooms[roomID].rtcSessions = append(rooms[roomID].rtcSessions, webRTC) - faninInput(rooms[roomID].inputChannel, webRTC, 1) - - res := SessionPacket{ - SDP: localSession, - RoomID: roomID, - } - stRes, err := json.Marshal(res) - if err != nil { - log.Println("json marshal:", err) - } - - //w.Write([]byte(localSession)) - w.Write(stRes) -} - // generateRoomID generate a unique room ID containing 16 digits func generateRoomID() string { roomID := strconv.FormatInt(rand.Int63(), 16) diff --git a/static/gameboy.html b/static/gameboy.html index 3df5bcbb..54aa6c8f 100644 --- a/static/gameboy.html +++ b/static/gameboy.html @@ -176,5 +176,5 @@ - + diff --git a/static/index_http.html b/static/index_http.html deleted file mode 100644 index 19911730..00000000 --- a/static/index_http.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - -Room ID:
- -

- - -

- -

Instruction

-
- Use Up, Down, Left, Right to Move
- Z to jump (A)
- X to sprint (B)
- C is start button
- V is select button
- - -

- -

Log:

-

-
-
- 🎮Refresh to retry when checking is too long -
- - diff --git a/static/js/http.js b/static/js/http.js deleted file mode 100644 index 8b1d2919..00000000 --- a/static/js/http.js +++ /dev/null @@ -1,86 +0,0 @@ -// http signal server - -function startGame() { - log("Starting game screen") - - // clear - endInput(); - document.getElementById('div').innerHTML = ""; - $("#loading-screen").show(); - $("#menu-screen").fadeOut(); - // end clear - - // Register with server the session description - function postSession(session) { - if (session == "") { - return; - } - var xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState == 4 && this.status == 200) { - remoteSessionDescription = this.responseText; - // document.getElementById('playGame').disabled = false; - // by original design, we would click to start. - startSession(); - } - }; - xhttp.open("POST", "/session", true); - xhttp.setRequestHeader("Content-type", "application/json"); - xhttp.send(JSON.stringify({ "game": GAME_LIST[gameIdx].nes, "sdp": session })); - - } - let pc = new RTCPeerConnection({ - iceServers: [ - { - urls: 'stun:stun.l.google.com:19302' - } - ] - }) - - - inputChannel = pc.createDataChannel('foo') - inputChannel.onclose = () => log('inputChannel has closed') - inputChannel.onopen = () => log('inputChannel has opened') - inputChannel.onmessage = e => log(`Message from DataChannel '${inputChannel.label}' payload '${e.data}'`) - - pc.ontrack = function (event) { - log("New stream, yay!"); - document.getElementById("loading-screen").srcObject = event.streams[0]; - - // document.getElementById('remoteVideos').appendChild(el) - } - - pc.onicecandidate = event => { - if (event.candidate === null) { - var session = btoa(JSON.stringify(pc.localDescription)); - localSessionDescription = session; - postSession(session) - } - } - pc.createOffer({ offerToReceiveVideo: true, offerToReceiveAudio: true }).then(d => pc.setLocalDescription(d)).catch(log) - - window.startSession = () => { - let sd = remoteSessionDescription - if (sd === '') { - return alert('Session Description must not be empty') - } - try { - pc.setRemoteDescription(new RTCSessionDescription(JSON.parse(atob(sd)))); - } catch (e) { - alert(e); - } - } - - pc.oniceconnectionstatechange = e => { - log(`iceConnectionState: ${pc.iceConnectionState}`); - - if (pc.iceConnectionState === "connected") { - startInput(); - screenState = "game"; - } - else if (pc.iceConnectionState === "disconnected") { - endInput(); - } - - } -} diff --git a/static/js/ws.js b/static/js/ws.js index 6af54384..348abb5a 100644 --- a/static/js/ws.js +++ b/static/js/ws.js @@ -81,8 +81,6 @@ function startGame() { pc.ontrack = function (event) { log("New stream, yay!"); document.getElementById("loading-screen").srcObject = event.streams[0]; - // document.getElementById("loading-screen").width = 270; - // document.getElementById("loading-screen").height = 240; }