github.com/kelleygo/clashcore@v1.0.2/listener/parse.go (about)

     1  package listener
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/kelleygo/clashcore/common/structure"
     7  	C "github.com/kelleygo/clashcore/constant"
     8  	IN "github.com/kelleygo/clashcore/listener/inbound"
     9  )
    10  
    11  func ParseListener(mapping map[string]any) (C.InboundListener, error) {
    12  	decoder := structure.NewDecoder(structure.Option{TagName: "inbound", WeaklyTypedInput: true, KeyReplacer: structure.DefaultKeyReplacer})
    13  	proxyType, existType := mapping["type"].(string)
    14  	if !existType {
    15  		return nil, fmt.Errorf("missing type")
    16  	}
    17  
    18  	var (
    19  		listener C.InboundListener
    20  		err      error
    21  	)
    22  	switch proxyType {
    23  	case "socks":
    24  		socksOption := &IN.SocksOption{UDP: true}
    25  		err = decoder.Decode(mapping, socksOption)
    26  		if err != nil {
    27  			return nil, err
    28  		}
    29  		listener, err = IN.NewSocks(socksOption)
    30  	case "http":
    31  		httpOption := &IN.HTTPOption{}
    32  		err = decoder.Decode(mapping, httpOption)
    33  		if err != nil {
    34  			return nil, err
    35  		}
    36  		listener, err = IN.NewHTTP(httpOption)
    37  	case "tproxy":
    38  		tproxyOption := &IN.TProxyOption{UDP: true}
    39  		err = decoder.Decode(mapping, tproxyOption)
    40  		if err != nil {
    41  			return nil, err
    42  		}
    43  		listener, err = IN.NewTProxy(tproxyOption)
    44  	case "redir":
    45  		redirOption := &IN.RedirOption{}
    46  		err = decoder.Decode(mapping, redirOption)
    47  		if err != nil {
    48  			return nil, err
    49  		}
    50  		listener, err = IN.NewRedir(redirOption)
    51  	case "mixed":
    52  		mixedOption := &IN.MixedOption{UDP: true}
    53  		err = decoder.Decode(mapping, mixedOption)
    54  		if err != nil {
    55  			return nil, err
    56  		}
    57  		listener, err = IN.NewMixed(mixedOption)
    58  	case "tunnel":
    59  		tunnelOption := &IN.TunnelOption{}
    60  		err = decoder.Decode(mapping, tunnelOption)
    61  		if err != nil {
    62  			return nil, err
    63  		}
    64  		listener, err = IN.NewTunnel(tunnelOption)
    65  	case "tun":
    66  		tunOption := &IN.TunOption{
    67  			Stack:     C.TunGvisor.String(),
    68  			DNSHijack: []string{"0.0.0.0:53"}, // default hijack all dns query
    69  		}
    70  		err = decoder.Decode(mapping, tunOption)
    71  		if err != nil {
    72  			return nil, err
    73  		}
    74  		listener, err = IN.NewTun(tunOption)
    75  	case "shadowsocks":
    76  		shadowsocksOption := &IN.ShadowSocksOption{UDP: true}
    77  		err = decoder.Decode(mapping, shadowsocksOption)
    78  		if err != nil {
    79  			return nil, err
    80  		}
    81  		listener, err = IN.NewShadowSocks(shadowsocksOption)
    82  	case "vmess":
    83  		vmessOption := &IN.VmessOption{}
    84  		err = decoder.Decode(mapping, vmessOption)
    85  		if err != nil {
    86  			return nil, err
    87  		}
    88  		listener, err = IN.NewVmess(vmessOption)
    89  	case "hysteria2":
    90  		hysteria2Option := &IN.Hysteria2Option{}
    91  		err = decoder.Decode(mapping, hysteria2Option)
    92  		if err != nil {
    93  			return nil, err
    94  		}
    95  		listener, err = IN.NewHysteria2(hysteria2Option)
    96  	case "tuic":
    97  		tuicOption := &IN.TuicOption{
    98  			MaxIdleTime:           15000,
    99  			AuthenticationTimeout: 1000,
   100  			ALPN:                  []string{"h3"},
   101  			MaxUdpRelayPacketSize: 1500,
   102  			CongestionController:  "bbr",
   103  		}
   104  		err = decoder.Decode(mapping, tuicOption)
   105  		if err != nil {
   106  			return nil, err
   107  		}
   108  		listener, err = IN.NewTuic(tuicOption)
   109  	default:
   110  		return nil, fmt.Errorf("unsupport proxy type: %s", proxyType)
   111  	}
   112  	return listener, err
   113  }