rework SSE for String's instead of std::string

This commit is contained in:
Emil Muratov
2024-12-01 22:32:53 +09:00
parent 43e0b5c5a6
commit b09ad98fdd
2 changed files with 19 additions and 14 deletions

View File

@ -25,8 +25,8 @@
using namespace asyncsrv; using namespace asyncsrv;
static std::string generateEventMessage(const char* message, const char* event, uint32_t id, uint32_t reconnect) { static String generateEventMessage(const char* message, const char* event, uint32_t id, uint32_t reconnect) {
std::string str; String str;
size_t len{0}; size_t len{0};
if (message) if (message)
len += strlen(message); len += strlen(message);
@ -96,7 +96,7 @@ static std::string generateEventMessage(const char* message, const char* event,
} }
str += T_data_; str += T_data_;
str.append(lineStart, lineEnd - lineStart); str.concat(lineStart, lineEnd - lineStart);
str += 0xa; // \n str += 0xa; // \n
lineStart = nextLine; lineStart = nextLine;
@ -112,10 +112,10 @@ static std::string generateEventMessage(const char* message, const char* event,
size_t AsyncEventSourceMessage::ack(size_t len, __attribute__((unused)) uint32_t time) { size_t AsyncEventSourceMessage::ack(size_t len, __attribute__((unused)) uint32_t time) {
// If the whole message is now acked... // If the whole message is now acked...
if (_acked + len > _data->size()) { if (_acked + len > _data->length()) {
// Return the number of extra bytes acked (they will be carried on to the next message) // Return the number of extra bytes acked (they will be carried on to the next message)
const size_t extra = _acked + len - _data->size(); const size_t extra = _acked + len - _data->length();
_acked = _data->size(); _acked = _data->length();
return extra; return extra;
} }
// Return that no extra bytes left. // Return that no extra bytes left.
@ -127,11 +127,11 @@ size_t AsyncEventSourceMessage::write(AsyncClient* client) {
if (!client) if (!client)
return 0; return 0;
if (_sent >= _data->size() || !client->canSend()) { if (_sent >= _data->length() || !client->canSend()) {
return 0; return 0;
} }
size_t len = std::min(_data->size() - _sent, client->space()); size_t len = std::min(_data->length() - _sent, client->space());
/* /*
add() would call lwip's tcp_write() under the AsyncTCP hood with apiflags argument. add() would call lwip's tcp_write() under the AsyncTCP hood with apiflags argument.
By default apiflags=ASYNC_WRITE_FLAG_COPY By default apiflags=ASYNC_WRITE_FLAG_COPY
@ -143,7 +143,7 @@ size_t AsyncEventSourceMessage::write(AsyncClient* client) {
So let's just keep it enforced ASYNC_WRITE_FLAG_COPY and keep in mind that there is no zero-copy So let's just keep it enforced ASYNC_WRITE_FLAG_COPY and keep in mind that there is no zero-copy
*/ */
size_t written = client->add(_data->data() + _sent, len, ASYNC_WRITE_FLAG_COPY); // ASYNC_WRITE_FLAG_MORE size_t written = client->add(_data->c_str() + _sent, len, ASYNC_WRITE_FLAG_COPY); // ASYNC_WRITE_FLAG_MORE
_sent += written; _sent += written;
return written; return written;
} }
@ -298,7 +298,7 @@ void AsyncEventSourceClient::close() {
bool AsyncEventSourceClient::send(const char* message, const char* event, uint32_t id, uint32_t reconnect) { bool AsyncEventSourceClient::send(const char* message, const char* event, uint32_t id, uint32_t reconnect) {
if (!connected()) if (!connected())
return false; return false;
return _queueMessage(std::make_shared<std::string>(generateEventMessage(message, event, id, reconnect))); return _queueMessage(std::make_shared<String>(generateEventMessage(message, event, id, reconnect)));
} }
void AsyncEventSourceClient::_runQueue() { void AsyncEventSourceClient::_runQueue() {
@ -397,7 +397,7 @@ size_t AsyncEventSource::avgPacketsWaiting() const {
AsyncEventSource::SendStatus AsyncEventSource::send( AsyncEventSource::SendStatus AsyncEventSource::send(
const char* message, const char* event, uint32_t id, uint32_t reconnect) { const char* message, const char* event, uint32_t id, uint32_t reconnect) {
AsyncEvent_SharedData_t shared_msg = std::make_shared<std::string>(generateEventMessage(message, event, id, reconnect)); AsyncEvent_SharedData_t shared_msg = std::make_shared<String>(generateEventMessage(message, event, id, reconnect));
#ifdef ESP32 #ifdef ESP32
std::lock_guard<std::mutex> lock(_client_queue_lock); std::lock_guard<std::mutex> lock(_client_queue_lock);
#endif #endif

View File

@ -21,7 +21,7 @@
#define ASYNCEVENTSOURCE_H_ #define ASYNCEVENTSOURCE_H_
#include <Arduino.h> #include <Arduino.h>
#include <string>
#ifdef ESP32 #ifdef ESP32
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include <mutex> #include <mutex>
@ -61,7 +61,7 @@ class AsyncEventSourceClient;
using ArEventHandlerFunction = std::function<void(AsyncEventSourceClient* client)>; using ArEventHandlerFunction = std::function<void(AsyncEventSourceClient* client)>;
using ArAuthorizeConnectHandler = ArAuthorizeFunction; using ArAuthorizeConnectHandler = ArAuthorizeFunction;
// shared message object container // shared message object container
using AsyncEvent_SharedData_t = std::shared_ptr<std::string>; using AsyncEvent_SharedData_t = std::shared_ptr<String>;
/** /**
* @brief Async Event Message container with shared message content data * @brief Async Event Message container with shared message content data
@ -76,7 +76,12 @@ class AsyncEventSourceMessage {
public: public:
AsyncEventSourceMessage(AsyncEvent_SharedData_t data) : _data(data) {}; AsyncEventSourceMessage(AsyncEvent_SharedData_t data) : _data(data) {};
AsyncEventSourceMessage(const char* data, size_t len) : _data(std::make_shared<std::string>(data, len)) {}; #ifdef ESP32
AsyncEventSourceMessage(const char* data, size_t len) : _data(std::make_shared<String>(data, len)) {};
#else
// esp8266's String does not have constructor with data/length arguments. Use a concat method here
AsyncEventSourceMessage(const char* data, size_t len) { _data->concat(data, len); };
#endif
/** /**
* @brief acknowledge sending len bytes of data * @brief acknowledge sending len bytes of data