From a584bc9c55675d27abd2caa379998f29dca53ee5 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sat, 9 Aug 2025 20:11:34 +0200 Subject: [PATCH] refactor(esi_sso.go): parallelize esi token processing and deduplicate tokens to improve performance --- esi_sso.go | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/esi_sso.go b/esi_sso.go index 073661b..9095a62 100644 --- a/esi_sso.go +++ b/esi_sso.go @@ -618,22 +618,40 @@ func (s *ESISSO) PostRouteForAll(destID int64, viaIDs []int64) error { if s.db == nil { return errors.New("db not initialised") } var tokens []ESIToken if err := s.db.Find(&tokens).Error; err != nil { return err } - var firstErr error - for i := range tokens { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - tok, err := s.ensureAccessTokenFor(ctx, &tokens[i]) - cancel() - if err != nil { if firstErr == nil { firstErr = err }; continue } - // Determine sequence: clear with first element (via if any, else dest) - if len(viaIDs) > 0 { - if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil && firstErr == nil { firstErr = err } - for _, id := range viaIDs[1:] { - if err := s.postWaypointWithToken(tok, id, false, false); err != nil && firstErr == nil { firstErr = err } - } - if err := s.postWaypointWithToken(tok, destID, false, false); err != nil && firstErr == nil { firstErr = err } - } else { - if err := s.postWaypointWithToken(tok, destID, true, false); err != nil && firstErr == nil { firstErr = err } - } + // Deduplicate by CharacterID + uniq := make(map[int64]ESIToken, len(tokens)) + for _, t := range tokens { + uniq[t.CharacterID] = t } + uniqueTokens := make([]ESIToken, 0, len(uniq)) + for _, t := range uniq { uniqueTokens = append(uniqueTokens, t) } + + var mu sync.Mutex + var firstErr error + var wg sync.WaitGroup + // Run per-character in parallel + for i := range uniqueTokens { + wg.Add(1) + go func(t ESIToken) { + defer wg.Done() + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + tok, err := s.ensureAccessTokenFor(ctx, &t) + cancel() + if err != nil { + mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return + } + // Post sequence for this character + if len(viaIDs) > 0 { + if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return } + for _, id := range viaIDs[1:] { + if err := s.postWaypointWithToken(tok, id, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return } + } + if err := s.postWaypointWithToken(tok, destID, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return } + } else { + if err := s.postWaypointWithToken(tok, destID, true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return } + } + }(uniqueTokens[i]) + } + wg.Wait() return firstErr } \ No newline at end of file