95 lines
3.1 KiB
Go
95 lines
3.1 KiB
Go
package main
|
|
|
|
import "C"
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/Dreamacro/clash/adapter"
|
|
"github.com/Dreamacro/clash/adapter/outboundgroup"
|
|
"github.com/Dreamacro/clash/common/utils"
|
|
"github.com/Dreamacro/clash/component/profile/cachefile"
|
|
"github.com/Dreamacro/clash/constant"
|
|
"github.com/Dreamacro/clash/tunnel"
|
|
bridge "hiddify.com/hiddify/bridge"
|
|
)
|
|
|
|
//export getProxies
|
|
func getProxies(port C.longlong) {
|
|
proxies := tunnel.Proxies()
|
|
data, err := json.Marshal(map[string]map[string]constant.Proxy{"proxies": proxies})
|
|
if err != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: true, Data: string(data)})
|
|
}
|
|
|
|
//export updateProxy
|
|
func updateProxy(port C.longlong, selectorName *C.char, proxyName *C.char) {
|
|
go func() {
|
|
proxies := tunnel.Proxies()
|
|
proxy := proxies[C.GoString(selectorName)]
|
|
if proxy == nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: "proxy doesn't exist"})
|
|
return
|
|
}
|
|
adapter_proxy := proxy.(*adapter.Proxy)
|
|
selector, ok := adapter_proxy.ProxyAdapter.(*outboundgroup.Selector)
|
|
if !ok {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: "not a selector"})
|
|
return
|
|
}
|
|
if err := selector.Set(C.GoString(proxyName)); err != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
cachefile.Cache().SetSelected(string(C.GoString(selectorName)), string(C.GoString(proxyName)))
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: true})
|
|
}()
|
|
}
|
|
|
|
//export getProxyDelay
|
|
func getProxyDelay(port C.longlong, name *C.char, url *C.char, timeout C.long) {
|
|
go func() {
|
|
proxy := tunnel.Proxies()[C.GoString(name)]
|
|
if proxy == nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: "proxy doesn't exist"})
|
|
return
|
|
}
|
|
|
|
log.Printf("%s before ctx", proxy.Name())
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(int64(timeout)))
|
|
defer cancel()
|
|
|
|
log.Printf("%s before expected status", proxy.Name())
|
|
expectedStatus, err := utils.NewIntRanges[uint16]("200")
|
|
if err != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
delay, err := proxy.URLTest(ctx, C.GoString(url), expectedStatus, constant.ExtraHistory)
|
|
if ctx.Err() != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: ctx.Err().Error()})
|
|
return
|
|
}
|
|
log.Printf("%s after ctx check", proxy.Name())
|
|
if err != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
|
|
log.Printf("%s before marshal", proxy.Name())
|
|
data, err := json.Marshal(map[string]uint16{"delay": delay})
|
|
if err != nil {
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
|
|
bridge.SendResponseToPort(int64(port), &bridge.DartResponse{Success: true, Data: string(data)})
|
|
}()
|
|
}
|