diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 42df5cc6e..310e744e6 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -168,25 +168,27 @@ char * WebLogService::messagetime(char * out, const uint64_t t, const size_t buf // send to web eventsource void WebLogService::transmit(const QueuedLogMessage & message) { - JsonDocument jsonDocument; + // JsonDocument is PSRAM-backed so its internal node/string pool is on PSRAM + JsonDocument jsonDocument(PSRAM_DOC); JsonObject logEvent = jsonDocument.to(); char time_string[25]; logEvent["t"] = messagetime(time_string, message.uptime_, sizeof(time_string)); - logEvent["l"] = message.level_; // .content_->level; + logEvent["l"] = message.level_; logEvent["i"] = message.id_; - logEvent["n"] = message.name_; // content_->name; - logEvent["m"] = message.text_; // content_->text; + logEvent["n"] = message.name_; + logEvent["m"] = message.text_; - size_t len = measureJson(jsonDocument) + 1; - char * buffer = new char[len]; - if (buffer) { - serializeJson(jsonDocument, buffer, len); - events_.send(buffer, "message", message.id_); - log_message_id_tail_ = message.id_; + // Reuse a PSRAM-backed scratch buffer + const size_t len = measureJson(jsonDocument); + if (scratch_buf_.capacity() < len + 1) { + scratch_buf_.reserve(len + 1); } - delete[] buffer; + scratch_buf_.resize(len); + serializeJson(jsonDocument, scratch_buf_.data(), len + 1); + events_.send(scratch_buf_.c_str(), "message", message.id_); + log_message_id_tail_ = message.id_; } // sets the values after a POST diff --git a/src/web/WebLogService.h b/src/web/WebLogService.h index 6f77d69f2..330a3ed0a 100644 --- a/src/web/WebLogService.h +++ b/src/web/WebLogService.h @@ -71,6 +71,9 @@ class WebLogService : public uuid::log::Handler { unsigned long log_message_id_tail_ = 0; // last event shown on the screen after fetch bool compact_ = true; uuid::log::Level level_ = uuid::log::Level::INFO; + + // PSRAM-backed scratch buffer reused across every SSE log event + stringPSRAM scratch_buf_; }; } // namespace emsesp