diff --git a/common/mux/client.go b/common/mux/client.go index 2f523f70..265e17ed 100644 --- a/common/mux/client.go +++ b/common/mux/client.go @@ -11,6 +11,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -68,7 +69,7 @@ func (c *Client) DialContext(ctx context.Context, network string, destination M. if err != nil { return nil, err } - return bufio.NewUnbindPacketConn(&ClientPacketConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewNetPacketConn(&ClientPacketConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination})), destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } @@ -79,7 +80,7 @@ func (c *Client) ListenPacket(ctx context.Context, destination M.Socksaddr) (net if err != nil { return nil, err } - return &ClientPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}, nil + return deadline.NewPacketConn(&ClientPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream), destination: destination}), nil } func (c *Client) openStream() (net.Conn, error) { diff --git a/common/mux/service.go b/common/mux/service.go index 3dfae46c..9433ba09 100644 --- a/common/mux/service.go +++ b/common/mux/service.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -67,7 +68,7 @@ func newConnection(ctx context.Context, router adapter.Router, errorHandler E.Ha logger.InfoContext(ctx, "inbound multiplex packet connection") packetConn = &ServerPacketAddrConn{ExtendedConn: bufio.NewExtendedConn(stream)} } - hErr := router.RoutePacketConnection(ctx, packetConn, metadata) + hErr := router.RoutePacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(packetConn)), metadata) stream.Close() if hErr != nil { errorHandler.NewError(ctx, hErr) diff --git a/go.mod b/go.mod index 7f663b74..b95295ca 100644 --- a/go.mod +++ b/go.mod @@ -28,10 +28,10 @@ require ( github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 github.com/sagernet/sing v0.2.3 github.com/sagernet/sing-dns v0.1.5-0.20230415085626-111ecf799dfc - github.com/sagernet/sing-shadowsocks v0.2.0 - github.com/sagernet/sing-shadowtls v0.1.0 + github.com/sagernet/sing-shadowsocks v0.2.1 + github.com/sagernet/sing-shadowtls v0.1.1 github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab - github.com/sagernet/sing-vmess v0.1.3 + github.com/sagernet/sing-vmess v0.1.4 github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 github.com/sagernet/utls v0.0.0-20230309024959-6732c2ab36f2 diff --git a/go.sum b/go.sum index 7f51d33c..c716c7bd 100644 --- a/go.sum +++ b/go.sum @@ -117,14 +117,14 @@ github.com/sagernet/sing v0.2.3 h1:V50MvZ4c3Iij2lYFWPlzL1PyipwSzjGeN9x+Ox89vpk= github.com/sagernet/sing v0.2.3/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= github.com/sagernet/sing-dns v0.1.5-0.20230415085626-111ecf799dfc h1:hmbuqKv48SAjiKPoqtJGvS5pEHVPZjTHq9CPwQY2cZ4= github.com/sagernet/sing-dns v0.1.5-0.20230415085626-111ecf799dfc/go.mod h1:ZKuuqgsHRxDahYrzgSgy4vIAGGuKPlIf4hLcNzYzLkY= -github.com/sagernet/sing-shadowsocks v0.2.0 h1:ILDWL7pwWfkPLEbviE/MyCgfjaBmJY/JVVY+5jhSb58= -github.com/sagernet/sing-shadowsocks v0.2.0/go.mod h1:ysYzszRLpNzJSorvlWRMuzU6Vchsp7sd52q+JNY4axw= -github.com/sagernet/sing-shadowtls v0.1.0 h1:05MYce8aR5xfKIn+y7xRFsdKhKt44QZTSEQW+lG5IWQ= -github.com/sagernet/sing-shadowtls v0.1.0/go.mod h1:Kn1VUIprdkwCgkS6SXYaLmIpKzQbqBIKJBMY+RvBhYc= +github.com/sagernet/sing-shadowsocks v0.2.1 h1:FvdLQOqpvxHBJUcUe4fvgiYP2XLLwH5i1DtXQviVEPw= +github.com/sagernet/sing-shadowsocks v0.2.1/go.mod h1:T/OgurSjsAe+Ug3+6PprXjmgHFmJidjOvQcjXGTKb3I= +github.com/sagernet/sing-shadowtls v0.1.1 h1:Gf8YD/4zCjfM9xxVzI0QVYAnjMCtsDHcIp84CUdY3VA= +github.com/sagernet/sing-shadowtls v0.1.1/go.mod h1:espnHDPRQeG95ZoU3xfHDFnc6Nt4GvbbuPV2okN+x/E= github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab h1:a9oeWuPBuIZ70qMhIIH6RrYhp886xN9jJIwsuu4ZFUo= github.com/sagernet/sing-tun v0.1.4-0.20230326080954-8848c0e4cbab/go.mod h1:4YxIDEkkCjGXDOTMPw1SXpLmCQUFAWuaQN250oo+928= -github.com/sagernet/sing-vmess v0.1.3 h1:q/+tsF46dvvapL6CpQBgPHJ6nQrDUZqEtLHCbsjO7iM= -github.com/sagernet/sing-vmess v0.1.3/go.mod h1:GVXqAHwe9U21uS+Voh4YBIrADQyE4F9v0ayGSixSQAE= +github.com/sagernet/sing-vmess v0.1.4 h1:aZ03KgmR9COPitVqo8NTPHeaHmbJYDZ8mkumnUV4oGQ= +github.com/sagernet/sing-vmess v0.1.4/go.mod h1:NensKZJDgfPsUf3TzFD8kTuzI3CQfN1Tj3Eygti5Isg= github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 h1:HuE6xSwco/Xed8ajZ+coeYLmioq0Qp1/Z2zczFaV8as= github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37/go.mod h1:3skNSftZDJWTGVtVaM2jfbce8qHnmH/AGDRe62iNOg0= github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 h1:2ItpW1nMNkPzmBTxV0/eClCklHrFSQMnUGcpUmJxVeE= diff --git a/inbound/vless.go b/inbound/vless.go index d4c00f76..02b0bd1b 100644 --- a/inbound/vless.go +++ b/inbound/vless.go @@ -16,6 +16,7 @@ import ( "github.com/sagernet/sing-vmess/packetaddr" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/auth" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" M "github.com/sagernet/sing/common/metadata" @@ -171,7 +172,7 @@ func (h *VLESS) newPacketConnection(ctx context.Context, conn N.PacketConn, meta } if metadata.Destination.Fqdn == packetaddr.SeqPacketMagicAddress { metadata.Destination = M.Socksaddr{} - conn = packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination) + conn = deadline.NewPacketConn(packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination)) h.logger.InfoContext(ctx, "[", user, "] inbound packet addr connection") } else { h.logger.InfoContext(ctx, "[", user, "] inbound packet connection to ", metadata.Destination) diff --git a/inbound/vmess.go b/inbound/vmess.go index 69552162..f7581c0d 100644 --- a/inbound/vmess.go +++ b/inbound/vmess.go @@ -15,6 +15,7 @@ import ( "github.com/sagernet/sing-vmess/packetaddr" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/auth" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" M "github.com/sagernet/sing/common/metadata" @@ -179,7 +180,7 @@ func (h *VMess) newPacketConnection(ctx context.Context, conn N.PacketConn, meta } if metadata.Destination.Fqdn == packetaddr.SeqPacketMagicAddress { metadata.Destination = M.Socksaddr{} - conn = packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination) + conn = deadline.NewPacketConn(packetaddr.NewConn(conn.(vmess.PacketConn), metadata.Destination)) h.logger.InfoContext(ctx, "[", user, "] inbound packet addr connection") } else { h.logger.InfoContext(ctx, "[", user, "] inbound packet connection to ", metadata.Destination) diff --git a/outbound/shadowsocksr.go b/outbound/shadowsocksr.go index f2a172fb..3ce9640a 100644 --- a/outbound/shadowsocksr.go +++ b/outbound/shadowsocksr.go @@ -127,7 +127,7 @@ func (h *ShadowsocksR) DialContext(ctx context.Context, network string, destinat if err != nil { return nil, err } - return &bufio.BindPacketConn{PacketConn: conn, Addr: destination}, nil + return bufio.NewBindPacketConn(conn, destination), nil default: return nil, E.Extend(N.ErrUnknownNetwork, network) } diff --git a/transport/trojan/mux.go b/transport/trojan/mux.go index 745cde56..b5ecb316 100644 --- a/transport/trojan/mux.go +++ b/transport/trojan/mux.go @@ -4,6 +4,8 @@ import ( "context" "net" + "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" "github.com/sagernet/sing/common/rw" @@ -53,7 +55,7 @@ func newMuxConnection0(ctx context.Context, stream net.Conn, metadata M.Metadata case CommandTCP: return handler.NewConnection(ctx, stream, metadata) case CommandUDP: - return handler.NewPacketConnection(ctx, &PacketConn{stream}, metadata) + return handler.NewPacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(&PacketConn{stream})), metadata) default: return E.New("unknown command ", command) } diff --git a/transport/trojan/service.go b/transport/trojan/service.go index 453423d2..d4d26d5e 100644 --- a/transport/trojan/service.go +++ b/transport/trojan/service.go @@ -8,6 +8,7 @@ import ( "github.com/sagernet/sing/common/auth" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -106,7 +107,7 @@ func (s *Service[K]) NewConnection(ctx context.Context, conn net.Conn, metadata case CommandTCP: return s.handler.NewConnection(ctx, conn, metadata) case CommandUDP: - return s.handler.NewPacketConnection(ctx, &PacketConn{conn}, metadata) + return s.handler.NewPacketConnection(ctx, deadline.NewPacketConn(bufio.NewNetPacketConn(&PacketConn{conn})), metadata) // case CommandMux: default: return HandleMuxConnection(ctx, conn, metadata, s.handler) diff --git a/transport/v2raygrpc/client.go b/transport/v2raygrpc/client.go index d4f24987..7e605a68 100644 --- a/transport/v2raygrpc/client.go +++ b/transport/v2raygrpc/client.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -107,5 +108,5 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { cancel(err) return nil, err } - return NewGRPCConn(stream, cancel), nil + return deadline.NewConn(NewGRPCConn(stream, cancel)), nil } diff --git a/transport/v2raygrpc/server.go b/transport/v2raygrpc/server.go index 15088b26..7073eb08 100644 --- a/transport/v2raygrpc/server.go +++ b/transport/v2raygrpc/server.go @@ -11,6 +11,7 @@ import ( "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -66,7 +67,7 @@ func (s *Server) Tun(server GunService_TunServer) error { } } } - go s.handler.NewConnection(ctx, conn, metadata) + go s.handler.NewConnection(ctx, deadline.NewConn(conn), metadata) <-ctx.Done() return nil } diff --git a/transport/v2raygrpclite/client.go b/transport/v2raygrpclite/client.go index 369d0bb2..107f574c 100644 --- a/transport/v2raygrpclite/client.go +++ b/transport/v2raygrpclite/client.go @@ -13,6 +13,7 @@ import ( "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/transport/v2rayhttp" + "github.com/sagernet/sing/common/bufio/deadline" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -92,7 +93,7 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { conn.setup(nil, err) } }() - return conn, nil + return deadline.NewConn(conn), nil } func (c *Client) Close() error { diff --git a/transport/v2raygrpclite/conn.go b/transport/v2raygrpclite/conn.go index 7906fcdb..6f6fe0aa 100644 --- a/transport/v2raygrpclite/conn.go +++ b/transport/v2raygrpclite/conn.go @@ -145,28 +145,13 @@ func (c *GunConn) RemoteAddr() net.Addr { } func (c *GunConn) SetDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetWriteDeadline(time.Time) error - }); loaded { - return responseWriter.SetWriteDeadline(t) - } return os.ErrInvalid } func (c *GunConn) SetReadDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetReadDeadline(time.Time) error - }); loaded { - return responseWriter.SetReadDeadline(t) - } return os.ErrInvalid } func (c *GunConn) SetWriteDeadline(t time.Time) error { - if responseWriter, loaded := c.writer.(interface { - SetWriteDeadline(time.Time) error - }); loaded { - return responseWriter.SetWriteDeadline(t) - } return os.ErrInvalid } diff --git a/transport/v2raygrpclite/server.go b/transport/v2raygrpclite/server.go index 18809ee4..2d6687fe 100644 --- a/transport/v2raygrpclite/server.go +++ b/transport/v2raygrpclite/server.go @@ -15,6 +15,7 @@ import ( "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-box/transport/v2rayhttp" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -80,7 +81,7 @@ func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) { var metadata M.Metadata metadata.Source = sHttp.SourceAddress(request) conn := v2rayhttp.NewHTTP2Wrapper(newGunConn(request.Body, writer, writer.(http.Flusher))) - s.handler.NewConnection(request.Context(), conn, metadata) + s.handler.NewConnection(request.Context(), deadline.NewConn(conn), metadata) conn.CloseWrapper() } diff --git a/transport/v2raywebsocket/client.go b/transport/v2raywebsocket/client.go index 18fca276..f61d0c90 100644 --- a/transport/v2raywebsocket/client.go +++ b/transport/v2raywebsocket/client.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/tls" "github.com/sagernet/sing-box/option" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -78,11 +79,11 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { if c.maxEarlyData <= 0 { conn, response, err := c.dialer.DialContext(ctx, c.uri, c.headers) if err == nil { - return &WebsocketConn{Conn: conn, Writer: NewWriter(conn, false)}, nil + return deadline.NewConn(&WebsocketConn{Conn: conn, Writer: NewWriter(conn, false)}), nil } return nil, wrapDialError(response, err) } else { - return &EarlyWebsocketConn{Client: c, ctx: ctx, create: make(chan struct{})}, nil + return deadline.NewConn(&EarlyWebsocketConn{Client: c, ctx: ctx, create: make(chan struct{})}), nil } } diff --git a/transport/v2raywebsocket/server.go b/transport/v2raywebsocket/server.go index 47dee8fc..b669bdd1 100644 --- a/transport/v2raywebsocket/server.go +++ b/transport/v2raywebsocket/server.go @@ -16,6 +16,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -104,7 +105,7 @@ func (s *Server) ServeHTTP(writer http.ResponseWriter, request *http.Request) { if len(earlyData) > 0 { conn = bufio.NewCachedConn(conn, buf.As(earlyData)) } - s.handler.NewConnection(request.Context(), conn, metadata) + s.handler.NewConnection(request.Context(), deadline.NewConn(conn), metadata) } func (s *Server) fallbackRequest(ctx context.Context, writer http.ResponseWriter, request *http.Request, statusCode int, err error) { diff --git a/transport/vless/client.go b/transport/vless/client.go index 1a5885b7..5296aec9 100644 --- a/transport/vless/client.go +++ b/transport/vless/client.go @@ -8,6 +8,8 @@ import ( "github.com/sagernet/sing-vmess" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" + "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" M "github.com/sagernet/sing/common/metadata" @@ -46,30 +48,30 @@ func (c *Client) prepareConn(conn net.Conn) (net.Conn, error) { return conn, nil } -func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) { +func (c *Client) DialConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) { vConn, err := c.prepareConn(conn) if err != nil { return nil, err } serverConn := &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow} - return serverConn, common.Error(serverConn.Write(nil)) + return deadline.NewConn(serverConn), common.Error(serverConn.Write(nil)) } -func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (*Conn, error) { +func (c *Client) DialEarlyConn(conn net.Conn, destination M.Socksaddr) (net.Conn, error) { vConn, err := c.prepareConn(conn) if err != nil { return nil, err } - return &Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}, nil + return deadline.NewConn(&Conn{Conn: conn, protocolConn: vConn, key: c.key, command: vmess.CommandTCP, destination: destination, flow: c.flow}), nil } -func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) { +func (c *Client) DialPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { serverConn := &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow} - return serverConn, common.Error(serverConn.Write(nil)) + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewPacketConn(serverConn)), destination), common.Error(serverConn.Write(nil)) } -func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (*PacketConn, error) { - return &PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow}, nil +func (c *Client) DialEarlyPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { + return bufio.NewBindPacketConn(deadline.NewPacketConn(bufio.NewPacketConn(&PacketConn{Conn: conn, key: c.key, destination: destination, flow: c.flow})), destination), nil } func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { @@ -78,11 +80,11 @@ func (c *Client) DialXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vme if err != nil { return nil, err } - return vmess.NewXUDPConn(serverConn, destination), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(vmess.NewXUDPConn(serverConn, destination)), destination), nil } func (c *Client) DialEarlyXUDPPacketConn(conn net.Conn, destination M.Socksaddr) (vmess.PacketConn, error) { - return vmess.NewXUDPConn(&Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}, destination), nil + return bufio.NewBindPacketConn(deadline.NewPacketConn(vmess.NewXUDPConn(&Conn{Conn: conn, protocolConn: conn, key: c.key, command: vmess.CommandMux, destination: destination, flow: c.flow}, destination)), destination), nil } var _ N.EarlyConn = (*Conn)(nil) diff --git a/transport/vless/service.go b/transport/vless/service.go index 878feeec..a06e9fcd 100644 --- a/transport/vless/service.go +++ b/transport/vless/service.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing/common/auth" "github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" M "github.com/sagernet/sing/common/metadata" @@ -89,7 +90,7 @@ func (s *Service[T]) NewConnection(ctx context.Context, conn net.Conn, metadata case vmess.CommandTCP: return s.handler.NewConnection(ctx, &serverConn{Conn: conn, responseWriter: responseWriter}, metadata) case vmess.CommandUDP: - return s.handler.NewPacketConnection(ctx, &serverPacketConn{ExtendedConn: bufio.NewExtendedConn(conn), destination: request.Destination}, metadata) + return s.handler.NewPacketConnection(ctx, deadline.NewPacketConn(&serverPacketConn{ExtendedConn: bufio.NewExtendedConn(conn), destination: request.Destination}), metadata) case vmess.CommandMux: return vmess.HandleMuxConnection(ctx, &serverConn{Conn: conn, responseWriter: responseWriter}, s.handler) default: