21 "Input too small for gRPC message header",
23 "Expected at least 5 bytes, got " + std::to_string(input.size()));
27 bool compressed = (input[0] != 0);
30 uint32_t length = (
static_cast<uint32_t
>(input[1]) << 24) |
31 (
static_cast<uint32_t
>(input[2]) << 16) |
32 (
static_cast<uint32_t
>(input[3]) << 8) |
33 (
static_cast<uint32_t
>(input[4]));
40 "gRPC message exceeds maximum size",
43 ", Got: " + std::to_string(length));
48 if (input.size() < total_size)
52 "Input too small for gRPC message payload",
54 "Expected " + std::to_string(total_size) +
55 " bytes, got " + std::to_string(input.size()));
64 return ok(std::move(msg));
69 std::vector<uint8_t> result;
76 uint32_t length =
static_cast<uint32_t
>(
data.size());
77 result.push_back(
static_cast<uint8_t
>((length >> 24) & 0xFF));
78 result.push_back(
static_cast<uint8_t
>((length >> 16) & 0xFF));
79 result.push_back(
static_cast<uint8_t
>((length >> 8) & 0xFF));
80 result.push_back(
static_cast<uint8_t
>(length & 0xFF));
83 result.insert(result.end(),
data.begin(),
data.end());
90 if (timeout_str.empty())
96 char unit = timeout_str.back();
99 std::string_view num_str = timeout_str.substr(0, timeout_str.size() - 1);
102 auto result = std::from_chars(num_str.data(),
103 num_str.data() + num_str.size(),
106 if (result.ec != std::errc{})
115 return value * 3600000;
117 return value * 60000;
125 return value / 1000000;
133 std::ostringstream oss;
141 if (timeout_ms >= 3600000 && timeout_ms % 3600000 == 0)
143 oss << (timeout_ms / 3600000) <<
"H";
145 else if (timeout_ms >= 60000 && timeout_ms % 60000 == 0)
147 oss << (timeout_ms / 60000) <<
"M";
149 else if (timeout_ms >= 1000 && timeout_ms % 1000 == 0)
151 oss << (timeout_ms / 1000) <<
"S";
155 oss << timeout_ms <<
"m";
gRPC message framing and serialization.
constexpr int invalid_argument
gRPC protocol implementation
constexpr size_t grpc_header_size
gRPC message header size (5 bytes)
constexpr size_t default_max_message_size
Maximum gRPC message size (default 4MB)
auto format_timeout(uint64_t timeout_ms) -> std::string
Format timeout as gRPC timeout string.
auto parse_timeout(std::string_view timeout_str) -> uint64_t
Parse timeout string (e.g., "10S", "100m", "1000u")
@ ok
Not an error; returned on success.
gRPC message with compression flag and payload
static auto parse(std::span< const uint8_t > input) -> Result< grpc_message >
Parse gRPC message from raw bytes.
auto serialize() const -> std::vector< uint8_t >
Serialize message to bytes with length prefix.
std::vector< uint8_t > data
Message payload.
bool compressed
Whether payload is compressed.