(ctx context.Context, store *sdkauth.FileTokenStore, auth *coreauth.Auth)
| 179 | } |
| 180 | |
| 181 | func ensureAccessToken(ctx context.Context, store *sdkauth.FileTokenStore, auth *coreauth.Auth) (string, bool, error) { |
| 182 | accessToken := metaStringValue(auth.Metadata, "access_token") |
| 183 | if accessToken != "" { |
| 184 | if expiresAt, ok := auth.ExpirationTime(); !ok || time.Now().Add(accessTokenRefreshLeeway).Before(expiresAt) { |
| 185 | return accessToken, false, nil |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | refreshToken := metaStringValue(auth.Metadata, "refresh_token") |
| 190 | if refreshToken == "" { |
| 191 | if accessToken != "" { |
| 192 | return accessToken, false, nil |
| 193 | } |
| 194 | return "", false, fmt.Errorf("missing access_token and refresh_token") |
| 195 | } |
| 196 | |
| 197 | svc := codexauth.NewCodexAuthWithProxyURL(nil, auth.ProxyURL) |
| 198 | tokenData, errRefresh := svc.RefreshTokensWithRetry(ctx, refreshToken, 3) |
| 199 | if errRefresh != nil { |
| 200 | return "", false, errRefresh |
| 201 | } |
| 202 | if strings.TrimSpace(tokenData.AccessToken) == "" { |
| 203 | return "", false, fmt.Errorf("refresh response did not include access_token") |
| 204 | } |
| 205 | |
| 206 | if auth.Metadata == nil { |
| 207 | auth.Metadata = make(map[string]any) |
| 208 | } |
| 209 | auth.Metadata["id_token"] = tokenData.IDToken |
| 210 | auth.Metadata["access_token"] = tokenData.AccessToken |
| 211 | if tokenData.RefreshToken != "" { |
| 212 | auth.Metadata["refresh_token"] = tokenData.RefreshToken |
| 213 | } |
| 214 | if tokenData.AccountID != "" { |
| 215 | auth.Metadata["account_id"] = tokenData.AccountID |
| 216 | } |
| 217 | if tokenData.Email != "" { |
| 218 | auth.Metadata["email"] = tokenData.Email |
| 219 | } |
| 220 | auth.Metadata["expired"] = tokenData.Expire |
| 221 | auth.Metadata["type"] = "codex" |
| 222 | auth.Metadata["last_refresh"] = time.Now().Format(time.RFC3339) |
| 223 | |
| 224 | if _, errSave := store.Save(ctx, auth); errSave != nil { |
| 225 | return "", false, fmt.Errorf("failed to save refreshed auth: %w", errSave) |
| 226 | } |
| 227 | |
| 228 | return tokenData.AccessToken, true, nil |
| 229 | } |
| 230 | |
| 231 | func fetchModels(ctx context.Context, auth *coreauth.Auth, accessToken, clientVersion string) ([]byte, int, error) { |
| 232 | modelsURL, errURL := codexModelsURL(clientVersion) |
no test coverage detected