github.com/kelleygo/clashcore@v1.0.2/component/dialer/options.go (about)

     1  package dialer
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  
     7  	"github.com/kelleygo/clashcore/common/atomic"
     8  	"github.com/kelleygo/clashcore/component/resolver"
     9  )
    10  
    11  var (
    12  	DefaultOptions     []Option
    13  	DefaultInterface   = atomic.NewTypedValue[string]("")
    14  	DefaultRoutingMark = atomic.NewInt32(0)
    15  )
    16  
    17  type NetDialer interface {
    18  	DialContext(ctx context.Context, network, address string) (net.Conn, error)
    19  }
    20  
    21  type option struct {
    22  	interfaceName string
    23  	fallbackBind  bool
    24  	addrReuse     bool
    25  	routingMark   int
    26  	network       int
    27  	prefer        int
    28  	tfo           bool
    29  	mpTcp         bool
    30  	resolver      resolver.Resolver
    31  	netDialer     NetDialer
    32  }
    33  
    34  type Option func(opt *option)
    35  
    36  func WithInterface(name string) Option {
    37  	return func(opt *option) {
    38  		opt.interfaceName = name
    39  	}
    40  }
    41  
    42  func WithFallbackBind(fallback bool) Option {
    43  	return func(opt *option) {
    44  		opt.fallbackBind = fallback
    45  	}
    46  }
    47  
    48  func WithAddrReuse(reuse bool) Option {
    49  	return func(opt *option) {
    50  		opt.addrReuse = reuse
    51  	}
    52  }
    53  
    54  func WithRoutingMark(mark int) Option {
    55  	return func(opt *option) {
    56  		opt.routingMark = mark
    57  	}
    58  }
    59  
    60  func WithResolver(r resolver.Resolver) Option {
    61  	return func(opt *option) {
    62  		opt.resolver = r
    63  	}
    64  }
    65  
    66  func WithPreferIPv4() Option {
    67  	return func(opt *option) {
    68  		opt.prefer = 4
    69  	}
    70  }
    71  
    72  func WithPreferIPv6() Option {
    73  	return func(opt *option) {
    74  		opt.prefer = 6
    75  	}
    76  }
    77  
    78  func WithOnlySingleStack(isIPv4 bool) Option {
    79  	return func(opt *option) {
    80  		if isIPv4 {
    81  			opt.network = 4
    82  		} else {
    83  			opt.network = 6
    84  		}
    85  	}
    86  }
    87  
    88  func WithTFO(tfo bool) Option {
    89  	return func(opt *option) {
    90  		opt.tfo = tfo
    91  	}
    92  }
    93  
    94  func WithMPTCP(mpTcp bool) Option {
    95  	return func(opt *option) {
    96  		opt.mpTcp = mpTcp
    97  	}
    98  }
    99  
   100  func WithNetDialer(netDialer NetDialer) Option {
   101  	return func(opt *option) {
   102  		opt.netDialer = netDialer
   103  	}
   104  }
   105  
   106  func WithOption(o option) Option {
   107  	return func(opt *option) {
   108  		*opt = o
   109  	}
   110  }