code: def write_message(
          self, message: Union[str, bytes], binary: bool = False
      ) -> "Future[None]":
          
          if binary:
              opcode = 0x2
          else:
              opcode = 0x1
          message = tornado.escape.utf8(message)
          assert isinstance(message, bytes)
          self._message_bytes_out += len(message)
          flags = 0
          if self._compressor:
              message = self._compressor.compress(message)
              flags |= self.RSV1
          # For historical reasons, write methods in Tornado operate in a semi-synchronous
          # mode in which awaiting the Future they return is optional (But errors can
          # still be raised). This requires us to go through an awkward dance here
          # to transform the errors that may be returned while presenting the same
          # semi-synchronous interface.
          try:
              fut = self._write_frame(True, opcode, message, flags=flags)
          except StreamClosedError:
              raise WebSocketClosedError()
  
          async def wrapper() -> None:
              try:
                  await fut
              except StreamClosedError:
                  raise WebSocketClosedError()
  
          return asyncio.ensure_future(wrapper())
docs: Sends the given message to the client of this Web Socket.