//go:build android package main import "C" import ( bridge "core/dart-bridge" "encoding/json" "errors" "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/constant" "sync" "sync/atomic" "time" ) type ProcessMap struct { m sync.Map } func (cm *ProcessMap) Store(key int64, value string) { cm.m.Store(key, value) } func (cm *ProcessMap) Load(key int64) (string, bool) { value, ok := cm.m.Load(key) if !ok || value == nil { return "", false } return value.(string), true } var counter int64 = 0 var processMap ProcessMap func init() { process.DefaultPackageNameResolver = func(metadata *constant.Metadata) (string, error) { if metadata == nil { return "", process.ErrInvalidNetwork } id := atomic.AddInt64(&counter, 1) timeout := time.After(200 * time.Millisecond) bridge.SendMessage(bridge.Message{ Type: bridge.Process, Data: Process{ Id: id, Metadata: metadata, }, }) for { select { case <-timeout: return "", errors.New("package resolver timeout") default: value, exists := processMap.Load(id) if exists { return value, nil } time.Sleep(20 * time.Millisecond) } } } } //export setProcessMap func setProcessMap(s *C.char) { if s == nil { return } go func() { paramsString := C.GoString(s) var processMapItem = &ProcessMapItem{} err := json.Unmarshal([]byte(paramsString), processMapItem) if err == nil { processMap.Store(processMapItem.Id, processMapItem.Value) } }() }