17 static constexpr size_t message_frame_length =
20 static MessageLength read_message_frame(
const uint8_t*& data,
size_t& size)
22 auto compressed_flag = serialized::read<CompressedFlag>(data, size);
23 if (compressed_flag >= 1)
25 throw std::logic_error(fmt::format(
26 "gRPC compressed flag has unexpected value {} - currently only "
28 "unencoded gRPC payloads",
31 return ntohl(serialized::read<MessageLength>(data, size));
34 static void write_message_frame(
35 uint8_t*& data,
size_t& size,
size_t message_size)
44 static std::vector<uint8_t> serialise_grpc_message(T proto_data)
46 const auto data_length = proto_data.ByteSizeLong();
47 size_t r_size = ccf::grpc::impl::message_frame_length + data_length;
48 std::vector<uint8_t> msg(r_size);
49 auto r_data = msg.data();
51 ccf::grpc::impl::write_message_frame(r_data, r_size, data_length);
53 if (!proto_data.SerializeToArray(r_data, r_size))
55 throw std::logic_error(fmt::format(
56 "Error serialising protobuf object of type {}, size {}",
57 proto_data.GetTypeName(),
64 static std::vector<uint8_t> serialise_grpc_messages(
65 const std::vector<T>& proto_data)
67 size_t r_size = std::accumulate(
71 [](
size_t current,
const T& data) {
72 return current + impl::message_frame_length + data.ByteSizeLong();
74 std::vector<uint8_t> msgs(r_size);
75 auto r_data = msgs.data();
77 for (
const T& d : proto_data)
79 const auto data_length = d.ByteSizeLong();
80 impl::write_message_frame(r_data, r_size, data_length);
82 if (!d.SerializeToArray(r_data, r_size))
84 throw std::logic_error(fmt::format(
85 "Error serialising protobuf object of type {}, size {}",
90 r_data += data_length;
91 r_size += data_length;
uint8_t CompressedFlag
Definition message.h:14
uint32_t MessageLength
Definition message.h:15
Definition grpc_status.h:98
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:106