// TODO: Documentation func (c *Client) Read() (*packet.Packet, error) { var buf [MaxPacketSize]byte parsed := new(packet.Packet) for { n, err := c.conn.Read(buf[:]) if err != nil { return nil, err } if err = proto.Unmarshal(buf[:n], parsed); err != nil { return nil, err } if an := parsed.GetArrivalNotice().GetPacketID(); an != 0 { c.lock.Lock() delete(c.ensured, an) c.lock.Unlock() continue } if ensure := parsed.GetEnsureArrival(); ensure != 0 { c.Write(&packet.Packet{ ArrivalNotice: &packet.Packet_ArrivalNotice{ PacketID: proto.Uint64(ensure), }, }, false) } return parsed, nil } panic("unreachable") }