package net import ( "context" "net" "runtime" "github.com/metacubex/mihomo/common/net/deadline" "github.com/metacubex/sing/common" "github.com/metacubex/sing/common/bufio" "github.com/metacubex/sing/common/network" ) var NewExtendedConn = bufio.NewExtendedConn var NewExtendedWriter = bufio.NewExtendedWriter var NewExtendedReader = bufio.NewExtendedReader type ExtendedConn = network.ExtendedConn type ExtendedWriter = network.ExtendedWriter type ExtendedReader = network.ExtendedReader var WriteBuffer = bufio.WriteBuffer type ReadWaitOptions = network.ReadWaitOptions var NewReadWaitOptions = network.NewReadWaitOptions type ReaderWithUpstream = network.ReaderWithUpstream type WithUpstreamReader = network.WithUpstreamReader type WriterWithUpstream = network.WriterWithUpstream type WithUpstreamWriter = network.WithUpstreamWriter type WithUpstream = common.WithUpstream var UnwrapReader = network.UnwrapReader var UnwrapWriter = network.UnwrapWriter func NewDeadlineConn(conn net.Conn) ExtendedConn { if deadline.IsPipe(conn) || deadline.IsPipe(UnwrapReader(conn)) { return NewExtendedConn(conn) // pipe always have correctly deadline implement } if deadline.IsConn(conn) || deadline.IsConn(UnwrapReader(conn)) { return NewExtendedConn(conn) // was a *deadline.Conn } return deadline.NewConn(conn) } func NeedHandshake(conn any) bool { if earlyConn, isEarlyConn := common.Cast[network.EarlyConn](conn); isEarlyConn && earlyConn.NeedHandshake() { return true } return false } type CountFunc = network.CountFunc var Pipe = deadline.Pipe // Relay copies between left and right bidirectionally. func Relay(leftConn, rightConn net.Conn) { defer runtime.KeepAlive(leftConn) defer runtime.KeepAlive(rightConn) _ = bufio.CopyConn(context.TODO(), leftConn, rightConn) }