mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-13 16:52:04 +00:00
feat: wire persistent queue backend into API
This commit is contained in:
+37
-5
@@ -4,6 +4,7 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
@@ -22,11 +23,19 @@ type CandidateProvider func(playerID, ticketID string) (domain.Candidate, error)
|
||||
type CandidateProviderV2 func(playerID, ticketID string, spec domain.QueueSpec) (domain.Candidate, error)
|
||||
type ProbeProvider func(playerID, region string, opaqueLocation, nonce []byte, receivedAt time.Time) (domain.ProbeEvidence, []byte, error)
|
||||
|
||||
type QueueBackend interface {
|
||||
Create(context.Context, string, string, string, domain.QueueSpec, time.Time) (domain.QueueTicket, error)
|
||||
Heartbeat(context.Context, string, string, string, uint64, time.Time) (domain.QueueTicket, error)
|
||||
Cancel(context.Context, string, string, string, uint64, time.Time) (domain.QueueTicket, error)
|
||||
Get(context.Context, string, string, time.Time) (domain.QueueTicket, error)
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
Sessions *domain.SessionStore
|
||||
Queue *domain.Queue
|
||||
Candidate CandidateProvider
|
||||
CandidateV2 CandidateProviderV2
|
||||
QueueBackend QueueBackend
|
||||
Probe ProbeProvider
|
||||
Now func() time.Time
|
||||
Proposals map[string]*domain.Proposal
|
||||
@@ -75,7 +84,7 @@ func (s *Service) queueCreate(w http.ResponseWriter, r *http.Request) {
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if s.Queue == nil || (s.Candidate == nil && s.CandidateV2 == nil) {
|
||||
if (s.Queue == nil && s.QueueBackend == nil) || (s.QueueBackend == nil && s.Candidate == nil && s.CandidateV2 == nil) {
|
||||
writeError(w, http.StatusServiceUnavailable, "queue_unavailable")
|
||||
return
|
||||
}
|
||||
@@ -94,6 +103,15 @@ func (s *Service) queueCreate(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
now := s.now()
|
||||
spec := domain.QueueSpec{Playlist: domain.Playlist(input.Playlist), ClientBuild: input.ClientBuild, ProtocolVersion: input.ProtocolVersion}
|
||||
if s.QueueBackend != nil {
|
||||
ticket, err := s.QueueBackend.Create(r.Context(), playerID, input.TicketID, key, spec, now)
|
||||
if err != nil {
|
||||
writeDomainError(w, err)
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusCreated, toQueueResponse(ticket))
|
||||
return
|
||||
}
|
||||
var candidate domain.Candidate
|
||||
var err error
|
||||
if s.CandidateV2 != nil {
|
||||
@@ -131,7 +149,7 @@ func (s *Service) queueMutation(w http.ResponseWriter, r *http.Request) {
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if s.Queue == nil {
|
||||
if s.Queue == nil && s.QueueBackend == nil {
|
||||
writeError(w, http.StatusServiceUnavailable, "queue_unavailable")
|
||||
return
|
||||
}
|
||||
@@ -141,7 +159,13 @@ func (s *Service) queueMutation(w http.ResponseWriter, r *http.Request) {
|
||||
writeError(w, http.StatusNotFound, "not_found")
|
||||
return
|
||||
}
|
||||
ticket, err := s.Queue.Get(playerID, parts[0], s.now())
|
||||
var ticket domain.QueueTicket
|
||||
var err error
|
||||
if s.QueueBackend != nil {
|
||||
ticket, err = s.QueueBackend.Get(r.Context(), playerID, parts[0], s.now())
|
||||
} else {
|
||||
ticket, err = s.Queue.Get(playerID, parts[0], s.now())
|
||||
}
|
||||
if err != nil {
|
||||
writeDomainError(w, err)
|
||||
return
|
||||
@@ -166,9 +190,17 @@ func (s *Service) queueMutation(w http.ResponseWriter, r *http.Request) {
|
||||
now := s.now()
|
||||
var ticket domain.QueueTicket
|
||||
if parts[1] == "heartbeat" {
|
||||
ticket, err = s.Queue.Heartbeat(playerID, ticketID, key, revision, now)
|
||||
if s.QueueBackend != nil {
|
||||
ticket, err = s.QueueBackend.Heartbeat(r.Context(), playerID, ticketID, key, revision, now)
|
||||
} else {
|
||||
ticket, err = s.Queue.Heartbeat(playerID, ticketID, key, revision, now)
|
||||
}
|
||||
} else {
|
||||
ticket, err = s.Queue.Cancel(playerID, ticketID, key, revision, now)
|
||||
if s.QueueBackend != nil {
|
||||
ticket, err = s.QueueBackend.Cancel(r.Context(), playerID, ticketID, key, revision, now)
|
||||
} else {
|
||||
ticket, err = s.Queue.Cancel(playerID, ticketID, key, revision, now)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
writeDomainError(w, err)
|
||||
|
||||
Reference in New Issue
Block a user