mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-07-22 01:29:14 +00:00
Add SyncSend to send and wait
This commit is contained in:
parent
563d5edac2
commit
73a6a0fe61
3 changed files with 44 additions and 37 deletions
43
main.go
43
main.go
|
|
@ -188,7 +188,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
// Create connection to overlord
|
||||
client := NewClient(c, webrtc.NewWebRTC())
|
||||
|
||||
wssession := Session{
|
||||
wssession := &Session{
|
||||
client: client,
|
||||
// The server session is maintaining
|
||||
}
|
||||
|
|
@ -197,7 +197,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
wssession.NewOverlordClient()
|
||||
}
|
||||
|
||||
client.syncReceive("initwebrtc", func(resp WSPacket) WSPacket {
|
||||
client.receive("initwebrtc", func(resp WSPacket) WSPacket {
|
||||
log.Println("Received user SDP")
|
||||
localSession, err := client.peerconnection.StartClient(resp.Data, width, height)
|
||||
if err != nil {
|
||||
|
|
@ -210,7 +210,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
})
|
||||
|
||||
client.syncReceive("save", func(resp WSPacket) (req WSPacket) {
|
||||
client.receive("save", func(resp WSPacket) (req WSPacket) {
|
||||
log.Println("Saving game state")
|
||||
req.ID = "save"
|
||||
req.Data = "ok"
|
||||
|
|
@ -227,7 +227,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
return req
|
||||
})
|
||||
|
||||
client.syncReceive("load", func(resp WSPacket) (req WSPacket) {
|
||||
client.receive("load", func(resp WSPacket) (req WSPacket) {
|
||||
log.Println("Loading game state")
|
||||
req.ID = "load"
|
||||
req.Data = "ok"
|
||||
|
|
@ -244,7 +244,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
return req
|
||||
})
|
||||
|
||||
client.syncReceive("start", func(resp WSPacket) (req WSPacket) {
|
||||
client.receive("start", func(resp WSPacket) (req WSPacket) {
|
||||
gameName = resp.Data
|
||||
roomID = resp.RoomID
|
||||
playerIndex = resp.PlayerIndex
|
||||
|
|
@ -252,10 +252,11 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
//log.Println("Ping from server with game:", gameName)
|
||||
//res.ID = "pong"
|
||||
log.Println("Starting game")
|
||||
roomServerID := <-GetServerIDOfRoom(wssession.oclient, roomID)
|
||||
roomServerID := GetServerIDOfRoom(wssession.oclient, roomID)
|
||||
log.Println("Server of RoomID ", roomID, " is ", roomServerID)
|
||||
if roomServerID != "" && wssession.ServerID != roomServerID {
|
||||
// TODO: Re -register
|
||||
bridgeConnection(wssession, roomServerID)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -264,7 +265,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
wssession.oclient.send(WSPacket{
|
||||
ID: "registerRoom",
|
||||
Data: roomID,
|
||||
})
|
||||
}, nil)
|
||||
}
|
||||
req.ID = "start"
|
||||
req.RoomID = roomID
|
||||
|
|
@ -272,7 +273,7 @@ func ws(w http.ResponseWriter, r *http.Request) {
|
|||
return req
|
||||
})
|
||||
|
||||
client.syncReceive("candidate", func(resp WSPacket) (req WSPacket) {
|
||||
client.receive("candidate", func(resp WSPacket) (req WSPacket) {
|
||||
// Unuse code
|
||||
hi := pionRTC.ICECandidateInit{}
|
||||
err = json.Unmarshal([]byte(resp.Data), &hi)
|
||||
|
|
@ -382,17 +383,19 @@ func removeSession(w *webrtc.WebRTC, room *Room) {
|
|||
}
|
||||
}
|
||||
|
||||
func GetServerIDOfRoom(oc *Client, roomID string) chan string {
|
||||
res := make(chan string)
|
||||
func GetServerIDOfRoom(oc *Client, roomID string) string {
|
||||
packet := oc.syncSend(
|
||||
WSPacket{
|
||||
ID: "getRoom",
|
||||
Data: roomID,
|
||||
},
|
||||
)
|
||||
|
||||
oc.syncSend(WSPacket{
|
||||
ID: "getRoom",
|
||||
Data: roomID,
|
||||
}, func(resp WSPacket) {
|
||||
log.Println("GetRoom", resp.Data)
|
||||
res <- resp.Data
|
||||
})
|
||||
return res
|
||||
return packet.Data
|
||||
}
|
||||
|
||||
func bridgeConnection(session *Session, serverID string) {
|
||||
// Ask client to init
|
||||
}
|
||||
|
||||
const overlordHost = "ws://localhost:9000/wso"
|
||||
|
|
@ -413,7 +416,7 @@ func (s *Session) NewOverlordClient() {
|
|||
log.Println("Cannot connect to overlord")
|
||||
}
|
||||
oclient := NewClient(oc, webrtc.NewWebRTC())
|
||||
oclient.syncSend(
|
||||
oclient.send(
|
||||
WSPacket{
|
||||
ID: "ping",
|
||||
},
|
||||
|
|
@ -423,7 +426,7 @@ func (s *Session) NewOverlordClient() {
|
|||
)
|
||||
|
||||
// Received from overlord the serverID
|
||||
oclient.syncReceive(
|
||||
oclient.receive(
|
||||
"serverID",
|
||||
func(response WSPacket) (request WSPacket) {
|
||||
// Stick session with serverID got from overlord
|
||||
|
|
|
|||
|
|
@ -36,16 +36,17 @@ func wso(w http.ResponseWriter, r *http.Request) {
|
|||
ID: "serverID",
|
||||
Data: serverID,
|
||||
},
|
||||
nil,
|
||||
)
|
||||
|
||||
client.syncReceive("ping", func(resp WSPacket) WSPacket {
|
||||
client.receive("ping", func(resp WSPacket) WSPacket {
|
||||
log.Println("received Ping, sending Pong")
|
||||
return WSPacket{
|
||||
ID: "pong",
|
||||
}
|
||||
})
|
||||
|
||||
client.syncReceive("registerRoom", func(resp WSPacket) WSPacket {
|
||||
client.receive("registerRoom", func(resp WSPacket) WSPacket {
|
||||
log.Println("Received registerRoom ", resp.Data, serverID)
|
||||
roomToServer[resp.Data] = serverID
|
||||
return WSPacket{
|
||||
|
|
@ -53,7 +54,7 @@ func wso(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
})
|
||||
|
||||
client.syncReceive("getRoom", func(resp WSPacket) WSPacket {
|
||||
client.receive("getRoom", func(resp WSPacket) WSPacket {
|
||||
return WSPacket{
|
||||
ID: "getRoom",
|
||||
Data: roomToServer[resp.Data],
|
||||
|
|
|
|||
31
ws.go
31
ws.go
|
|
@ -47,18 +47,8 @@ func NewClient(conn *websocket.Conn, webrtc *webrtc.WebRTC) *Client {
|
|||
}
|
||||
}
|
||||
|
||||
// send sends a normal packet
|
||||
func (c *Client) send(request WSPacket) {
|
||||
data, err := json.Marshal(request)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
c.conn.WriteMessage(websocket.TextMessage, data)
|
||||
}
|
||||
|
||||
// syncSend sends a packet and trigger callback when the packet comes back
|
||||
func (c *Client) syncSend(request WSPacket, callback func(response WSPacket)) {
|
||||
// send sends a packet and trigger callback when the packet comes back
|
||||
func (c *Client) send(request WSPacket, callback func(response WSPacket)) {
|
||||
request.PacketID = strconv.Itoa(rand.Int())
|
||||
data, err := json.Marshal(request)
|
||||
if err != nil {
|
||||
|
|
@ -66,11 +56,14 @@ func (c *Client) syncSend(request WSPacket, callback func(response WSPacket)) {
|
|||
}
|
||||
|
||||
c.conn.WriteMessage(websocket.TextMessage, data)
|
||||
if callback == nil {
|
||||
return
|
||||
}
|
||||
c.sendCallback[request.PacketID] = callback
|
||||
}
|
||||
|
||||
// syncReceive receive and response back
|
||||
func (c *Client) syncReceive(id string, f func(response WSPacket) (request WSPacket)) {
|
||||
// receive receive and response back
|
||||
func (c *Client) receive(id string, f func(response WSPacket) (request WSPacket)) {
|
||||
c.recvCallback[id] = func(response WSPacket) {
|
||||
packet := f(response)
|
||||
// Add Meta data
|
||||
|
|
@ -89,6 +82,16 @@ func (c *Client) syncReceive(id string, f func(response WSPacket) (request WSPac
|
|||
}
|
||||
}
|
||||
|
||||
// syncSend sends a packet and wait for callback till the packet comes back
|
||||
func (c *Client) syncSend(request WSPacket) (response WSPacket) {
|
||||
res := make(chan WSPacket)
|
||||
f := func(resp WSPacket) {
|
||||
res <- resp
|
||||
}
|
||||
c.send(request, f)
|
||||
return <-res
|
||||
}
|
||||
|
||||
func (c *Client) listen() {
|
||||
for {
|
||||
_, rawMsg, err := c.conn.ReadMessage()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue