sing.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package net
  2. import (
  3. "context"
  4. "net"
  5. "runtime"
  6. "github.com/metacubex/mihomo/common/net/deadline"
  7. "github.com/sagernet/sing/common"
  8. "github.com/sagernet/sing/common/bufio"
  9. "github.com/sagernet/sing/common/network"
  10. )
  11. var NewExtendedConn = bufio.NewExtendedConn
  12. var NewExtendedWriter = bufio.NewExtendedWriter
  13. var NewExtendedReader = bufio.NewExtendedReader
  14. type ExtendedConn = network.ExtendedConn
  15. type ExtendedWriter = network.ExtendedWriter
  16. type ExtendedReader = network.ExtendedReader
  17. var WriteBuffer = bufio.WriteBuffer
  18. func NewDeadlineConn(conn net.Conn) ExtendedConn {
  19. if deadline.IsPipe(conn) || deadline.IsPipe(network.UnwrapReader(conn)) {
  20. return NewExtendedConn(conn) // pipe always have correctly deadline implement
  21. }
  22. if deadline.IsConn(conn) || deadline.IsConn(network.UnwrapReader(conn)) {
  23. return NewExtendedConn(conn) // was a *deadline.Conn
  24. }
  25. return deadline.NewConn(conn)
  26. }
  27. func NeedHandshake(conn any) bool {
  28. if earlyConn, isEarlyConn := common.Cast[network.EarlyConn](conn); isEarlyConn && earlyConn.NeedHandshake() {
  29. return true
  30. }
  31. return false
  32. }
  33. type CountFunc = network.CountFunc
  34. var Pipe = deadline.Pipe
  35. // Relay copies between left and right bidirectionally.
  36. func Relay(leftConn, rightConn net.Conn) {
  37. defer runtime.KeepAlive(leftConn)
  38. defer runtime.KeepAlive(rightConn)
  39. _ = bufio.CopyConn(context.TODO(), leftConn, rightConn)
  40. }