close_callback.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package callback
  2. import (
  3. "sync"
  4. C "github.com/metacubex/mihomo/constant"
  5. )
  6. type closeCallbackConn struct {
  7. C.Conn
  8. closeFunc func()
  9. closeOnce sync.Once
  10. }
  11. func (w *closeCallbackConn) Close() error {
  12. w.closeOnce.Do(w.closeFunc)
  13. return w.Conn.Close()
  14. }
  15. func (w *closeCallbackConn) ReaderReplaceable() bool {
  16. return true
  17. }
  18. func (w *closeCallbackConn) WriterReplaceable() bool {
  19. return true
  20. }
  21. func (w *closeCallbackConn) Upstream() any {
  22. return w.Conn
  23. }
  24. func NewCloseCallbackConn(conn C.Conn, callback func()) C.Conn {
  25. return &closeCallbackConn{Conn: conn, closeFunc: callback}
  26. }
  27. type closeCallbackPacketConn struct {
  28. C.PacketConn
  29. closeFunc func()
  30. closeOnce sync.Once
  31. }
  32. func (w *closeCallbackPacketConn) Close() error {
  33. w.closeOnce.Do(w.closeFunc)
  34. return w.PacketConn.Close()
  35. }
  36. func (w *closeCallbackPacketConn) ReaderReplaceable() bool {
  37. return true
  38. }
  39. func (w *closeCallbackPacketConn) WriterReplaceable() bool {
  40. return true
  41. }
  42. func (w *closeCallbackPacketConn) Upstream() any {
  43. return w.PacketConn
  44. }
  45. func NewCloseCallbackPacketConn(conn C.PacketConn, callback func()) C.PacketConn {
  46. return &closeCallbackPacketConn{PacketConn: conn, closeFunc: callback}
  47. }