support core adaptive

This commit is contained in:
yuzuki999 2023-09-02 17:30:28 +08:00
parent a95a060d60
commit 946e130997
3 changed files with 43 additions and 24 deletions

View File

@ -23,16 +23,6 @@ type ApiConfig struct {
RuleListPath string `json:"RuleListPath"` RuleListPath string `json:"RuleListPath"`
} }
type Options struct {
Core string `json:"Core"`
ListenIP string `json:"ListenIP"`
SendIP string `json:"SendIP"`
LimitConfig LimitConfig `json:"LimitConfig"`
XrayOptions *XrayOptions `json:"XrayOptions"`
SingOptions *SingOptions `json:"SingOptions"`
CertConfig *CertConfig `json:"CertConfig"`
}
func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) { func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) {
r := rawNodeConfig{} r := rawNodeConfig{}
err = json.Unmarshal(data, &r) err = json.Unmarshal(data, &r)
@ -46,6 +36,7 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) {
} }
} else { } else {
n.ApiConfig = ApiConfig{ n.ApiConfig = ApiConfig{
APIHost: "http://127.0.0.1",
Timeout: 30, Timeout: 30,
} }
err = json.Unmarshal(data, &n.ApiConfig) err = json.Unmarshal(data, &n.ApiConfig)
@ -61,7 +52,6 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) {
} }
} else { } else {
n.Options = Options{ n.Options = Options{
Core: "xray",
ListenIP: "0.0.0.0", ListenIP: "0.0.0.0",
SendIP: "0.0.0.0", SendIP: "0.0.0.0",
} }
@ -70,13 +60,35 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) (err error) {
return return
} }
} }
switch n.Options.Core {
case "xray":
n.Options.XrayOptions = NewXrayOptions()
return json.Unmarshal(data, n.Options.XrayOptions)
case "sing":
n.Options.SingOptions = NewSingOptions()
return json.Unmarshal(data, n.Options.SingOptions)
}
return return
} }
type Options struct {
Core string `json:"Core"`
ListenIP string `json:"ListenIP"`
SendIP string `json:"SendIP"`
LimitConfig LimitConfig `json:"LimitConfig"`
RawOptions json.RawMessage `json:"RawOptions"`
XrayOptions *XrayOptions `json:"XrayOptions"`
SingOptions *SingOptions `json:"SingOptions"`
CertConfig *CertConfig `json:"CertConfig"`
}
func (o *Options) UnmarshalJSON(data []byte) error {
type opt Options
err := json.Unmarshal(data, (*opt)(o))
if err != nil {
return err
}
switch o.Core {
case "xray":
o.XrayOptions = NewXrayOptions()
return json.Unmarshal(data, o.XrayOptions)
case "sing":
o.SingOptions = NewSingOptions()
return json.Unmarshal(data, o.SingOptions)
default:
o.RawOptions = data
}
return nil
}

View File

@ -2,6 +2,7 @@ package core
import ( import (
"errors" "errors"
"fmt"
"sync" "sync"
"github.com/InazumaV/V2bX/api/panel" "github.com/InazumaV/V2bX/api/panel"
@ -40,11 +41,19 @@ func isSupported(protocol string, protocols []string) bool {
} }
func (s *Selector) AddNode(tag string, info *panel.NodeInfo, option *conf.Options) error { func (s *Selector) AddNode(tag string, info *panel.NodeInfo, option *conf.Options) error {
for i := range s.cores { for i, c := range s.cores {
if option.Core != s.cores[i].Type() { if len(option.Core) == 0 {
if isSupported(info.Type, c.Protocols()) {
option.Core = c.Type()
err := option.UnmarshalJSON(option.RawOptions)
if err != nil {
return fmt.Errorf("unmarshal option error: %s", err)
}
}
} else if option.Core != c.Type() {
continue continue
} }
err := s.cores[i].AddNode(tag, info, option) err := c.AddNode(tag, info, option)
if err != nil { if err != nil {
return err return err
} }

2
go.mod
View File

@ -2,8 +2,6 @@ module github.com/InazumaV/V2bX
go 1.21 go 1.21
toolchain go1.21.0
require ( require (
github.com/beevik/ntp v1.2.0 github.com/beevik/ntp v1.2.0
github.com/dustin/go-humanize v1.0.1 github.com/dustin/go-humanize v1.0.1