Liu Song’s Projects


~/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 {