code: async def close(self, code: int = 1000, reason: str = "") -> None:
          
          try:
              await asyncio.wait_for(
                  self.write_close_frame(serialize_close(code, reason)),
                  self.close_timeout,
                  loop=self.loop,
              )
          except asyncio.TimeoutError:
              # If the close frame cannot be sent because the send buffers
              # are full, the closing handshake won't complete anyway.
              # Fail the connection to shut down faster.
              self.fail_connection()
  
          # If no close frame is received within the timeout, wait_for() cancels
          # the data transfer task and raises TimeoutError.
  
          # If close() is called multiple times concurrently and one of these
          # calls hits the timeout, the data transfer task will be cancelled.
          # Other calls will receive a CancelledError here.
  
          try:
              # If close() is canceled during the wait, self.transfer_data_task
              # is canceled before the timeout elapses.
              # This helps closing connections when shutting down a server.
              await asyncio.wait_for(
                  self.transfer_data_task, self.close_timeout, loop=self.loop
              )
          except (asyncio.TimeoutError, asyncio.CancelledError):
              pass
  
          # Wait for the close connection task to close the TCP connection.
          await asyncio.shield(self.close_connection_task)
docs: This coroutine performs the closing handshake.
  
          It waits for the other end to complete the handshake and for the TCP
          connection to terminate. As a consequence, there's no need to await
          :meth:`wait_closed`; :meth:`close` already does it.
  
          :meth:`close` is idempotent: it doesn't do anything once the
          connection is closed.
  
          It's safe to wrap this coroutine in :func:`~asyncio.create_task` since
          errors during connection termination aren't particularly useful.
  
          ``code`` must be an :class:`int` and ``reason`` a :class:`str`.