ugs.more blocks until event arrives
parent
0d44fd56ed
commit
39c9eae7ad
|
|
@ -6,12 +6,14 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"time"
|
||||
)
|
||||
|
||||
type UserGameServer struct {
|
||||
ID string
|
||||
Session Session
|
||||
games Games
|
||||
lastPoll time.Time
|
||||
}
|
||||
|
||||
func NewUserGameServer(ctx context.Context, session Session, games Games) (*UserGameServer, error) {
|
||||
|
|
@ -29,6 +31,28 @@ func NewUserGameServer(ctx context.Context, session Session, games Games) (*User
|
|||
}, nil
|
||||
}
|
||||
|
||||
func (ugs *UserGameServer) More(ctx context.Context) error {
|
||||
defer func() {
|
||||
ugs.lastPoll = time.Now()
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
case <-time.After(time.Second * 1):
|
||||
}
|
||||
|
||||
if events, err := ugs.games.GameEvents(ctx, ugs.ID, ugs.lastPoll); err != nil {
|
||||
return err
|
||||
} else if len(events) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (ugs *UserGameServer) Listen(ctx context.Context, can context.CancelFunc, reader func(context.Context) ([]byte, error)) {
|
||||
defer can()
|
||||
if err := ugs.listen(ctx, reader); err != nil && ctx.Err() == nil {
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import (
|
|||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/coder/websocket"
|
||||
)
|
||||
|
|
@ -25,35 +24,21 @@ func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error {
|
|||
}
|
||||
defer c.CloseNow()
|
||||
|
||||
gameServer, err := NewUserGameServer(r.Context(), s.Session(r.Context()), s.games)
|
||||
ugs, err := NewUserGameServer(r.Context(), s.Session(r.Context()), s.games)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
game := gameServer.ID
|
||||
game := ugs.ID
|
||||
|
||||
ctx, can := context.WithCancel(r.Context())
|
||||
defer can()
|
||||
|
||||
go gameServer.Listen(ctx, can, func(ctx context.Context) ([]byte, error) {
|
||||
go ugs.Listen(ctx, can, func(ctx context.Context) ([]byte, error) {
|
||||
_, b, err := c.Read(ctx)
|
||||
return b, err
|
||||
})
|
||||
|
||||
var last time.Time
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
case <-time.After(time.Second * 1):
|
||||
}
|
||||
|
||||
if events, err := s.games.GameEvents(ctx, game, last); err != nil {
|
||||
return err
|
||||
} else if len(events) == 0 {
|
||||
continue
|
||||
}
|
||||
last = time.Now()
|
||||
|
||||
for ugs.More(ctx) == nil {
|
||||
gameState, err := s.games.GameState(ctx, game)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
@ -162,4 +147,6 @@ func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error {
|
|||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return ctx.Err()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue