dialer.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package singbridge
  2. import (
  3. "context"
  4. "os"
  5. M "github.com/sagernet/sing/common/metadata"
  6. N "github.com/sagernet/sing/common/network"
  7. "github.com/xtls/xray-core/common/net"
  8. "github.com/xtls/xray-core/common/net/cnc"
  9. "github.com/xtls/xray-core/common/session"
  10. "github.com/xtls/xray-core/proxy"
  11. "github.com/xtls/xray-core/transport"
  12. "github.com/xtls/xray-core/transport/internet"
  13. "github.com/xtls/xray-core/transport/pipe"
  14. )
  15. var _ N.Dialer = (*XrayDialer)(nil)
  16. type XrayDialer struct {
  17. internet.Dialer
  18. }
  19. func NewDialer(dialer internet.Dialer) *XrayDialer {
  20. return &XrayDialer{dialer}
  21. }
  22. func (d *XrayDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  23. return d.Dialer.Dial(ctx, ToDestination(destination, ToNetwork(network)))
  24. }
  25. func (d *XrayDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  26. return nil, os.ErrInvalid
  27. }
  28. type XrayOutboundDialer struct {
  29. outbound proxy.Outbound
  30. dialer internet.Dialer
  31. }
  32. func NewOutboundDialer(outbound proxy.Outbound, dialer internet.Dialer) *XrayOutboundDialer {
  33. return &XrayOutboundDialer{outbound, dialer}
  34. }
  35. func (d *XrayOutboundDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  36. ctx = session.ContextWithOutbound(context.Background(), &session.Outbound{
  37. Target: ToDestination(destination, ToNetwork(network)),
  38. })
  39. opts := []pipe.Option{pipe.WithSizeLimit(64 * 1024)}
  40. uplinkReader, uplinkWriter := pipe.New(opts...)
  41. downlinkReader, downlinkWriter := pipe.New(opts...)
  42. conn := cnc.NewConnection(cnc.ConnectionInputMulti(downlinkWriter), cnc.ConnectionOutputMulti(uplinkReader))
  43. go d.outbound.Process(ctx, &transport.Link{Reader: downlinkReader, Writer: uplinkWriter}, d.dialer)
  44. return conn, nil
  45. }
  46. func (d *XrayOutboundDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  47. return nil, os.ErrInvalid
  48. }