transport.go 2.2 KB

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