| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package service
- import "time"
- // ResolveProxyFallbackTarget 计算一个过期代理 start 应把账号改投到哪里。
- // 返回 (targetID, change):
- // - change=false:不改动账号(mode=none,或链路成环/无解的兜底)
- // - change=true, targetID=nil:改投为直连
- // - change=true, targetID!=nil:改投到该备用代理 id
- //
- // byID 是「全部代理」的快照(id -> Proxy),now 为判定基准时间。
- func ResolveProxyFallbackTarget(start Proxy, byID map[int64]Proxy, now time.Time) (*int64, bool) {
- switch start.FallbackMode {
- case FallbackModeDirect:
- return nil, true
- case FallbackModeProxy:
- visited := map[int64]struct{}{start.ID: {}}
- curID := start.BackupProxyID
- for {
- if curID == nil {
- return nil, false
- }
- if _, seen := visited[*curID]; seen {
- return nil, false
- }
- p, ok := byID[*curID]
- if !ok {
- return nil, false
- }
- if !(&p).IsExpired(now) && p.Status != StatusExpired {
- id := p.ID
- return &id, true
- }
- visited[*curID] = struct{}{}
- switch p.FallbackMode {
- case FallbackModeDirect:
- return nil, true
- case FallbackModeProxy:
- curID = p.BackupProxyID
- default:
- return nil, false
- }
- }
- default:
- return nil, false
- }
- }
|