Files
2020-07-15 16:27:42 +00:00

75 lines
2.2 KiB
Go

package client
import (
"context"
"github.com/p4gefau1t/trojan-go/config"
"github.com/p4gefau1t/trojan-go/proxy"
"github.com/p4gefau1t/trojan-go/tunnel/adapter"
"github.com/p4gefau1t/trojan-go/tunnel/http"
"github.com/p4gefau1t/trojan-go/tunnel/mux"
"github.com/p4gefau1t/trojan-go/tunnel/router"
"github.com/p4gefau1t/trojan-go/tunnel/shadowsocks"
"github.com/p4gefau1t/trojan-go/tunnel/simplesocks"
"github.com/p4gefau1t/trojan-go/tunnel/socks"
"github.com/p4gefau1t/trojan-go/tunnel/tls"
"github.com/p4gefau1t/trojan-go/tunnel/transport"
"github.com/p4gefau1t/trojan-go/tunnel/trojan"
"github.com/p4gefau1t/trojan-go/tunnel/websocket"
)
const Name = "CLIENT"
// GenerateClientTree generate general outbound protocol stack
func GenerateClientTree(transportPlugin bool, muxEnabled bool, wsEnabled bool, ssEnabled bool, routerEnabled bool) []string {
clientStack := []string{transport.Name}
if !transportPlugin {
clientStack = append(clientStack, tls.Name)
}
if wsEnabled {
clientStack = append(clientStack, websocket.Name)
}
if ssEnabled {
clientStack = append(clientStack, shadowsocks.Name)
}
clientStack = append(clientStack, trojan.Name)
if muxEnabled {
clientStack = append(clientStack, []string{mux.Name, simplesocks.Name}...)
}
if routerEnabled {
clientStack = append(clientStack, router.Name)
}
return clientStack
}
func init() {
proxy.RegisterProxyCreator(Name, func(ctx context.Context) (*proxy.Proxy, error) {
cfg := config.FromContext(ctx, Name).(*Config)
adapterServer, err := adapter.NewServer(ctx, nil)
if err != nil {
return nil, err
}
ctx, cancel := context.WithCancel(ctx)
root := &proxy.Node{
Name: adapter.Name,
Next: make(map[string]*proxy.Node),
IsEndpoint: false,
Context: ctx,
Server: adapterServer,
}
root.BuildNext(http.Name).IsEndpoint = true
root.BuildNext(socks.Name).IsEndpoint = true
clientStack := GenerateClientTree(cfg.TransportPlugin.Enabled, cfg.Mux.Enabled, cfg.Websocket.Enabled, cfg.Shadowsocks.Enabled, cfg.Router.Enabled)
c, err := proxy.CreateClientStack(ctx, clientStack)
if err != nil {
cancel()
return nil, err
}
s := proxy.FindAllEndpoints(root)
return proxy.NewProxy(ctx, cancel, s, c), nil
})
}