v2binding.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package v2binding
  2. import (
  3. "google.golang.org/protobuf/types/known/anypb"
  4. core "github.com/v2fly/v2ray-core/v4"
  5. "github.com/v2fly/v2ray-core/v4/app/commander"
  6. "github.com/v2fly/v2ray-core/v4/app/dispatcher"
  7. "github.com/v2fly/v2ray-core/v4/app/instman"
  8. "github.com/v2fly/v2ray-core/v4/app/instman/command"
  9. "github.com/v2fly/v2ray-core/v4/app/proxyman"
  10. "github.com/v2fly/v2ray-core/v4/app/router"
  11. "github.com/v2fly/v2ray-core/v4/common/net"
  12. "github.com/v2fly/v2ray-core/v4/common/serial"
  13. // Initialization
  14. _ "github.com/v2fly/v2ray-core/v4/main/distro/all"
  15. "github.com/v2fly/v2ray-core/v4/proxy/blackhole"
  16. "github.com/v2fly/v2ray-core/v4/proxy/dokodemo"
  17. )
  18. type bindingInstance struct {
  19. started bool
  20. instance *core.Instance
  21. }
  22. var binding bindingInstance
  23. func (b *bindingInstance) startAPIInstance() {
  24. bindConfig := &core.Config{
  25. App: []*anypb.Any{
  26. serial.ToTypedMessage(&instman.Config{}),
  27. serial.ToTypedMessage(&commander.Config{
  28. Tag: "api",
  29. Service: []*anypb.Any{
  30. serial.ToTypedMessage(&command.Config{}),
  31. },
  32. }),
  33. serial.ToTypedMessage(&router.Config{
  34. Rule: []*router.RoutingRule{
  35. {
  36. InboundTag: []string{"api"},
  37. TargetTag: &router.RoutingRule_Tag{
  38. Tag: "api",
  39. },
  40. },
  41. },
  42. }),
  43. },
  44. Inbound: []*core.InboundHandlerConfig{
  45. {
  46. Tag: "api",
  47. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  48. PortRange: net.SinglePortRange(10999),
  49. Listen: net.NewIPOrDomain(net.AnyIP),
  50. }),
  51. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  52. Address: net.NewIPOrDomain(net.LocalHostIP),
  53. Port: uint32(10999),
  54. Networks: []net.Network{net.Network_TCP},
  55. }),
  56. },
  57. },
  58. Outbound: []*core.OutboundHandlerConfig{
  59. {
  60. Tag: "default-outbound",
  61. ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
  62. },
  63. },
  64. }
  65. bindConfig = withDefaultApps(bindConfig)
  66. instance, err := core.New(bindConfig)
  67. if err != nil {
  68. panic(err)
  69. }
  70. err = instance.Start()
  71. if err != nil {
  72. panic(err)
  73. }
  74. b.instance = instance
  75. }
  76. func withDefaultApps(config *core.Config) *core.Config {
  77. config.App = append(config.App, serial.ToTypedMessage(&dispatcher.Config{}))
  78. config.App = append(config.App, serial.ToTypedMessage(&proxyman.InboundConfig{}))
  79. config.App = append(config.App, serial.ToTypedMessage(&proxyman.OutboundConfig{}))
  80. return config
  81. }
  82. func StartAPIInstance(basedir string) {
  83. if binding.started {
  84. return
  85. }
  86. binding.started = true
  87. binding.startAPIInstance()
  88. }