fix: Endpoins missing in clashapi

This commit is contained in:
Zephyruso 2024-12-06 12:26:11 +08:00
parent bfe7c6bdda
commit 4fcee9d137
2 changed files with 39 additions and 1 deletions

View File

@ -83,14 +83,35 @@ func proxyInfo(server *Server, detour adapter.Outbound) *badjson.JSONObject {
return &info return &info
} }
func endpointInfo(server *Server, endpoint adapter.Endpoint) *badjson.JSONObject {
var info badjson.JSONObject
info.Put("type", C.ProxyDisplayName(endpoint.Type()))
info.Put("name", endpoint.Tag())
info.Put("udp", common.Contains(endpoint.Network(), N.NetworkUDP))
delayHistory := server.urlTestHistory.LoadURLTestHistory(adapter.OutboundTag(endpoint))
if delayHistory != nil {
info.Put("history", []*urltest.History{delayHistory})
} else {
info.Put("history", []*urltest.History{})
}
return &info
}
func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) { func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
var proxyMap badjson.JSONObject var proxyMap badjson.JSONObject
outbounds := common.Filter(server.outboundManager.Outbounds(), func(detour adapter.Outbound) bool { outbounds := common.Filter(server.outboundManager.Outbounds(), func(detour adapter.Outbound) bool {
return detour.Tag() != "" return detour.Tag() != ""
}) })
endpoints := common.Filter(server.endpointManager.Endpoints(), func(detour adapter.Endpoint) bool {
return detour.Tag() != ""
})
allProxies := make([]string, 0, len(outbounds)) allProxies := make([]string, 0, len(outbounds) + len(endpoints))
for _, detour := range outbounds { for _, detour := range outbounds {
switch detour.Type() { switch detour.Type() {
@ -100,6 +121,10 @@ func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) {
allProxies = append(allProxies, detour.Tag()) allProxies = append(allProxies, detour.Tag())
} }
for _, endpoint := range endpoints {
allProxies = append(allProxies, endpoint.Tag())
}
defaultTag := server.outboundManager.Default().Tag() defaultTag := server.outboundManager.Default().Tag()
sort.SliceStable(allProxies, func(i, j int) bool { sort.SliceStable(allProxies, func(i, j int) bool {
@ -125,6 +150,17 @@ func getProxies(server *Server) func(w http.ResponseWriter, r *http.Request) {
} }
proxyMap.Put(tag, proxyInfo(server, detour)) proxyMap.Put(tag, proxyInfo(server, detour))
} }
for i, endpoint := range endpoints {
var tag string
if endpoint.Tag() == "" {
tag = F.ToString(i)
} else {
tag = endpoint.Tag()
}
proxyMap.Put(tag, endpointInfo(server, endpoint))
}
var responseMap badjson.JSONObject var responseMap badjson.JSONObject
responseMap.Put("proxies", &proxyMap) responseMap.Put("proxies", &proxyMap)
response, err := responseMap.MarshalJSON() response, err := responseMap.MarshalJSON()

View File

@ -43,6 +43,7 @@ type Server struct {
ctx context.Context ctx context.Context
router adapter.Router router adapter.Router
outboundManager adapter.OutboundManager outboundManager adapter.OutboundManager
endpointManager adapter.EndpointManager
logger log.Logger logger log.Logger
httpServer *http.Server httpServer *http.Server
trafficManager *trafficontrol.Manager trafficManager *trafficontrol.Manager
@ -64,6 +65,7 @@ func NewServer(ctx context.Context, logFactory log.ObservableFactory, options op
ctx: ctx, ctx: ctx,
router: service.FromContext[adapter.Router](ctx), router: service.FromContext[adapter.Router](ctx),
outboundManager: service.FromContext[adapter.OutboundManager](ctx), outboundManager: service.FromContext[adapter.OutboundManager](ctx),
endpointManager: service.FromContext[adapter.EndpointManager](ctx),
logger: logFactory.NewLogger("clash-api"), logger: logFactory.NewLogger("clash-api"),
httpServer: &http.Server{ httpServer: &http.Server{
Addr: options.ExternalController, Addr: options.ExternalController,