github.com/inazumav/sing-box@v0.0.0-20230926072359-ab51429a14f1/transport/v2ray/transport.go (about) 1 package v2ray 2 3 import ( 4 "context" 5 6 "github.com/inazumav/sing-box/adapter" 7 "github.com/inazumav/sing-box/common/tls" 8 C "github.com/inazumav/sing-box/constant" 9 "github.com/inazumav/sing-box/option" 10 "github.com/inazumav/sing-box/transport/v2rayhttp" 11 "github.com/inazumav/sing-box/transport/v2raywebsocket" 12 E "github.com/sagernet/sing/common/exceptions" 13 M "github.com/sagernet/sing/common/metadata" 14 N "github.com/sagernet/sing/common/network" 15 ) 16 17 type ( 18 ServerConstructor[O any] func(ctx context.Context, options O, tlsConfig tls.ServerConfig, handler adapter.V2RayServerTransportHandler) (adapter.V2RayServerTransport, error) 19 ClientConstructor[O any] func(ctx context.Context, dialer N.Dialer, serverAddr M.Socksaddr, options O, tlsConfig tls.Config) (adapter.V2RayClientTransport, error) 20 ) 21 22 func NewServerTransport(ctx context.Context, options option.V2RayTransportOptions, tlsConfig tls.ServerConfig, handler adapter.V2RayServerTransportHandler) (adapter.V2RayServerTransport, error) { 23 if options.Type == "" { 24 return nil, nil 25 } 26 switch options.Type { 27 case C.V2RayTransportTypeHTTP: 28 return v2rayhttp.NewServer(ctx, options.HTTPOptions, tlsConfig, handler) 29 case C.V2RayTransportTypeWebsocket: 30 return v2raywebsocket.NewServer(ctx, options.WebsocketOptions, tlsConfig, handler) 31 case C.V2RayTransportTypeQUIC: 32 if tlsConfig == nil { 33 return nil, C.ErrTLSRequired 34 } 35 return NewQUICServer(ctx, options.QUICOptions, tlsConfig, handler) 36 case C.V2RayTransportTypeGRPC: 37 return NewGRPCServer(ctx, options.GRPCOptions, tlsConfig, handler) 38 default: 39 return nil, E.New("unknown transport type: " + options.Type) 40 } 41 } 42 43 func NewClientTransport(ctx context.Context, dialer N.Dialer, serverAddr M.Socksaddr, options option.V2RayTransportOptions, tlsConfig tls.Config) (adapter.V2RayClientTransport, error) { 44 if options.Type == "" { 45 return nil, nil 46 } 47 switch options.Type { 48 case C.V2RayTransportTypeHTTP: 49 return v2rayhttp.NewClient(ctx, dialer, serverAddr, options.HTTPOptions, tlsConfig) 50 case C.V2RayTransportTypeGRPC: 51 return NewGRPCClient(ctx, dialer, serverAddr, options.GRPCOptions, tlsConfig) 52 case C.V2RayTransportTypeWebsocket: 53 return v2raywebsocket.NewClient(ctx, dialer, serverAddr, options.WebsocketOptions, tlsConfig), nil 54 case C.V2RayTransportTypeQUIC: 55 if tlsConfig == nil { 56 return nil, C.ErrTLSRequired 57 } 58 return NewQUICClient(ctx, dialer, serverAddr, options.QUICOptions, tlsConfig) 59 60 default: 61 return nil, E.New("unknown transport type: " + options.Type) 62 } 63 }