package main import ( "encoding/binary" "io" "net" "time" ) type Client struct { *TCPClientMux } func Dial(address string) (*Client, error) { conn, err := net.Dial("tcp", address) if err != nil { return nil, err } client := &Client{ TCPClientMux: NewTCPClientMux(conn), } return client, nil } func (c *Client) Close() { c.Conn.Close() } type TCPClientMux struct { net.Conn *PacketQueue } func NewTCPClientMux(connection net.Conn) *TCPClientMux { return &TCPClientMux{ Conn: connection, PacketQueue: NewPacketQueue(connection), } } func (m *TCPClientMux) Close() { m.Conn.Close() } func (m *TCPClientMux) SendPacket(messageType uint16, data []byte) error { err := binary.Write(m.Conn, binary.LittleEndian, Packet{ Version: 1, MessageType: messageType, DataLength: uint16(len(data)), }) if err != nil { return err } _, err = m.Conn.Write(data) return err } func (m *TCPClientMux) SendPacketFn(messageType uint16, datafn func(w io.Writer) error) error { data, err := GetData(datafn) if err != nil { return err } return m.SendPacket(messageType, data) } func (m *TCPClientMux) Call(messageType uint16, responseType uint16, data []byte) ([]byte, error) { err := m.SendPacket(messageType, data) if err != nil { return nil, err } packet, err := m.Expect(responseType, time.Second) if err != nil { return nil, err } return packet.Data, nil }