github.com/ipfans/trojan-go@v0.11.0/proxy/client/client.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/ipfans/trojan-go/config"
     7  	"github.com/ipfans/trojan-go/proxy"
     8  	"github.com/ipfans/trojan-go/tunnel/adapter"
     9  	"github.com/ipfans/trojan-go/tunnel/http"
    10  	"github.com/ipfans/trojan-go/tunnel/mux"
    11  	"github.com/ipfans/trojan-go/tunnel/router"
    12  	"github.com/ipfans/trojan-go/tunnel/shadowsocks"
    13  	"github.com/ipfans/trojan-go/tunnel/simplesocks"
    14  	"github.com/ipfans/trojan-go/tunnel/socks"
    15  	"github.com/ipfans/trojan-go/tunnel/tls"
    16  	"github.com/ipfans/trojan-go/tunnel/transport"
    17  	"github.com/ipfans/trojan-go/tunnel/trojan"
    18  	"github.com/ipfans/trojan-go/tunnel/websocket"
    19  )
    20  
    21  const Name = "CLIENT"
    22  
    23  // GenerateClientTree generate general outbound protocol stack
    24  func GenerateClientTree(transportPlugin bool, muxEnabled bool, wsEnabled bool, ssEnabled bool, routerEnabled bool) []string {
    25  	clientStack := []string{transport.Name}
    26  	if !transportPlugin {
    27  		clientStack = append(clientStack, tls.Name)
    28  	}
    29  	if wsEnabled {
    30  		clientStack = append(clientStack, websocket.Name)
    31  	}
    32  	if ssEnabled {
    33  		clientStack = append(clientStack, shadowsocks.Name)
    34  	}
    35  	clientStack = append(clientStack, trojan.Name)
    36  	if muxEnabled {
    37  		clientStack = append(clientStack, []string{mux.Name, simplesocks.Name}...)
    38  	}
    39  	if routerEnabled {
    40  		clientStack = append(clientStack, router.Name)
    41  	}
    42  	return clientStack
    43  }
    44  
    45  func init() {
    46  	proxy.RegisterProxyCreator(Name, func(ctx context.Context) (*proxy.Proxy, error) {
    47  		cfg := config.FromContext(ctx, Name).(*Config)
    48  		adapterServer, err := adapter.NewServer(ctx, nil)
    49  		if err != nil {
    50  			return nil, err
    51  		}
    52  		ctx, cancel := context.WithCancel(ctx)
    53  
    54  		root := &proxy.Node{
    55  			Name:       adapter.Name,
    56  			Next:       make(map[string]*proxy.Node),
    57  			IsEndpoint: false,
    58  			Context:    ctx,
    59  			Server:     adapterServer,
    60  		}
    61  
    62  		root.BuildNext(http.Name).IsEndpoint = true
    63  		root.BuildNext(socks.Name).IsEndpoint = true
    64  
    65  		clientStack := GenerateClientTree(cfg.TransportPlugin.Enabled, cfg.Mux.Enabled, cfg.Websocket.Enabled, cfg.Shadowsocks.Enabled, cfg.Router.Enabled)
    66  		c, err := proxy.CreateClientStack(ctx, clientStack)
    67  		if err != nil {
    68  			cancel()
    69  			return nil, err
    70  		}
    71  		s := proxy.FindAllEndpoints(root)
    72  		return proxy.NewProxy(ctx, cancel, s, c), nil
    73  	})
    74  }