github.com/ipfans/trojan-go@v0.11.0/proxy/server/server.go (about) 1 package server 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/proxy/client" 9 "github.com/ipfans/trojan-go/tunnel/freedom" 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/tls" 15 "github.com/ipfans/trojan-go/tunnel/transport" 16 "github.com/ipfans/trojan-go/tunnel/trojan" 17 "github.com/ipfans/trojan-go/tunnel/websocket" 18 ) 19 20 const Name = "SERVER" 21 22 func init() { 23 proxy.RegisterProxyCreator(Name, func(ctx context.Context) (*proxy.Proxy, error) { 24 cfg := config.FromContext(ctx, Name).(*client.Config) 25 ctx, cancel := context.WithCancel(ctx) 26 transportServer, err := transport.NewServer(ctx, nil) 27 if err != nil { 28 cancel() 29 return nil, err 30 } 31 clientStack := []string{freedom.Name} 32 if cfg.Router.Enabled { 33 clientStack = []string{freedom.Name, router.Name} 34 } 35 36 root := &proxy.Node{ 37 Name: transport.Name, 38 Next: make(map[string]*proxy.Node), 39 IsEndpoint: false, 40 Context: ctx, 41 Server: transportServer, 42 } 43 44 if !cfg.TransportPlugin.Enabled { 45 root = root.BuildNext(tls.Name) 46 } 47 48 trojanSubTree := root 49 if cfg.Shadowsocks.Enabled { 50 trojanSubTree = trojanSubTree.BuildNext(shadowsocks.Name) 51 } 52 trojanSubTree.BuildNext(trojan.Name).BuildNext(mux.Name).BuildNext(simplesocks.Name).IsEndpoint = true 53 trojanSubTree.BuildNext(trojan.Name).IsEndpoint = true 54 55 wsSubTree := root.BuildNext(websocket.Name) 56 if cfg.Shadowsocks.Enabled { 57 wsSubTree = wsSubTree.BuildNext(shadowsocks.Name) 58 } 59 wsSubTree.BuildNext(trojan.Name).BuildNext(mux.Name).BuildNext(simplesocks.Name).IsEndpoint = true 60 wsSubTree.BuildNext(trojan.Name).IsEndpoint = true 61 62 serverList := proxy.FindAllEndpoints(root) 63 clientList, err := proxy.CreateClientStack(ctx, clientStack) 64 if err != nil { 65 cancel() 66 return nil, err 67 } 68 return proxy.NewProxy(ctx, cancel, serverList, clientList), nil 69 }) 70 }