diff options
Diffstat (limited to 'backend/game')
| -rw-r--r-- | backend/game/client.go | 64 | ||||
| -rw-r--r-- | backend/game/http.go | 12 | ||||
| -rw-r--r-- | backend/game/hub.go | 24 | ||||
| -rw-r--r-- | backend/game/message.go | 4 | ||||
| -rw-r--r-- | backend/game/ws.go | 22 |
5 files changed, 76 insertions, 50 deletions
diff --git a/backend/game/client.go b/backend/game/client.go index fa699ce..5bcb98f 100644 --- a/backend/game/client.go +++ b/backend/game/client.go @@ -2,6 +2,7 @@ package game import ( "encoding/json" + "fmt" "log" "time" @@ -16,32 +17,32 @@ type playerClient struct { } // Receives messages from the client and sends them to the hub. -func (c *playerClient) readPump() { +func (c *playerClient) readPump() error { defer func() { log.Printf("closing player client") c.hub.unregisterPlayer <- c c.conn.Close() }() c.conn.SetReadLimit(maxMessageSize) - c.conn.SetReadDeadline(time.Now().Add(pongWait)) - c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) + if err := c.conn.SetReadDeadline(time.Now().Add(pongWait)); err != nil { + return err + } + c.conn.SetPongHandler(func(string) error { return c.conn.SetReadDeadline(time.Now().Add(pongWait)) }) for { var rawMessage map[string]json.RawMessage if err := c.conn.ReadJSON(&rawMessage); err != nil { - log.Printf("error: %v", err) - return + return err } message, err := asPlayerMessageC2S(rawMessage) if err != nil { - log.Printf("error: %v", err) - return + return err } c.hub.playerC2SMessages <- &playerMessageC2SWithClient{c, message} } } // Receives messages from the hub and sends them to the client. -func (c *playerClient) writePump() { +func (c *playerClient) writePump() error { ticker := time.NewTicker(pingPeriod) defer func() { ticker.Stop() @@ -50,20 +51,26 @@ func (c *playerClient) writePump() { for { select { case message, ok := <-c.s2cMessages: - c.conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := c.conn.SetWriteDeadline(time.Now().Add(writeWait)); err != nil { + return err + } if !ok { - c.conn.WriteMessage(websocket.CloseMessage, []byte{}) - return + if err := c.conn.WriteMessage(websocket.CloseMessage, []byte{}); err != nil { + return err + } + return fmt.Errorf("closing player client") } err := c.conn.WriteJSON(message) if err != nil { - return + return err } case <-ticker.C: - c.conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := c.conn.SetWriteDeadline(time.Now().Add(writeWait)); err != nil { + return err + } if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { - return + return err } } } @@ -76,14 +83,17 @@ type watcherClient struct { } // Receives messages from the client and sends them to the hub. -func (c *watcherClient) readPump() { +func (c *watcherClient) readPump() error { c.conn.SetReadLimit(maxMessageSize) - c.conn.SetReadDeadline(time.Now().Add(pongWait)) - c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) + if err := c.conn.SetReadDeadline(time.Now().Add(pongWait)); err != nil { + return err + } + c.conn.SetPongHandler(func(string) error { return c.conn.SetReadDeadline(time.Now().Add(pongWait)) }) + return nil } // Receives messages from the hub and sends them to the client. -func (c *watcherClient) writePump() { +func (c *watcherClient) writePump() error { ticker := time.NewTicker(pingPeriod) defer func() { ticker.Stop() @@ -94,20 +104,26 @@ func (c *watcherClient) writePump() { for { select { case message, ok := <-c.s2cMessages: - c.conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := c.conn.SetWriteDeadline(time.Now().Add(writeWait)); err != nil { + return err + } if !ok { - c.conn.WriteMessage(websocket.CloseMessage, []byte{}) - return + if err := c.conn.WriteMessage(websocket.CloseMessage, []byte{}); err != nil { + return err + } + return fmt.Errorf("closing watcher client") } err := c.conn.WriteJSON(message) if err != nil { - return + return err } case <-ticker.C: - c.conn.SetWriteDeadline(time.Now().Add(writeWait)) + if err := c.conn.SetWriteDeadline(time.Now().Add(writeWait)); err != nil { + return err + } if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { - return + return err } } } diff --git a/backend/game/http.go b/backend/game/http.go index 865c724..d513593 100644 --- a/backend/game/http.go +++ b/backend/game/http.go @@ -9,17 +9,17 @@ import ( "github.com/nsfisis/iosdc-japan-2024-albatross/backend/auth" ) -type sockHandler struct { - hubs *GameHubs +type SockHandler struct { + hubs *Hubs } -func newSockHandler(hubs *GameHubs) *sockHandler { - return &sockHandler{ +func newSockHandler(hubs *Hubs) *SockHandler { + return &SockHandler{ hubs: hubs, } } -func (h *sockHandler) HandleSockGolfPlay(c echo.Context) error { +func (h *SockHandler) HandleSockGolfPlay(c echo.Context) error { jwt := c.QueryParam("token") claims, err := auth.ParseJWT(jwt) if err != nil { @@ -38,7 +38,7 @@ func (h *sockHandler) HandleSockGolfPlay(c echo.Context) error { return servePlayerWs(hub, c.Response(), c.Request(), claims.UserID) } -func (h *sockHandler) HandleSockGolfWatch(c echo.Context) error { +func (h *SockHandler) HandleSockGolfWatch(c echo.Context) error { jwt := c.QueryParam("token") claims, err := auth.ParseJWT(jwt) if err != nil { diff --git a/backend/game/hub.go b/backend/game/hub.go index 11a466b..dc56f03 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -544,15 +544,15 @@ func (hub *gameHub) closeWatcherClient(watcher *watcherClient) { close(watcher.s2cMessages) } -type GameHubs struct { +type Hubs struct { hubs map[int]*gameHub q *db.Queries taskQueue *taskqueue.Queue taskResults chan taskqueue.TaskResult } -func NewGameHubs(q *db.Queries, taskQueue *taskqueue.Queue, taskResults chan taskqueue.TaskResult) *GameHubs { - return &GameHubs{ +func NewGameHubs(q *db.Queries, taskQueue *taskqueue.Queue, taskResults chan taskqueue.TaskResult) *Hubs { + return &Hubs{ hubs: make(map[int]*gameHub), q: q, taskQueue: taskQueue, @@ -560,18 +560,18 @@ func NewGameHubs(q *db.Queries, taskQueue *taskqueue.Queue, taskResults chan tas } } -func (hubs *GameHubs) Close() { +func (hubs *Hubs) Close() { log.Println("closing all game hubs") for _, hub := range hubs.hubs { hub.close() } } -func (hubs *GameHubs) getHub(gameID int) *gameHub { +func (hubs *Hubs) getHub(gameID int) *gameHub { return hubs.hubs[gameID] } -func (hubs *GameHubs) RestoreFromDB(ctx context.Context) error { +func (hubs *Hubs) RestoreFromDB(ctx context.Context) error { games, err := hubs.q.ListGames(ctx) if err != nil { return err @@ -581,12 +581,12 @@ func (hubs *GameHubs) RestoreFromDB(ctx context.Context) error { if row.StartedAt.Valid { startedAt = &row.StartedAt.Time } - var problem_ *problem + var pr *problem if row.ProblemID != nil { if row.Title == nil || row.Description == nil { panic("inconsistent data") } - problem_ = &problem{ + pr = &problem{ problemID: int(*row.ProblemID), title: *row.Title, description: *row.Description, @@ -603,14 +603,14 @@ func (hubs *GameHubs) RestoreFromDB(ctx context.Context) error { state: gameState(row.State), displayName: row.DisplayName, startedAt: startedAt, - problem: problem_, + problem: pr, playerCount: len(playerRows), }, hubs.q, hubs.taskQueue) } return nil } -func (hubs *GameHubs) Run() { +func (hubs *Hubs) Run() { for _, hub := range hubs.hubs { go hub.run() go hub.processTaskResults() @@ -626,11 +626,11 @@ func (hubs *GameHubs) Run() { } } -func (hubs *GameHubs) SockHandler() *sockHandler { +func (hubs *Hubs) SockHandler() *SockHandler { return newSockHandler(hubs) } -func (hubs *GameHubs) StartGame(gameID int) error { +func (hubs *Hubs) StartGame(gameID int) error { hub := hubs.getHub(gameID) if hub == nil { return errors.New("no such game") diff --git a/backend/game/message.go b/backend/game/message.go index 1eedabd..031222d 100644 --- a/backend/game/message.go +++ b/backend/game/message.go @@ -22,8 +22,6 @@ type playerMessageC2SWithClient struct { message playerMessageC2S } -type playerMessage = api.GamePlayerMessage - type playerMessageS2C = interface{} type playerMessageS2CPrepare = api.GamePlayerMessageS2CPrepare type playerMessageS2CPreparePayload = api.GamePlayerMessageS2CPreparePayload @@ -89,5 +87,3 @@ type watcherMessageS2CStart = api.GameWatcherMessageS2CStart type watcherMessageS2CStartPayload = api.GameWatcherMessageS2CStartPayload type watcherMessageS2CCode = api.GameWatcherMessageS2CCode type watcherMessageS2CCodePayload = api.GameWatcherMessageS2CCodePayload -type watcherMessageS2CExecResult = api.GameWatcherMessageS2CExecResult -type watcherMessageS2CExecResultPayload = api.GameWatcherMessageS2CExecResultPayload diff --git a/backend/game/ws.go b/backend/game/ws.go index 9a3956b..0dbd0ab 100644 --- a/backend/game/ws.go +++ b/backend/game/ws.go @@ -1,6 +1,7 @@ package game import ( + "log" "net/http" "time" @@ -19,6 +20,7 @@ var upgrader = websocket.Upgrader{ WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { // TODO: insecure! + _ = r return true }, } @@ -36,8 +38,14 @@ func servePlayerWs(hub *gameHub, w http.ResponseWriter, r *http.Request, playerI } hub.registerPlayer <- player - go player.writePump() - go player.readPump() + go func() { + err := player.writePump() + log.Printf("%v", err) + }() + go func() { + err := player.readPump() + log.Printf("%v", err) + }() return nil } @@ -53,7 +61,13 @@ func serveWatcherWs(hub *gameHub, w http.ResponseWriter, r *http.Request) error } hub.registerWatcher <- watcher - go watcher.writePump() - go watcher.readPump() + go func() { + err := watcher.writePump() + log.Printf("%v", err) + }() + go func() { + err := watcher.readPump() + log.Printf("%v", err) + }() return nil } |
