async def METHOD_NAME(
    self,
    router: Router,
    dest_address: str,
    message: _MessageBase,
    wait: bool = True,
) -> Union[ResultMessage, ErrorMessage, asyncio.Future]:
    client = await self.get_client(router, dest_address)
    loop = asyncio.get_running_loop()
    wait_response = loop.create_future()
    self._client_to_message_futures[client][message.message_id] = wait_response
    with Timer() as timer:
        try:
            await client.send(message)
        except ConnectionError:
            try:
                await client.close()
            except ConnectionError:
                # close failed, ignore it
                pass
            raise ServerClosed(f"Remote server {client.dest_address} closed")
        if not wait:
            r = wait_response
        else:
            r = await wait_response
    ProfilingData.collect_actor_call(message, timer.duration)
    return r