api.go 1.9 KB

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