docs: def future(self,
                 request_iterator,
                 timeout=None,
                 metadata=None,
                 credentials=None):
          """Asynchronously invokes the underlying RPC on the client.
  
      Args:
        request_iterator: An ASYNC iterator that yields request values for the RPC.
        timeout: An optional duration of time in seconds to allow for the RPC.
                 If None, the timeout is considered infinite.
        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(
                          _utils.WrappedAsyncIterator(request_iterator, self._loop),
                          timeout,
                          metadata,
                          credentials
                      ),
                      self._loop,
                      self._executor)