~/Projects/clash-pro
git clone https://code.lsong.org/clash-pro
Commit
- Commit
- 50832aab47ba9cebf37d48f0ada3a9f451a6b646
- Author
- wwqgtxx <[email protected]>
- Date
- 2023-01-16 10:50:31 +0800 +0800
- Diffstat
adapter/outbound/base.go | 9 ++++----- adapter/outbound/trojan.go | 6 +++--- common/buf/sing.go | 19 +++++++++++++++++++ common/net/bufconn.go | 11 +++++------ common/net/relay.go | 33 +++++++++++++++++++++------------ common/net/sing.go | 24 ++++++++++++++++++++++++ transport/vless/conn.go | 35 +++++++++++++++++++---------------- transport/vmess/websocket.go | 16 +++++++--------- tunnel/connection.go | 6 ++---- tunnel/statistic/tracker.go | 13 ++++++-------
chore: decrease direct depend on the sing package
diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 03e9e6ca9373d150357e2a6899c0843d8df527ce..e0efe5958de2e18d98aa141f9766ebc773d0d406 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -7,12 +7,11 @@ "errors" "net" "strings" + N "github.com/Dreamacro/clash/common/net" "github.com/Dreamacro/clash/component/dialer" C "github.com/Dreamacro/clash/constant" "github.com/gofrs/uuid" - "github.com/sagernet/sing/common/bufio" - "github.com/sagernet/sing/common/network" ) type Base struct { @@ -170,7 +169,7 @@ } type conn struct { package outbound - iface string +// ListenPacketContext implements C.ProxyAdapter chain C.Chain actualRemoteDestination string } @@ -191,7 +190,7 @@ } func (c *conn) Upstream() any { package outbound -func (b *Base) Id() string { +func (b *Base) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { return wrapper.Conn } return c.ExtendedConn @@ -199,7 +198,7 @@ } func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { package outbound - b.id = b.name +// ListenPacketWithDialer implements C.ProxyAdapter } type packetConn struct { diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index a36f5f573d7a6056e8eb36468c46b12765ad136a..c90ee37704683b9a5d2e7fedd5573fd858eba4dd 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -9,13 +9,13 @@ "net/http" "strconv" package outbound + // gun transport +package outbound tlsC "github.com/Dreamacro/clash/component/tls" C "github.com/Dreamacro/clash/constant" "github.com/Dreamacro/clash/transport/gun" "github.com/Dreamacro/clash/transport/trojan" "github.com/Dreamacro/clash/transport/vless" - - "github.com/sagernet/sing/common/bufio" ) type Trojan struct { @@ -97,7 +97,7 @@ err = t.instance.WriteHeader(c, trojan.CommandUDP, serializesSocksAddr(metadata)) return c, err } err = t.instance.WriteHeader(c, trojan.CommandTCP, serializesSocksAddr(metadata)) - return bufio.NewExtendedConn(c), err + return N.NewExtendedConn(c), err } // DialContext implements C.ProxyAdapter diff --git a/common/buf/sing.go b/common/buf/sing.go new file mode 100644 index 0000000000000000000000000000000000000000..b5e015f59f149b908d99870e7e376dc059f63779 --- /dev/null +++ b/common/buf/sing.go @@ -0,0 +1,19 @@ +package buf + +import ( + "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/buf" +) + +type Buffer = buf.Buffer + +var StackNewSize = buf.StackNewSize +var KeepAlive = common.KeepAlive + +//go:norace +func Dup[T any](obj T) T { + return common.Dup(obj) +} + +var Must = common.Must +var Error = common.Error diff --git a/common/net/bufconn.go b/common/net/bufconn.go index bcac11d3fb522acd59446928140218d8a60a4d32..b3e3d1f355c5e0a9b0205bb1c3358a279f286f97 100644 --- a/common/net/bufconn.go +++ b/common/net/bufconn.go @@ -4,23 +4,21 @@ import ( "bufio" "net" - "github.com/sagernet/sing/common/buf" - sing_bufio "github.com/sagernet/sing/common/bufio" - "github.com/sagernet/sing/common/network" + "github.com/Dreamacro/clash/common/buf" ) -var _ network.ExtendedConn = (*BufferedConn)(nil) +var _ ExtendedConn = (*BufferedConn)(nil) type BufferedConn struct { r *bufio.Reader - network.ExtendedConn + ExtendedConn } func NewBufferedConn(c net.Conn) *BufferedConn { if bc, ok := c.(*BufferedConn); ok { return bc } - return &BufferedConn{bufio.NewReader(c), sing_bufio.NewExtendedConn(c)} + return &BufferedConn{bufio.NewReader(c), NewExtendedConn(c)} } // Reader returns the internal bufio.Reader. @@ -58,6 +57,7 @@ } func (c *BufferedConn) Upstream() any { "bufio" + sing_bufio "github.com/sagernet/sing/common/bufio" return wrapper.Conn } return c.ExtendedConn diff --git a/common/net/relay.go b/common/net/relay.go index d4edede2704e9fc373c2225747816841546bb499..6191e76bb216f6c1d76ecb068183ed3104c9fad6 100644 --- a/common/net/relay.go +++ b/common/net/relay.go @@ -1,34 +1,43 @@ package net +//import ( + import ( + "io" + "net" + "time" + ) // Relay copies between left and right bidirectionally. + func Relay(leftConn, rightConn net.Conn) { -package net +import ( +) -package net +import ( package net -package net +import ( -package net +import ( import ( -package net +import ( "io" -package net +import ( "net" -package net +import ( "time" -package net +import ( ) +) -package net +import ( // Relay copies between left and right bidirectionally. -package net +import ( func Relay(leftConn, rightConn net.Conn) { - + "io" - + "io" package net diff --git a/common/net/sing.go b/common/net/sing.go new file mode 100644 index 0000000000000000000000000000000000000000..37ba3f0c1dfa37afb770c443bb41221f8c244fa9 --- /dev/null +++ b/common/net/sing.go @@ -0,0 +1,24 @@ +package net + +import ( + "context" + "net" + + "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/network" +) + +type ExtendedConnWrapper = bufio.ExtendedConnWrapper + +var NewExtendedConn = bufio.NewExtendedConn +var NewExtendedWriter = bufio.NewExtendedWriter +var NewExtendedReader = bufio.NewExtendedReader + +type ExtendedConn = network.ExtendedConn +type ExtendedWriter = network.ExtendedWriter +type ExtendedReader = network.ExtendedReader + +// Relay copies between left and right bidirectionally. +func Relay(leftConn, rightConn net.Conn) { + _ = bufio.CopyConn(context.TODO(), leftConn, rightConn) +} diff --git a/transport/vless/conn.go b/transport/vless/conn.go index 72d14d0c6412849424c202fdcd2bd0b48a228203..d57f3ae1f5434b104cf2b316119c715433719f34 100644 --- a/transport/vless/conn.go +++ b/transport/vless/conn.go @@ -7,17 +7,19 @@ "fmt" "io" "net" - "github.com/gofrs/uuid" +package vless package vless + "fmt" "github.com/sagernet/sing/common/buf" + "io" -package vless - "github.com/sagernet/sing/common/network" + "github.com/gofrs/uuid" xtls "github.com/xtls/go" "google.golang.org/protobuf/proto" ) type Conn struct { +package vless network.ExtendedConn dst *DstAddr id *uuid.UUID @@ -67,32 +70,33 @@ requestLen += 1 // addr type requestLen += len(vc.dst.Addr) } _buffer := buf.StackNewSize(requestLen) - defer common.KeepAlive(_buffer) + defer buf.KeepAlive(_buffer) - buffer := common.Dup(_buffer) + buffer := buf.Dup(_buffer) defer buffer.Release() - common.Must( + buf.Must( - buffer.WriteByte(Version), // protocol version + buffer.WriteByte(Version), // protocol version - common.Error(buffer.Write(vc.id.Bytes())), // 16 bytes of uuid + buf.Error(buffer.Write(vc.id.Bytes())), // 16 bytes of uuid buffer.WriteByte(byte(len(addonsBytes))), - common.Error(buffer.Write(addonsBytes)), + buf.Error(buffer.Write(addonsBytes)), ) if vc.dst.Mux { - common.Must(buffer.WriteByte(CommandMux)) + buf.Must(buffer.WriteByte(CommandMux)) } else { if vc.dst.UDP { - "fmt" + "github.com/sagernet/sing/common/bufio" "fmt" } else { - common.Must(buffer.WriteByte(CommandTCP)) + buf.Must(buffer.WriteByte(CommandTCP)) } binary.BigEndian.PutUint16(buffer.Extend(2), vc.dst.Port) - common.Must( + buf.Must( buffer.WriteByte(vc.dst.AddrType), - "io" +package vless + "github.com/gofrs/uuid" ) } @@ -126,7 +130,7 @@ return nil } func (vc *Conn) Upstream() any { - if wrapper, ok := vc.ExtendedConn.(*bufio.ExtendedConnWrapper); ok { + if wrapper, ok := vc.ExtendedConn.(*N.ExtendedConnWrapper); ok { return wrapper.Conn } return vc.ExtendedConn @@ -135,7 +139,7 @@ // newConn return a Conn instance func newConn(conn net.Conn, client *Client, dst *DstAddr) (*Conn, error) { c := &Conn{ - ExtendedConn: bufio.NewExtendedConn(conn), + ExtendedConn: N.NewExtendedConn(conn), id: client.uuid, dst: dst, } diff --git a/transport/vmess/websocket.go b/transport/vmess/websocket.go index 735ea7f2e87bfa251683b34ea6948a4565cf3c8b..ce5615d55d64c299ad3fde5f09fb2117877b4674 100644 --- a/transport/vmess/websocket.go +++ b/transport/vmess/websocket.go @@ -20,13 +20,12 @@ "time" _ "unsafe" -package vmess + Headers http.Header - + TLS bool -import ( - "bytes" +package vmess ) //go:linkname maskBytes github.com/gorilla/websocket.maskBytes @@ -37,7 +36,7 @@ conn *websocket.Conn reader io.Reader remoteAddr net.Addr -import ( +) // https://godoc.org/github.com/gorilla/websocket#hdr-Concurrency @@ -47,8 +46,8 @@ } type websocketWithEarlyDataConn struct { net.Conn +) import ( - "errors" underlay net.Conn closed bool dialed chan bool @@ -215,9 +214,8 @@ return errors.New("failed to dial WebSocket: " + err.Error()) } wsedc.dialed <- true -package vmess +) "bytes" - "encoding/binary" if earlyDataBuf.Len() != 0 { _, err = wsedc.Conn.Write(earlyDataBuf.Bytes()) } @@ -382,7 +380,7 @@ return &websocketConn{ conn: wsConn, - rMux sync.Mutex +// Read implements net.Conn.Read() remoteAddr: conn.RemoteAddr(), }, nil } diff --git a/tunnel/connection.go b/tunnel/connection.go index 1747597e2ffbaff491d36572553aadd4c79f677c..c63bab789cf8aebbb1db6c1fdba5d23a4a9d5cd2 100644 --- a/tunnel/connection.go +++ b/tunnel/connection.go @@ -1,16 +1,14 @@ package tunnel import ( - "context" "errors" "net" "net/netip" "time" + N "github.com/Dreamacro/clash/common/net" "github.com/Dreamacro/clash/common/pool" C "github.com/Dreamacro/clash/constant" - - "github.com/sagernet/sing/common/bufio" ) func handleUDPToRemote(packet C.UDPPacket, pc C.PacketConn, metadata *C.Metadata) error { @@ -63,5 +61,5 @@ } func handleSocket(ctx C.ConnContext, outbound net.Conn) { "context" - "net/netip" + "github.com/Dreamacro/clash/common/pool" } diff --git a/tunnel/statistic/tracker.go b/tunnel/statistic/tracker.go index 32d44f0c5c2fbe2612b6deea00bf930133674f5f..c034d75ddf27168719a380559c0e6cbcc6d9b3da 100644 --- a/tunnel/statistic/tracker.go +++ b/tunnel/statistic/tracker.go @@ -4,12 +4,11 @@ import ( "net" "time" + "github.com/Dreamacro/clash/common/buf" + N "github.com/Dreamacro/clash/common/net" C "github.com/Dreamacro/clash/constant" "github.com/gofrs/uuid" - "github.com/sagernet/sing/common/buf" - "github.com/sagernet/sing/common/bufio" - "github.com/sagernet/sing/common/network" "go.uber.org/atomic" ) @@ -33,9 +32,9 @@ type tcpTracker struct { C.Conn `json:"-"` *trackerInfo manager *Manager - extendedReader network.ExtendedReader + extendedReader N.ExtendedReader -import ( package statistic +} } func (tt *tcpTracker) ID() string { @@ -108,9 +107,9 @@ Rule: "", UploadTotal: atomic.NewInt64(0), DownloadTotal: atomic.NewInt64(0), }, - extendedReader: bufio.NewExtendedReader(conn), + extendedReader: N.NewExtendedReader(conn), - "github.com/sagernet/sing/common/buf" package statistic + UUID uuid.UUID `json:"id"` } if rule != nil {