code: async def ensure_open(self) -> None:
          
          # Handle cases from most common to least common for performance.
          if self.state is State.OPEN:
              # If self.transfer_data_task exited without a closing handshake,
              # self.close_connection_task may be closing it, going straight
              # from OPEN to CLOSED.
              if self.transfer_data_task.done():
                  await asyncio.shield(self.close_connection_task)
                  raise ConnectionClosed(
                      self.close_code, self.close_reason
                  ) from self.transfer_data_exc
              else:
                  return
  
          if self.state is State.CLOSED:
              raise ConnectionClosed(
                  self.close_code, self.close_reason
              ) from self.transfer_data_exc
  
          if self.state is State.CLOSING:
              # If we started the closing handshake, wait for its completion to
              # get the proper close code and status. self.close_connection_task
              # will complete within 4 or 5 * close_timeout after close(). The
              # CLOSING state also occurs when failing the connection. In that
              # case self.close_connection_task will complete even faster.
              await asyncio.shield(self.close_connection_task)
              raise ConnectionClosed(
                  self.close_code, self.close_reason
              ) from self.transfer_data_exc
  
          # Control may only reach this point in buggy third-party subclasses.
          assert self.state is State.CONNECTING
          raise InvalidState("WebSocket connection isn't established yet")
docs: Check that the WebSocket connection is open.
  
          Raise :exc:`~websockets.exceptions.ConnectionClosed` if it isn't.