package outbound import ( "encoding/json" "errors" "net" C "github.com/Dreamacro/clash/constant" ) type Base struct { name string addr string tp C.AdapterType udp bool } // Name implements C.ProxyAdapter func (b *Base) Name() string { return b.name } // Type implements C.ProxyAdapter func (b *Base) Type() C.AdapterType { return b.tp } // StreamConn implements C.ProxyAdapter func (b *Base) StreamConn(c net.Conn, metadata *C.Metadata) (net.Conn, error) { return c, errors.New("no support") } // DialUDP implements C.ProxyAdapter func (b *Base) DialUDP(metadata *C.Metadata) (C.PacketConn, error) { return nil, errors.New("no support") } // SupportUDP implements C.ProxyAdapter func (b *Base) SupportUDP() bool { return b.udp } // MarshalJSON implements C.ProxyAdapter func (b *Base) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]string{ "type": b.Type().String(), }) } // Addr implements C.ProxyAdapter func (b *Base) Addr() string { return b.addr } // Unwrap implements C.ProxyAdapter func (b *Base) Unwrap(metadata *C.Metadata) C.Proxy { return nil } func NewBase(name string, addr string, tp C.AdapterType, udp bool) *Base { return &Base{name, addr, tp, udp} } type conn struct { net.Conn chain C.Chain } // Chains implements C.Connection func (c *conn) Chains() C.Chain { return c.chain } // AppendToChains implements C.Connection func (c *conn) AppendToChains(a C.ProxyAdapter) { c.chain = append(c.chain, a.Name()) } func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { return &conn{c, []string{a.Name()}} } type packetConn struct { net.PacketConn chain C.Chain } // Chains implements C.Connection func (c *packetConn) Chains() C.Chain { return c.chain } // AppendToChains implements C.Connection func (c *packetConn) AppendToChains(a C.ProxyAdapter) { c.chain = append(c.chain, a.Name()) } func newPacketConn(pc net.PacketConn, a C.ProxyAdapter) C.PacketConn { return &packetConn{pc, []string{a.Name()}} }