class Sentry::Envelope::Item

@api private

def self.data_category(type)

rate limits and client reports use the data_category rather than envelope item type
def self.data_category(type)
  case type
  when "session", "attachment", "transaction", "profile", "span", "log" then type
  when "sessions" then "session"
  when "check_in" then "monitor"
  when "statsd", "metric_meta" then "metric_bucket"
  when "event" then "error"
  when "client_report" then "internal"
  else "default"
  end
end

def initialize(headers, payload)

def initialize(headers, payload)
  @headers = headers
  @payload = payload
  @type = headers[:type] || "event"
  @data_category = self.class.data_category(type)
  @size_limit = SIZE_LIMITS[type]
end

def reduce_stacktrace!

def reduce_stacktrace!
  if exceptions = payload.dig(:exception, :values) || payload.dig("exception", "values")
    exceptions.each do |exception|
      # in most cases there is only one exception (2 or 3 when have multiple causes), so we won't loop through this double condition much
      traces = exception.dig(:stacktrace, :frames) || exception.dig("stacktrace", "frames")
      if traces && traces.size > STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD
        size_on_both_ends = STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD / 2
        traces.replace(
          traces[0..(size_on_both_ends - 1)] + traces[-size_on_both_ends..-1],
        )
      end
    end
  end
end

def remove_breadcrumbs!

def remove_breadcrumbs!
  if payload.key?(:breadcrumbs)
    payload.delete(:breadcrumbs)
  elsif payload.key?("breadcrumbs")
    payload.delete("breadcrumbs")
  end
end

def serialize

def serialize
  result = to_s
  if result.bytesize > size_limit
    remove_breadcrumbs!
    result = to_s
  end
  if result.bytesize > size_limit
    reduce_stacktrace!
    result = to_s
  end
  [result, result.bytesize > size_limit]
end

def size_breakdown

def size_breakdown
  payload.map do |key, value|
    "#{key}: #{JSON.generate(value).bytesize}"
  end.join(", ")
end

def to_s

def to_s
  [JSON.generate(@headers), @payload.is_a?(String) ? @payload : JSON.generate(@payload)].join("\n")
end