From 9bde5b14dded8e79f47e7fcdebda7ac7bcf81afd Mon Sep 17 00:00:00 2001
From: giongto35
Date: Tue, 9 Apr 2019 23:05:04 +0800
Subject: [PATCH] Remove HTTP
---
main.go | 137 ++++-------------------
static/gameboy.html | 2 +-
static/index_http.html | 245 -----------------------------------------
static/js/http.js | 86 ---------------
static/js/ws.js | 2 -
5 files changed, 25 insertions(+), 447 deletions(-)
delete mode 100644 static/index_http.html
delete mode 100644 static/js/http.js
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 @@
-
+
-
-
-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;
}