callback.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package callback
  2. import (
  3. "github.com/metacubex/mihomo/common/buf"
  4. N "github.com/metacubex/mihomo/common/net"
  5. C "github.com/metacubex/mihomo/constant"
  6. )
  7. type firstWriteCallBackConn struct {
  8. C.Conn
  9. callback func(error)
  10. written bool
  11. }
  12. func (c *firstWriteCallBackConn) Write(b []byte) (n int, err error) {
  13. defer func() {
  14. if !c.written {
  15. c.written = true
  16. c.callback(err)
  17. }
  18. }()
  19. return c.Conn.Write(b)
  20. }
  21. func (c *firstWriteCallBackConn) WriteBuffer(buffer *buf.Buffer) (err error) {
  22. defer func() {
  23. if !c.written {
  24. c.written = true
  25. c.callback(err)
  26. }
  27. }()
  28. return c.Conn.WriteBuffer(buffer)
  29. }
  30. func (c *firstWriteCallBackConn) Upstream() any {
  31. return c.Conn
  32. }
  33. func (c *firstWriteCallBackConn) WriterReplaceable() bool {
  34. return c.written
  35. }
  36. func (c *firstWriteCallBackConn) ReaderReplaceable() bool {
  37. return true
  38. }
  39. var _ N.ExtendedConn = (*firstWriteCallBackConn)(nil)
  40. func NewFirstWriteCallBackConn(c C.Conn, callback func(error)) C.Conn {
  41. return &firstWriteCallBackConn{
  42. Conn: c,
  43. callback: callback,
  44. written: false,
  45. }
  46. }