package callback import ( "github.com/Dreamacro/clash/common/buf" N "github.com/Dreamacro/clash/common/net" C "github.com/Dreamacro/clash/constant" ) type firstWriteCallBackConn struct { C.Conn callback func(error) written bool } func (c *firstWriteCallBackConn) Write(b []byte) (n int, err error) { defer func() { if !c.written { c.written = true c.callback(err) } }() return c.Conn.Write(b) } func (c *firstWriteCallBackConn) WriteBuffer(buffer *buf.Buffer) (err error) { defer func() { if !c.written { c.written = true c.callback(err) } }() return c.Conn.WriteBuffer(buffer) } func (c *firstWriteCallBackConn) Upstream() any { return c.Conn } var _ N.ExtendedConn = (*firstWriteCallBackConn)(nil) func NewFirstWriteCallBackConn(c C.Conn, callback func(error)) C.Conn { return &firstWriteCallBackConn{ Conn: c, callback: callback, written: false, } }