docs: def future(self, request, timeout=None, metadata=None, credentials=None):
          """Asynchronously invokes the underlying RPC.
  
      Args:
        request: The request value for the RPC.
        timeout: An optional duration of time in seconds to allow for the RPC.
        metadata: Optional :term:`metadata` to be transmitted to the
          service-side of the RPC.
        credentials: An optional CallCredentials for the RPC.
  
      Returns:
          An object that is both a Call for the RPC and a Future. In the event of
          RPC completion, the return Call-Future's result value will be the
          response message of the RPC. Should the event terminate with non-OK
          status, the returned Call-Future's exception value will be an RpcError.
      """
          return _utils.wrap_future_call(self._inner.future(request, timeout, metadata, credentials),
                                         self._loop, self._executor)