module ActiveSupport::Messages::Metadata

def deserialize_with_metadata(message, **expected_metadata)

def deserialize_with_metadata(message, **expected_metadata)
  if dual_serialized_metadata_envelope_json?(message)
    envelope = deserialize_from_json(message)
    extracted = extract_from_metadata_envelope(envelope, **expected_metadata)
    deserialize_from_json_safe_string(extracted["message"])
  else
    deserialized = deserialize(message)
    if metadata_envelope?(deserialized)
      extract_from_metadata_envelope(deserialized, **expected_metadata)["data"]
    elsif expected_metadata.none? { |k, v| v }
      deserialized
    else
      throw :invalid_message_content, "missing metadata"
    end
  end
end