api.go 1.7 KB

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