code: def decode(self, frame: Frame, *, max_size: Optional[int] = None) -> Frame:
          
          # Skip control frames.
          if frame.opcode in CTRL_OPCODES:
              return frame
  
          # Handle continuation data frames:
          # - skip if the initial data frame wasn't encoded
          # - reset "decode continuation data" flag if it's a final frame
          if frame.opcode == OP_CONT:
              if not self.decode_cont_data:
                  return frame
              if frame.fin:
                  self.decode_cont_data = False
  
          # Handle text and binary data frames:
          # - skip if the frame isn't encoded
          # - set "decode continuation data" flag if it's a non-final frame
          else:
              if not frame.rsv1:
                  return frame
              if not frame.fin:  # frame.rsv1 is True at this point
                  self.decode_cont_data = True
  
              # Re-initialize per-message decoder.
              if self.remote_no_context_takeover:
                  self.decoder = zlib.decompressobj(wbits=-self.remote_max_window_bits)
  
          # Uncompress compressed frames. Protect against zip bombs by
          # preventing zlib from decompressing more than max_length bytes
          # (except when the limit is disabled with max_size = None).
          data = frame.data
          if frame.fin:
              data += _EMPTY_UNCOMPRESSED_BLOCK
          max_length = 0 if max_size is None else max_size
          data = self.decoder.decompress(data, max_length)
          if self.decoder.unconsumed_tail:
              raise PayloadTooBig(
                  f"Uncompressed payload length exceeds size limit (? > {max_size} bytes)"
              )
  
          # Allow garbage collection of the decoder if it won't be reused.
          if frame.fin and self.remote_no_context_takeover:
              del self.decoder
  
          return frame._replace(data=data, rsv1=False)
docs: Decode an incoming frame.