package peer import ( "io" "net" "net/netip" ) type UDPConn interface { ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error) WriteToUDPAddrPort([]byte, netip.AddrPort) (int, error) WriteToUDP([]byte, *net.UDPAddr) (int, error) } type ifWriter io.Writer type udpReader interface { ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error) } type udpWriter interface { WriteToUDPAddrPort([]byte, netip.AddrPort) (int, error) } type mcUDPWriter interface { WriteToUDP([]byte, *net.UDPAddr) (int, error) } type Marshaller interface { Marshal([]byte) []byte } type dataPacketSender interface { SendDataPacket(pkt []byte, peer *remotePeer) RelayDataPacket(pkt []byte, peer, relay *remotePeer) } type controlPacketSender interface { SendControlPacket(pkt Marshaller, peer *remotePeer) RelayControlPacket(pkt Marshaller, peer, relay *remotePeer) } type encryptedPacketSender interface { SendEncryptedDataPacket(pkt []byte, peer *remotePeer) } type controlMsgHandler interface { HandleControlMsg(pkt any) }