| 335 | } |
| 336 | |
| 337 | func (p *oauthTokenProvider) backgroundLoop() { |
| 338 | defer close(p.bgDone) |
| 339 | for { |
| 340 | p.mu.Lock() |
| 341 | expires := p.cred.Expires |
| 342 | refresh := p.cred.Refresh |
| 343 | p.mu.Unlock() |
| 344 | |
| 345 | if refresh == "" || expires <= 0 { |
| 346 | return |
| 347 | } |
| 348 | |
| 349 | wait := time.Until(time.UnixMilli(expires)) - p.refreshLead |
| 350 | if wait < p.refreshMinWait { |
| 351 | wait = p.refreshMinWait |
| 352 | } |
| 353 | |
| 354 | timer := time.NewTimer(wait) |
| 355 | select { |
| 356 | case <-p.bgCtx.Done(): |
| 357 | timer.Stop() |
| 358 | return |
| 359 | case <-timer.C: |
| 360 | } |
| 361 | |
| 362 | if _, err := p.Token(p.bgCtx); err != nil { |
| 363 | if p.logger != nil { |
| 364 | p.logger.Warn(i18n.T("auth.token_provider.background_refresh_failed"), |
| 365 | zap.String("provider", string(p.cred.Provider)), |
| 366 | zap.Error(err)) |
| 367 | } |
| 368 | select { |
| 369 | case <-p.bgCtx.Done(): |
| 370 | return |
| 371 | case <-time.After(p.refreshErrorBackoff): |
| 372 | } |
| 373 | } |
| 374 | } |
| 375 | } |
| 376 | |
| 377 | func (p *oauthTokenProvider) Mode() AuthMode { return AuthModeOAuth } |
| 378 | func (p *oauthTokenProvider) Provider() ProviderID { return p.cred.Provider } |