api.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package conf
  2. import (
  3. "strings"
  4. "github.com/jhump/protoreflect/desc"
  5. "github.com/jhump/protoreflect/dynamic"
  6. "github.com/v2fly/v2ray-core/v4/app/commander"
  7. loggerservice "github.com/v2fly/v2ray-core/v4/app/log/command"
  8. handlerservice "github.com/v2fly/v2ray-core/v4/app/proxyman/command"
  9. statsservice "github.com/v2fly/v2ray-core/v4/app/stats/command"
  10. "github.com/v2fly/v2ray-core/v4/common/serial"
  11. )
  12. type APIConfig struct {
  13. Tag string `json:"tag"`
  14. Services []string `json:"services"`
  15. }
  16. func (c *APIConfig) Build() (*commander.Config, error) {
  17. if c.Tag == "" {
  18. return nil, newError("API tag can't be empty.")
  19. }
  20. services := make([]*serial.TypedMessage, 0, 16)
  21. for _, s := range c.Services {
  22. switch strings.ToLower(s) {
  23. case "reflectionservice":
  24. services = append(services, serial.ToTypedMessage(&commander.ReflectionConfig{}))
  25. case "handlerservice":
  26. services = append(services, serial.ToTypedMessage(&handlerservice.Config{}))
  27. case "loggerservice":
  28. services = append(services, serial.ToTypedMessage(&loggerservice.Config{}))
  29. case "statsservice":
  30. services = append(services, serial.ToTypedMessage(&statsservice.Config{}))
  31. default:
  32. if !strings.HasPrefix(s, "#") {
  33. continue
  34. }
  35. message, err := desc.LoadMessageDescriptor(s[1:])
  36. if err != nil || message == nil {
  37. return nil, newError("Cannot find API", s, "").Base(err)
  38. }
  39. serviceConfig := dynamic.NewMessage(message)
  40. services = append(services, serial.ToTypedMessage(serviceConfig))
  41. }
  42. }
  43. return &commander.Config{
  44. Tag: c.Tag,
  45. Service: services,
  46. }, nil
  47. }