mirror of
https://github.com/giongto35/cloud-game.git
synced 2026-07-21 09:08:57 +00:00
150 lines
3.9 KiB
Go
150 lines
3.9 KiB
Go
package coordinator
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/giongto35/cloud-game/pkg/cws"
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type BrowserClient struct {
|
|
*cws.Client
|
|
}
|
|
|
|
// RouteBrowser are all routes server accepts for browser
|
|
func (s *Session) RouteBrowser() {
|
|
browserClient := s.BrowserClient
|
|
|
|
browserClient.Receive("heartbeat", func(resp cws.WSPacket) cws.WSPacket {
|
|
return resp
|
|
})
|
|
|
|
browserClient.Receive("icecandidate", func(resp cws.WSPacket) cws.WSPacket {
|
|
log.Println("Coordinator: Received icecandidate from a browser", resp.Data)
|
|
log.Println("Coordinator: Relay icecandidate from a browser to worker")
|
|
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
wc.Send(resp, nil)
|
|
|
|
return cws.EmptyPacket
|
|
})
|
|
|
|
browserClient.Receive("initwebrtc", func(resp cws.WSPacket) cws.WSPacket {
|
|
log.Println("Coordinator: Received sdp request from a browser")
|
|
log.Println("Coordinator: Relay sdp request from a browser to worker")
|
|
|
|
// relay SDP to target worker and get back SDP of the worker
|
|
// TODO: Async
|
|
log.Println("Coordinator: serverID: ", s.ServerID, resp.SessionID)
|
|
resp.SessionID = s.ID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
sdp := wc.SyncSend(
|
|
resp,
|
|
)
|
|
|
|
log.Println("Coordinator: Received sdp request from a worker")
|
|
log.Println("Coordinator: Sending back sdp to browser")
|
|
|
|
return sdp
|
|
})
|
|
|
|
browserClient.Receive("quit", func(resp cws.WSPacket) (req cws.WSPacket) {
|
|
log.Println("Coordinator: Received quit request from a browser")
|
|
log.Println("Coordinator: Relay quit request from a browser to worker")
|
|
|
|
// TODO: Async
|
|
resp.SessionID = s.ID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
resp = wc.SyncSend(
|
|
resp,
|
|
)
|
|
|
|
return cws.EmptyPacket
|
|
})
|
|
|
|
browserClient.Receive("start", func(resp cws.WSPacket) cws.WSPacket {
|
|
log.Println("Coordinator: Received start request from a browser")
|
|
log.Println("Coordinator: Relay start request from a browser to worker")
|
|
// TODO: Async
|
|
resp.SessionID = s.ID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
workerResp := wc.SyncSend(
|
|
resp,
|
|
)
|
|
// Response from worker contains initialized roomID. Set roomID to the session
|
|
s.RoomID = workerResp.RoomID
|
|
log.Println("Received room response from browser: ", workerResp.RoomID)
|
|
|
|
return workerResp
|
|
})
|
|
|
|
browserClient.Receive("save", func(resp cws.WSPacket) (req cws.WSPacket) {
|
|
log.Println("Coordinator: Received save request from a browser")
|
|
log.Println("Coordinator: Relay save request from a browser to worker")
|
|
// TODO: Async
|
|
resp.SessionID = s.ID
|
|
resp.RoomID = s.RoomID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
resp = wc.SyncSend(
|
|
resp,
|
|
)
|
|
|
|
return resp
|
|
})
|
|
|
|
browserClient.Receive("load", func(resp cws.WSPacket) (req cws.WSPacket) {
|
|
log.Println("Coordinator: Received load request from a browser")
|
|
log.Println("Coordinator: Relay load request from a browser to worker")
|
|
// TODO: Async
|
|
resp.SessionID = s.ID
|
|
resp.RoomID = s.RoomID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
resp = wc.SyncSend(
|
|
resp,
|
|
)
|
|
|
|
return resp
|
|
})
|
|
|
|
browserClient.Receive("playerIdx", func(resp cws.WSPacket) (req cws.WSPacket) {
|
|
log.Println("Coordinator: Received update player index request from a browser")
|
|
log.Println("Coordinator: Relay update player index request from a browser to worker")
|
|
// TODO: Async
|
|
resp.SessionID = s.ID
|
|
resp.RoomID = s.RoomID
|
|
wc, ok := s.handler.workerClients[s.ServerID]
|
|
if !ok {
|
|
return cws.EmptyPacket
|
|
}
|
|
resp = wc.SyncSend(
|
|
resp,
|
|
)
|
|
|
|
return resp
|
|
})
|
|
}
|
|
|
|
// NewCoordinatorClient returns a client connecting to browser. This connection exchanges information between clients and server
|
|
func NewBrowserClient(c *websocket.Conn) *BrowserClient {
|
|
return &BrowserClient{
|
|
Client: cws.NewClient(c),
|
|
}
|
|
}
|