async def METHOD_NAME(
    self, packet_type: PacketType, packet_data: Optional[dict[str, T_PACKET_DATA]] = None
) -> Packet:
    packet_id = self._get_packet_id()
    packet = Packet(
        id=packet_id, type=packet_type, data=({} if packet_data is None else packet_data)
    )
    self._waiting[packet.id] = asyncio.Future[Packet]()
    await self._send(packet)
    return await self._waiting[packet.id]