platform: modularize api/gui, add docs-tests-web foundation, and refresh root config
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func findSingBoxProfileIndexForClient(st singBoxProfilesState, clientID string) int {
|
||||
cid := sanitizeID(clientID)
|
||||
if cid == "" {
|
||||
return -1
|
||||
}
|
||||
|
||||
best := -1
|
||||
for i := range st.Items {
|
||||
meta := st.Items[i].Meta
|
||||
if meta == nil {
|
||||
continue
|
||||
}
|
||||
if sanitizeID(asString(meta["client_id"])) != cid {
|
||||
continue
|
||||
}
|
||||
if best < 0 || st.Items[i].ProfileRevision > st.Items[best].ProfileRevision {
|
||||
best = i
|
||||
}
|
||||
}
|
||||
if best >= 0 {
|
||||
return best
|
||||
}
|
||||
|
||||
for i := range st.Items {
|
||||
if sanitizeID(st.Items[i].ID) == cid {
|
||||
return i
|
||||
}
|
||||
}
|
||||
|
||||
if len(st.Items) == 1 {
|
||||
return 0
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func resolveSingBoxApplyClient(reqClientID, fallbackClientID string) (*TransportClient, string, string) {
|
||||
target := strings.TrimSpace(reqClientID)
|
||||
if target == "" {
|
||||
target = strings.TrimSpace(fallbackClientID)
|
||||
}
|
||||
|
||||
transportMu.Lock()
|
||||
st := loadTransportClientsState()
|
||||
transportMu.Unlock()
|
||||
|
||||
if len(st.Items) == 0 {
|
||||
return nil, singBoxProfileCodeNoClient, "transport client not found"
|
||||
}
|
||||
if target != "" {
|
||||
idx := findTransportClientIndex(st.Items, target)
|
||||
if idx < 0 {
|
||||
return nil, singBoxProfileCodeNoClient, "transport client not found"
|
||||
}
|
||||
cl := st.Items[idx]
|
||||
if cl.Kind != TransportClientSingBox {
|
||||
return nil, singBoxProfileCodeClientKind, "target client is not singbox"
|
||||
}
|
||||
return &cl, "", ""
|
||||
}
|
||||
|
||||
candidates := make([]TransportClient, 0)
|
||||
for _, it := range st.Items {
|
||||
if it.Kind == TransportClientSingBox {
|
||||
candidates = append(candidates, it)
|
||||
}
|
||||
}
|
||||
if len(candidates) == 0 {
|
||||
return nil, singBoxProfileCodeNoClient, "singbox client not found"
|
||||
}
|
||||
sort.Slice(candidates, func(i, j int) bool {
|
||||
if candidates[i].Enabled != candidates[j].Enabled {
|
||||
return candidates[i].Enabled
|
||||
}
|
||||
return candidates[i].ID < candidates[j].ID
|
||||
})
|
||||
cl := candidates[0]
|
||||
return &cl, "", ""
|
||||
}
|
||||
Reference in New Issue
Block a user