Separate android ui and vpn

This commit is contained in:
chen08209
2024-07-13 16:36:08 +08:00
parent 53af86238e
commit c6407984ac
33 changed files with 864 additions and 525 deletions

View File

@@ -84,26 +84,11 @@ type TestDelayParams struct {
Timeout int64 `json:"timeout"`
}
type Delay struct {
Name string `json:"name"`
Value int32 `json:"value"`
}
type Process struct {
Id int64 `json:"id"`
Metadata *constant.Metadata `json:"metadata"`
}
type ProcessMapItem struct {
Id int64 `json:"id"`
Value string `json:"value"`
}
type Now struct {
Name string `json:"name"`
Value string `json:"value"`
}
type ExternalProvider struct {
Name string `json:"name"`
Type string `json:"type"`

View File

@@ -25,7 +25,7 @@ func InitDartApi(api unsafe.Pointer) {
}
}
func SendToPort(port int64, msg string) {
func SendToPort(port int64, msg string) bool {
var obj C.Dart_CObject
obj._type = C.Dart_CObject_kString
msgString := C.CString(msg)
@@ -34,6 +34,7 @@ func SendToPort(port int64, msg string) {
*(**C.char)(ptr) = msgString
isSuccess := C.GoDart_PostCObject(C.Dart_Port_DL(port), &obj)
if !isSuccess {
fmt.Println("ERROR: post to port ", port, " failed", msg)
return false
}
return true
}

View File

@@ -1,39 +0,0 @@
package dart_bridge
import "encoding/json"
var Port *int64
type MessageType string
const (
Log MessageType = "log"
Tun MessageType = "tun"
Delay MessageType = "delay"
Now MessageType = "now"
Process MessageType = "process"
Request MessageType = "request"
Run MessageType = "run"
Loaded MessageType = "loaded"
)
type Message struct {
Type MessageType `json:"type"`
Data interface{} `json:"data"`
}
func (message *Message) Json() (string, error) {
data, err := json.Marshal(message)
return string(data), err
}
func SendMessage(message Message) {
if Port == nil {
return
}
s, err := message.Json()
if err != nil {
return
}
SendToPort(*Port, s)
}

View File

@@ -36,6 +36,8 @@ var configParams = ConfigExtendedParams{}
var isInit = false
var currentProfileName = ""
//export initClash
func initClash(homeDirStr *C.char) bool {
if !isInit {
@@ -74,6 +76,16 @@ func forceGc() {
}()
}
//export setCurrentProfileName
func setCurrentProfileName(s *C.char) {
currentProfileName = C.GoString(s)
}
//export getCurrentProfileName
func getCurrentProfileName() *C.char {
return C.CString(currentProfileName)
}
//export validateConfig
func validateConfig(s *C.char, port C.longlong) {
i := int64(port)
@@ -415,10 +427,14 @@ func updateExternalProvider(providerName *C.char, providerType *C.char, port C.l
}
//export initNativeApiBridge
func initNativeApiBridge(api unsafe.Pointer, port C.longlong) {
func initNativeApiBridge(api unsafe.Pointer) {
bridge.InitDartApi(api)
}
//export initMessage
func initMessage(port C.longlong) {
i := int64(port)
bridge.Port = &i
Port = i
}
//export freeCString
@@ -436,20 +452,20 @@ func init() {
} else {
delayData.Value = int32(delay)
}
bridge.SendMessage(bridge.Message{
Type: bridge.Delay,
SendMessage(Message{
Type: DelayMessage,
Data: delayData,
})
}
statistic.DefaultRequestNotify = func(c statistic.Tracker) {
bridge.SendMessage(bridge.Message{
Type: bridge.Request,
SendMessage(Message{
Type: RequestMessage,
Data: c,
})
}
executor.DefaultProxyProviderLoadedHook = func(providerName string) {
bridge.SendMessage(bridge.Message{
Type: bridge.Loaded,
SendMessage(Message{
Type: LoadedMessage,
Data: providerName,
})
}

View File

@@ -2,7 +2,6 @@ package main
import "C"
import (
bridge "core/dart-bridge"
"github.com/metacubex/mihomo/common/observable"
"github.com/metacubex/mihomo/log"
)
@@ -21,11 +20,11 @@ func startLog() {
if logData.LogLevel < log.Level() {
continue
}
message := &bridge.Message{
Type: bridge.Log,
message := &Message{
Type: LogMessage,
Data: logData,
}
bridge.SendMessage(*message)
SendMessage(*message)
}
}()
}

77
core/message.go Normal file
View File

@@ -0,0 +1,77 @@
package main
import (
bridge "core/dart-bridge"
"encoding/json"
"github.com/metacubex/mihomo/constant"
)
var Port int64
var ServicePort int64
type MessageType string
const (
LogMessage MessageType = "log"
ProtectMessage MessageType = "protect"
DelayMessage MessageType = "delay"
ProcessMessage MessageType = "process"
RequestMessage MessageType = "request"
StartedMessage MessageType = "started"
LoadedMessage MessageType = "loaded"
)
type Delay struct {
Name string `json:"name"`
Value int32 `json:"value"`
}
type Process struct {
Id int64 `json:"id"`
Metadata *constant.Metadata `json:"metadata"`
}
type Message struct {
Type MessageType `json:"type"`
Data interface{} `json:"data"`
}
func (message *Message) Json() (string, error) {
data, err := json.Marshal(message)
return string(data), err
}
func SendMessage(message Message) {
s, err := message.Json()
if err != nil {
return
}
if handler, ok := messageHandlers[message.Type]; ok {
handler(s)
} else {
sendToPort(s)
}
}
var messageHandlers = map[MessageType]func(string) bool{
ProtectMessage: sendToServicePort,
ProcessMessage: sendToServicePort,
StartedMessage: conditionalSend,
LoadedMessage: conditionalSend,
}
func sendToPort(s string) bool {
return bridge.SendToPort(Port, s)
}
func sendToServicePort(s string) bool {
return bridge.SendToPort(ServicePort, s)
}
func conditionalSend(s string) bool {
isSuccess := sendToPort(s)
if !isSuccess {
return sendToServicePort(s)
}
return isSuccess
}

View File

@@ -4,7 +4,6 @@ package main
import "C"
import (
bridge "core/dart-bridge"
"encoding/json"
"errors"
"github.com/metacubex/mihomo/component/process"
@@ -43,8 +42,8 @@ func init() {
timeout := time.After(200 * time.Millisecond)
bridge.SendMessage(bridge.Message{
Type: bridge.Process,
SendMessage(Message{
Type: ProcessMessage,
Data: Process{
Id: id,
Metadata: metadata,

View File

@@ -10,6 +10,7 @@ import (
"github.com/metacubex/mihomo/component/dialer"
"github.com/metacubex/mihomo/log"
"golang.org/x/sync/semaphore"
"strconv"
"sync"
"sync/atomic"
"syscall"
@@ -18,6 +19,7 @@ import (
var tunLock sync.Mutex
var tun *t.Tun
var runTime *time.Time
type FdMap struct {
m sync.Map
@@ -35,7 +37,9 @@ func (cm *FdMap) Load(key int64) bool {
var fdMap FdMap
//export startTUN
func startTUN(fd C.int) {
func startTUN(fd C.int, port C.longlong) {
i := int64(port)
ServicePort = i
go func() {
tunLock.Lock()
defer tunLock.Unlock()
@@ -44,6 +48,7 @@ func startTUN(fd C.int) {
tun.Close()
tun = nil
}
f := int(fd)
gateway := "172.16.0.1/30"
portal := "172.16.0.2"
@@ -61,15 +66,34 @@ func startTUN(fd C.int) {
tempTun.Closer = closer
tun = tempTun
now := time.Now()
runTime = &now
SendMessage(Message{
Type: StartedMessage,
Data: strconv.FormatInt(runTime.UnixMilli(), 10),
})
}()
}
//export getRunTime
func getRunTime() *C.char {
if runTime == nil {
return C.CString("")
}
return C.CString(strconv.FormatInt(runTime.UnixMilli(), 10))
}
//export stopTun
func stopTun() {
go func() {
tunLock.Lock()
defer tunLock.Unlock()
runTime = nil
if tun != nil {
tun.Close()
tun = nil
@@ -87,6 +111,18 @@ func setFdMap(fd C.long) {
}()
}
type Fd struct {
Id int64 `json:"id"`
Value int64 `json:"value"`
}
func markSocket(fd Fd) {
SendMessage(Message{
Type: ProtectMessage,
Data: fd,
})
}
var fdCounter int64 = 0
func init() {
@@ -102,7 +138,8 @@ func init() {
fdInt := int64(fd)
timeout := time.After(100 * time.Millisecond)
id := atomic.AddInt64(&fdCounter, 1)
tun.MarkSocket(t.Fd{
markSocket(Fd{
Id: id,
Value: fdInt,
})

View File

@@ -5,7 +5,6 @@ package tun
import "C"
import (
"context"
bridge "core/dart-bridge"
"encoding/binary"
"github.com/Kr328/tun2socket"
"github.com/Kr328/tun2socket/nat"
@@ -185,24 +184,3 @@ func Start(fd int, gateway, portal, dns string) (io.Closer, error) {
return stack, nil
}
type Fd struct {
Id int64 `json:"id"`
Value int64 `json:"value"`
}
func (t *Tun) MarkSocket(fd Fd) {
_ = t.Limit.Acquire(context.Background(), 1)
defer t.Limit.Release(1)
if t.Closed {
return
}
message := &bridge.Message{
Type: bridge.Tun,
Data: fd,
}
bridge.SendMessage(*message)
}