diff --git a/infra/conf/v5cfg/init.go b/infra/conf/v5cfg/init.go new file mode 100644 index 000000000..9eb35be4a --- /dev/null +++ b/infra/conf/v5cfg/init.go @@ -0,0 +1,40 @@ +package v5cfg + +import ( + core "github.com/v2fly/v2ray-core/v4" + "github.com/v2fly/v2ray-core/v4/common" + "github.com/v2fly/v2ray-core/v4/common/buf" + "github.com/v2fly/v2ray-core/v4/common/cmdarg" + "io" +) + +const jsonV5 = "jsonv5" + +func init() { + common.Must(core.RegisterConfigLoader(&core.ConfigFormat{ + Name: []string{jsonV5}, + Extension: []string{".json"}, + Loader: func(input interface{}) (*core.Config, error) { + switch v := input.(type) { + case string: + r, err := cmdarg.LoadArg(v) + if err != nil { + return nil, err + } + data, err := buf.ReadAllToBytes(r) + if err != nil { + return nil, err + } + return loadJsonConfig(data) + case io.Reader: + data, err := buf.ReadAllToBytes(v) + if err != nil { + return nil, err + } + return loadJsonConfig(data) + default: + return nil, newError("unknown type") + } + }, + })) +} diff --git a/infra/conf/v5cfg/root.go b/infra/conf/v5cfg/root.go index 6c0a221a1..50028686a 100644 --- a/infra/conf/v5cfg/root.go +++ b/infra/conf/v5cfg/root.go @@ -2,6 +2,7 @@ package v5cfg import ( "context" + "encoding/json" "github.com/golang/protobuf/proto" core "github.com/v2fly/v2ray-core/v4" "github.com/v2fly/v2ray-core/v4/app/dispatcher" @@ -71,3 +72,18 @@ func (c RootConfig) BuildV5(ctx context.Context) (proto.Message, error) { } return config, nil } + +func loadJsonConfig(data []byte) (*core.Config, error) { + rootConfig := &RootConfig{} + + err := json.Unmarshal(data, rootConfig) + if err != nil { + return nil, newError("unable to load json").Base(err) + } + + message, err := rootConfig.BuildV5(context.TODO()) + if err != nil { + return nil, newError("unable to build config").Base(err) + } + return message.(*core.Config), nil +}