code: async def recv_trailing_metadata(self):
          
          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))
docs: 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.