aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/game
diff options
context:
space:
mode:
Diffstat (limited to 'backend/game')
-rw-r--r--backend/game/client.go64
-rw-r--r--backend/game/http.go12
-rw-r--r--backend/game/hub.go24
-rw-r--r--backend/game/message.go4
-rw-r--r--backend/game/ws.go22
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
}