From 3507d567cc539edc84062b4efa943e4f7e3ce1ad Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 24 Apr 2026 03:10:17 -0500 Subject: [PATCH] [web_server_idf] Preserve on_connect_ ordering and document main-loop context Pre-refactor, on_connect_ ran after the ctor had already sent the initial ping/config/sorting_groups. Call start_session_main_loop_() before on_connect_ so the callback still observes a primed session. Also document at onConnect() that the callback now runs on the main loop instead of the httpd task. --- esphome/components/web_server_idf/web_server_idf.cpp | 4 +++- esphome/components/web_server_idf/web_server_idf.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/web_server_idf/web_server_idf.cpp b/esphome/components/web_server_idf/web_server_idf.cpp index 22a8094424..b43196ec48 100644 --- a/esphome/components/web_server_idf/web_server_idf.cpp +++ b/esphome/components/web_server_idf/web_server_idf.cpp @@ -532,10 +532,12 @@ void AsyncEventSource::adopt_pending_sessions_main_loop_() { continue; } this->sessions_.push_back(rsp); + // Prime first so on_connect_ observes a session that has already sent its + // initial ping/config/sorting_groups, matching the pre-refactor ordering. + rsp->start_session_main_loop_(); if (this->on_connect_) { this->on_connect_(rsp); } - rsp->start_session_main_loop_(); } } diff --git a/esphome/components/web_server_idf/web_server_idf.h b/esphome/components/web_server_idf/web_server_idf.h index 742a544695..579383b50d 100644 --- a/esphome/components/web_server_idf/web_server_idf.h +++ b/esphome/components/web_server_idf/web_server_idf.h @@ -339,6 +339,8 @@ class AsyncEventSource : public AsyncWebHandler { // NOLINTNEXTLINE(readability-identifier-naming) void handleRequest(AsyncWebServerRequest *request) override; // NOLINTNEXTLINE(readability-identifier-naming) + // Callback runs on the main loop (not the httpd task) after the session's + // initial ping/config/sorting_groups have been sent. void onConnect(connect_handler_t &&cb) { this->on_connect_ = std::move(cb); } void try_send_nodefer(const char *message, const char *event = nullptr, uint32_t id = 0, uint32_t reconnect = 0);