feat: persist authenticated queue probe RTT

This commit is contained in:
Josh Creek
2026-09-01 09:40:25 +01:00
parent 25cc182793
commit def60169a8
7 changed files with 131 additions and 2 deletions
+28
View File
@@ -163,6 +163,34 @@ func (q *Queue) Expire(now time.Time) []QueueTicket {
return q.expireLocked(now)
}
// RecordProbe stores server-computed RTT metadata on the player's active
// ticket. It never accepts client-provided latency and refuses expired or
// non-queueable tickets.
func (q *Queue) RecordProbe(playerID, region string, rtt time.Duration, now time.Time) error {
if playerID == "" || (region != "EU" && region != "NA") || rtt < 0 || now.IsZero() {
return fmt.Errorf("invalid probe recording")
}
q.mu.Lock()
defer q.mu.Unlock()
ticketID, ok := q.byPlayer[playerID]
if !ok {
return ErrTicketNotFound
}
ticket, ok := q.tickets[ticketID]
if !ok || (ticket.State != Queued && ticket.State != Proposed) {
return ErrTicketNotFound
}
if !now.Before(ticket.ExpiresAt) {
return ErrTicketExpired
}
if ticket.Candidate.PredictedRTT == nil {
ticket.Candidate.PredictedRTT = make(map[string]float64)
}
ticket.Candidate.PredictedRTT[region] = float64(rtt) / float64(time.Millisecond)
q.tickets[ticketID] = ticket
return nil
}
func (q *Queue) expireLocked(now time.Time) []QueueTicket {
var expired []QueueTicket
for id, ticket := range q.tickets {