transport.go 2.9 KB

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