Add SyncSend to send and wait

This commit is contained in:
giongto35 2019-04-20 10:34:49 +08:00
parent 563d5edac2
commit 73a6a0fe61
3 changed files with 44 additions and 37 deletions

43
main.go
View file

@ -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

View file

@ -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
View file

@ -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()