async def recv_trailing_metadata(self):
        """Coroutine to wait for trailers with trailing metadata from the
        server.

        .. note:: This coroutine will be called implicitly at exit from
            this call (context manager's exit), if not called before explicitly.

        May raise :py:class:`~grpclib.exceptions.GRPCError` if server returned
        non-:py:attr:`Status.OK <grpclib.const.Status.OK>` in trailers.

        When this coroutine finishes, you can access received trailing metadata
        by using :py:attr:`trailing_metadata` attribute.
        """
        if not self._end_done:
            raise ProtocolError('Outgoing stream was not ended')

        if (
            not self._cardinality.server_streaming
            and not self._recv_message_count
        ):
            raise ProtocolError('No messages were received before waiting '
                                'for trailing metadata')

        if self._recv_trailing_metadata_done:
            raise ProtocolError('Trailing metadata was already received')

        with self._wrapper:
            headers = await self._stream.recv_headers()
            self._recv_trailing_metadata_done = True

            metadata = decode_metadata(headers)
            metadata, = await self._dispatch.recv_trailing_metadata(metadata)
            self.trailing_metadata = metadata

            self._raise_for_grpc_status(dict(headers))
Coroutine to wait for trailers with trailing metadata from the
        server.

        .. note:: This coroutine will be called implicitly at exit from
            this call (context manager's exit), if not called before explicitly.

        May raise :py:class:`~grpclib.exceptions.GRPCError` if server returned
        non-:py:attr:`Status.OK <grpclib.const.Status.OK>` in trailers.

        When this coroutine finishes, you can access received trailing metadata
        by using :py:attr:`trailing_metadata` attribute.