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  }