root.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package v5cfg
  2. import (
  3. "context"
  4. "github.com/golang/protobuf/proto"
  5. core "github.com/v2fly/v2ray-core/v4"
  6. "github.com/v2fly/v2ray-core/v4/app/dispatcher"
  7. "github.com/v2fly/v2ray-core/v4/app/proxyman"
  8. "github.com/v2fly/v2ray-core/v4/common/serial"
  9. "github.com/v2fly/v2ray-core/v4/infra/conf/synthetic/log"
  10. "google.golang.org/protobuf/types/known/anypb"
  11. )
  12. func (c RootConfig) BuildV5(ctx context.Context) (proto.Message, error) {
  13. config := &core.Config{
  14. App: []*anypb.Any{
  15. serial.ToTypedMessage(&dispatcher.Config{}),
  16. serial.ToTypedMessage(&proxyman.InboundConfig{}),
  17. serial.ToTypedMessage(&proxyman.OutboundConfig{}),
  18. },
  19. }
  20. var logConfMsg *anypb.Any
  21. if c.LogConfig != nil {
  22. logConfMsg = serial.ToTypedMessage(c.LogConfig.Build())
  23. } else {
  24. logConfMsg = serial.ToTypedMessage(log.DefaultLogConfig())
  25. }
  26. // let logger module be the first App to start,
  27. // so that other modules could print log during initiating
  28. config.App = append([]*anypb.Any{logConfMsg}, config.App...)
  29. if c.RouterConfig != nil {
  30. routerConfig, err := c.RouterConfig.Build()
  31. if err != nil {
  32. return nil, err
  33. }
  34. config.App = append(config.App, serial.ToTypedMessage(routerConfig))
  35. }
  36. if c.DNSConfig != nil {
  37. dnsApp, err := c.DNSConfig.Build()
  38. if err != nil {
  39. return nil, newError("failed to parse DNS config").Base(err)
  40. }
  41. config.App = append(config.App, serial.ToTypedMessage(dnsApp))
  42. }
  43. for _, rawInboundConfig := range c.Inbounds {
  44. ic, err := rawInboundConfig.BuildV5(ctx)
  45. if err != nil {
  46. return nil, err
  47. }
  48. config.Inbound = append(config.Inbound, ic.(*core.InboundHandlerConfig))
  49. }
  50. for _, rawOutboundConfig := range c.Outbounds {
  51. ic, err := rawOutboundConfig.BuildV5(ctx)
  52. if err != nil {
  53. return nil, err
  54. }
  55. config.Outbound = append(config.Outbound, ic.(*core.OutboundHandlerConfig))
  56. }
  57. for serviceName, service := range c.Services {
  58. servicePackedConfig, err := loadHeterogeneousConfigFromRawJson("inbound", serviceName, service)
  59. if err != nil {
  60. return nil, err
  61. }
  62. config.App = append(config.App, serial.ToTypedMessage(servicePackedConfig))
  63. }
  64. return config, nil
  65. }