From 69a2609d58e98d7c7f64c1096ad89eefc6df6f15 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Apr 2026 11:02:15 -1000 Subject: [PATCH 1/3] [api] Reuse total_calculated_size in encode_to_buffer return and resize --- esphome/components/api/api_connection.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index f12141e197a..4e0663d7f48 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -2033,8 +2033,7 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode // Batch message second or later // Reserve for full message, resize to include footer gap + header padding + payload size_t current_size = shared_buf.size(); - shared_buf.reserve_and_resize(current_size + total_calculated_size, - current_size + footer_size + header_padding + calculated_size); + shared_buf.resize(current_size + total_calculated_size); write_start = shared_buf.size() - calculated_size; } @@ -2042,7 +2041,7 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode encode_fn(msg, buffer); // Return total size (header + payload + footer) - return static_cast(header_padding + calculated_size + footer_size); + return static_cast(total_calculated_size); } bool APIConnection::send_buffer(ProtoWriteBuffer buffer, uint8_t message_type) { const bool is_log_message = (message_type == SubscribeLogsResponse::MESSAGE_TYPE); From 7afae4ece3439eabb2c35223093d1bfce0fbba97 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Apr 2026 11:08:06 -1000 Subject: [PATCH 2/3] reduce --- esphome/components/api/api_connection.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 4e0663d7f48..220a254a88f 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -2027,17 +2027,14 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode if (conn->flags_.batch_first_message) { // First message - buffer already prepared by caller, just clear flag conn->flags_.batch_first_message = false; - write_start = shared_buf.size(); - shared_buf.resize(write_start + calculated_size); + shared_buf.resize(shared_buf.size() + calculated_size); } else { // Batch message second or later // Reserve for full message, resize to include footer gap + header padding + payload - size_t current_size = shared_buf.size(); - shared_buf.resize(current_size + total_calculated_size); - write_start = shared_buf.size() - calculated_size; + shared_buf.resize(shared_buf.size() + total_calculated_size); } - ProtoWriteBuffer buffer{&shared_buf, write_start}; + ProtoWriteBuffer buffer{&shared_buf, shared_buf.size() - calculated_size}; encode_fn(msg, buffer); // Return total size (header + payload + footer) From d48ec524461535abbb048b9de1cea6084034aed4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 1 Apr 2026 11:10:12 -1000 Subject: [PATCH 3/3] reduce --- esphome/components/api/api_connection.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 220a254a88f..18aa88fc1cd 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -2023,17 +2023,18 @@ uint16_t APIConnection::encode_to_buffer(uint32_t calculated_size, MessageEncode auto &shared_buf = conn->parent_->get_shared_buffer_ref(); - size_t write_start; + size_t to_add; if (conn->flags_.batch_first_message) { // First message - buffer already prepared by caller, just clear flag conn->flags_.batch_first_message = false; - shared_buf.resize(shared_buf.size() + calculated_size); + to_add = calculated_size; } else { // Batch message second or later // Reserve for full message, resize to include footer gap + header padding + payload - shared_buf.resize(shared_buf.size() + total_calculated_size); + to_add = total_calculated_size; } + shared_buf.resize(shared_buf.size() + to_add); ProtoWriteBuffer buffer{&shared_buf, shared_buf.size() - calculated_size}; encode_fn(msg, buffer);