#pragma once #include #include #include #include #include #include using HttpGetHandler = std::function; using HttpPostHandler = std::function; using WsFrameHandler = std::function; using WsOpenHandler = std::function; using WsCloseHandler = std::function; struct HttpRoute { std::string uri; httpd_method_t method; HttpGetHandler getHandler; HttpPostHandler postHandler; bool isWebsocket; }; class NativeServer { public: NativeServer(); ~NativeServer(); void config(size_t maxUriHandlers, size_t stackSize, size_t maxUploadSize); esp_err_t listen(uint16_t port); void stop(); void on(const char* uri, httpd_method_t method, HttpGetHandler handler); void on(const char* uri, httpd_method_t method, HttpPostHandler handler); void onWsFrame(WsFrameHandler handler); void onWsOpen(WsOpenHandler handler); void onWsClose(WsCloseHandler handler); void registerWebsocket(const char* uri); esp_err_t wsSend(int sockfd, const uint8_t* data, size_t len); esp_err_t wsSendAll(const uint8_t* data, size_t len); void addWsClient(int sockfd); void removeWsClient(int sockfd); std::vector& getWsClients(); void addDefaultHeader(const char* key, const char* value); httpd_handle_t getHandle() { return server_; } static esp_err_t sendJson(httpd_req_t* req, int status, const char* json); static esp_err_t sendJson(httpd_req_t* req, int status, JsonDocument& doc); static esp_err_t sendError(httpd_req_t* req, int status, const char* message); static esp_err_t sendOk(httpd_req_t* req); private: httpd_handle_t server_ = nullptr; httpd_config_t config_; std::vector routes_; std::map defaultHeaders_; std::vector wsClients_; SemaphoreHandle_t wsMutex_; WsFrameHandler wsFrameHandler_; WsOpenHandler wsOpenHandler_; WsCloseHandler wsCloseHandler_; static esp_err_t httpHandler(httpd_req_t* req); static esp_err_t wsHandler(httpd_req_t* req); void applyDefaultHeaders(httpd_req_t* req); esp_err_t registerRoute(const HttpRoute& route); }; extern NativeServer nativeServer;