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 }