100 lines
2.9 KiB
Go
100 lines
2.9 KiB
Go
|
|
package service
|
|||
|
|
|
|||
|
|
import "time"
|
|||
|
|
|
|||
|
|
// ProviderRefreshErrorAction 定义 provider 在刷新失败时的处理动作。
|
|||
|
|
type ProviderRefreshErrorAction int
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// ProviderRefreshErrorReturn 失败即返回错误(不降级旧 token)。
|
|||
|
|
ProviderRefreshErrorReturn ProviderRefreshErrorAction = iota
|
|||
|
|
// ProviderRefreshErrorUseExistingToken 失败后继续使用现有 token。
|
|||
|
|
ProviderRefreshErrorUseExistingToken
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// ProviderLockHeldAction 定义 provider 在刷新锁被占用时的处理动作。
|
|||
|
|
type ProviderLockHeldAction int
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// ProviderLockHeldUseExistingToken 直接使用现有 token。
|
|||
|
|
ProviderLockHeldUseExistingToken ProviderLockHeldAction = iota
|
|||
|
|
// ProviderLockHeldWaitForCache 等待后重试缓存读取。
|
|||
|
|
ProviderLockHeldWaitForCache
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// ProviderRefreshPolicy 描述 provider 的平台差异策略。
|
|||
|
|
type ProviderRefreshPolicy struct {
|
|||
|
|
OnRefreshError ProviderRefreshErrorAction
|
|||
|
|
OnLockHeld ProviderLockHeldAction
|
|||
|
|
FailureTTL time.Duration
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func ClaudeProviderRefreshPolicy() ProviderRefreshPolicy {
|
|||
|
|
return ProviderRefreshPolicy{
|
|||
|
|
OnRefreshError: ProviderRefreshErrorUseExistingToken,
|
|||
|
|
OnLockHeld: ProviderLockHeldWaitForCache,
|
|||
|
|
FailureTTL: time.Minute,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func OpenAIProviderRefreshPolicy() ProviderRefreshPolicy {
|
|||
|
|
return ProviderRefreshPolicy{
|
|||
|
|
OnRefreshError: ProviderRefreshErrorUseExistingToken,
|
|||
|
|
OnLockHeld: ProviderLockHeldWaitForCache,
|
|||
|
|
FailureTTL: time.Minute,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func GeminiProviderRefreshPolicy() ProviderRefreshPolicy {
|
|||
|
|
return ProviderRefreshPolicy{
|
|||
|
|
OnRefreshError: ProviderRefreshErrorReturn,
|
|||
|
|
OnLockHeld: ProviderLockHeldUseExistingToken,
|
|||
|
|
FailureTTL: 0,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func AntigravityProviderRefreshPolicy() ProviderRefreshPolicy {
|
|||
|
|
return ProviderRefreshPolicy{
|
|||
|
|
OnRefreshError: ProviderRefreshErrorReturn,
|
|||
|
|
OnLockHeld: ProviderLockHeldUseExistingToken,
|
|||
|
|
FailureTTL: 0,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// BackgroundSkipAction 定义后台刷新服务在“未实际刷新”场景的计数方式。
|
|||
|
|
type BackgroundSkipAction int
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// BackgroundSkipAsSkipped 计入 skipped(保持当前默认行为)。
|
|||
|
|
BackgroundSkipAsSkipped BackgroundSkipAction = iota
|
|||
|
|
// BackgroundSkipAsSuccess 计入 success(仅用于兼容旧统计口径时可选)。
|
|||
|
|
BackgroundSkipAsSuccess
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// BackgroundRefreshPolicy 描述后台刷新服务的调用侧策略。
|
|||
|
|
type BackgroundRefreshPolicy struct {
|
|||
|
|
OnLockHeld BackgroundSkipAction
|
|||
|
|
OnAlreadyRefresh BackgroundSkipAction
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func DefaultBackgroundRefreshPolicy() BackgroundRefreshPolicy {
|
|||
|
|
return BackgroundRefreshPolicy{
|
|||
|
|
OnLockHeld: BackgroundSkipAsSkipped,
|
|||
|
|
OnAlreadyRefresh: BackgroundSkipAsSkipped,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (p BackgroundRefreshPolicy) handleLockHeld() error {
|
|||
|
|
if p.OnLockHeld == BackgroundSkipAsSuccess {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
return errRefreshSkipped
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (p BackgroundRefreshPolicy) handleAlreadyRefreshed() error {
|
|||
|
|
if p.OnAlreadyRefresh == BackgroundSkipAsSuccess {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
return errRefreshSkipped
|
|||
|
|
}
|