class Sentry::Envelope::Item

def initialize(headers, payload)

def initialize(headers, payload)
  @headers = headers
  @payload = payload
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 > MAX_SERIALIZED_PAYLOAD_SIZE
    remove_breadcrumbs!
    result = to_s
  end
  if result.bytesize > MAX_SERIALIZED_PAYLOAD_SIZE
    reduce_stacktrace!
    result = to_s
  end
  [result, result.bytesize > MAX_SERIALIZED_PAYLOAD_SIZE]
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), JSON.generate(@payload)].join("\n")
end

def type

def type
  @headers[:type] || 'event'
end