api.go 1.9 KB

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