dialer.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package dialer
  2. import (
  3. "context"
  4. "time"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/option"
  7. "github.com/sagernet/sing-dns"
  8. E "github.com/sagernet/sing/common/exceptions"
  9. N "github.com/sagernet/sing/common/network"
  10. "github.com/sagernet/sing/service"
  11. )
  12. func New(ctx context.Context, options option.DialerOptions) (N.Dialer, error) {
  13. router := service.FromContext[adapter.Router](ctx)
  14. if options.IsWireGuardListener {
  15. return NewDefault(router, options)
  16. }
  17. var (
  18. dialer N.Dialer
  19. err error
  20. )
  21. if options.Detour == "" {
  22. dialer, err = NewDefault(router, options)
  23. if err != nil {
  24. return nil, err
  25. }
  26. } else {
  27. outboundManager := service.FromContext[adapter.OutboundManager](ctx)
  28. if outboundManager == nil {
  29. return nil, E.New("missing outbound manager")
  30. }
  31. dialer = NewDetour(outboundManager, options.Detour)
  32. }
  33. if router == nil {
  34. return NewDefault(router, options)
  35. }
  36. if options.Detour == "" {
  37. dialer = NewResolveDialer(
  38. router,
  39. dialer,
  40. options.Detour == "" && !options.TCPFastOpen,
  41. dns.DomainStrategy(options.DomainStrategy),
  42. time.Duration(options.FallbackDelay))
  43. }
  44. return dialer, nil
  45. }