github.com/metacubex/mihomo@v1.18.5/common/callback/close_callback.go (about)

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