Files
sub2api/backend/internal/service/kiro_token_refresher.go
T
2026-04-30 14:02:05 +08:00

48 lines
1.2 KiB
Go

package service
import (
"context"
"time"
)
const kiroRefreshWindow = 15 * time.Minute
type KiroTokenRefresher struct {
kiroOAuthService *KiroOAuthService
}
func NewKiroTokenRefresher(kiroOAuthService *KiroOAuthService) *KiroTokenRefresher {
return &KiroTokenRefresher{
kiroOAuthService: kiroOAuthService,
}
}
func (r *KiroTokenRefresher) CacheKey(account *Account) string {
return KiroTokenCacheKey(account)
}
func (r *KiroTokenRefresher) CanRefresh(account *Account) bool {
return account != nil && account.Platform == PlatformKiro && account.Type == AccountTypeOAuth
}
func (r *KiroTokenRefresher) NeedsRefresh(account *Account, _ time.Duration) bool {
if !r.CanRefresh(account) {
return false
}
expiresAt := account.GetCredentialAsTime("expires_at")
if expiresAt == nil {
return false
}
return time.Until(*expiresAt) <= kiroRefreshWindow
}
func (r *KiroTokenRefresher) Refresh(ctx context.Context, account *Account) (map[string]any, error) {
tokenInfo, err := r.kiroOAuthService.RefreshAccountToken(ctx, account)
if err != nil {
return nil, err
}
newCredentials := r.kiroOAuthService.BuildAccountCredentials(tokenInfo)
return MergeCredentials(account.Credentials, newCredentials), nil
}