| # SSEClient - Server-Sent Events Client |
| |
| A simple, EventSource-like SSE client for C++11. |
| |
| ## Features |
| |
| - **Auto-reconnect**: Automatically reconnects on connection loss |
| - **Last-Event-ID**: Sends last received ID on reconnect for resumption |
| - **retry field**: Respects server's reconnect interval |
| - **Event types**: Supports custom event types via `on_event()` |
| - **Async support**: Run in background thread with `start_async()` |
| - **C++11 compatible**: No C++14/17/20 features required |
| |
| ## Quick Start |
| |
| ```cpp |
| httplib::Client cli("http://localhost:8080"); |
| httplib::sse::SSEClient sse(cli, "/events"); |
| |
| sse.on_message([](const httplib::sse::SSEMessage &msg) { |
| std::cout << "Event: " << msg.event << std::endl; |
| std::cout << "Data: " << msg.data << std::endl; |
| }); |
| |
| sse.start(); // Blocking, with auto-reconnect |
| ``` |
| |
| ## API Reference |
| |
| ### SSEMessage |
| |
| ```cpp |
| struct SSEMessage { |
| std::string event; // Event type (default: "message") |
| std::string data; // Event payload |
| std::string id; // Event ID |
| }; |
| ``` |
| |
| ### SSEClient |
| |
| #### Constructor |
| |
| ```cpp |
| // Basic |
| SSEClient(Client &client, const std::string &path); |
| |
| // With custom headers |
| SSEClient(Client &client, const std::string &path, const Headers &headers); |
| ``` |
| |
| #### Event Handlers |
| |
| ```cpp |
| // Called for all events (or events without a specific handler) |
| sse.on_message([](const SSEMessage &msg) { }); |
| |
| // Called for specific event types |
| sse.on_event("update", [](const SSEMessage &msg) { }); |
| sse.on_event("delete", [](const SSEMessage &msg) { }); |
| |
| // Called when connection is established |
| sse.on_open([]() { }); |
| |
| // Called on connection errors |
| sse.on_error([](httplib::Error err) { }); |
| ``` |
| |
| #### Configuration |
| |
| ```cpp |
| // Set reconnect interval (default: 3000ms) |
| sse.set_reconnect_interval(5000); |
| |
| // Set max reconnect attempts (default: 0 = unlimited) |
| sse.set_max_reconnect_attempts(10); |
| ``` |
| |
| #### Control |
| |
| ```cpp |
| // Blocking start with auto-reconnect |
| sse.start(); |
| |
| // Non-blocking start (runs in background thread) |
| sse.start_async(); |
| |
| // Stop the client (thread-safe) |
| sse.stop(); |
| ``` |
| |
| #### State |
| |
| ```cpp |
| bool connected = sse.is_connected(); |
| const std::string &id = sse.last_event_id(); |
| ``` |
| |
| ## Examples |
| |
| ### Basic Usage |
| |
| ```cpp |
| httplib::Client cli("http://localhost:8080"); |
| httplib::sse::SSEClient sse(cli, "/events"); |
| |
| sse.on_message([](const httplib::sse::SSEMessage &msg) { |
| std::cout << msg.data << std::endl; |
| }); |
| |
| sse.start(); |
| ``` |
| |
| ### With Custom Event Types |
| |
| ```cpp |
| httplib::sse::SSEClient sse(cli, "/events"); |
| |
| sse.on_event("notification", [](const httplib::sse::SSEMessage &msg) { |
| std::cout << "Notification: " << msg.data << std::endl; |
| }); |
| |
| sse.on_event("update", [](const httplib::sse::SSEMessage &msg) { |
| std::cout << "Update: " << msg.data << std::endl; |
| }); |
| |
| sse.start(); |
| ``` |
| |
| ### Async with Stop |
| |
| ```cpp |
| httplib::sse::SSEClient sse(cli, "/events"); |
| |
| sse.on_message([](const httplib::sse::SSEMessage &msg) { |
| std::cout << msg.data << std::endl; |
| }); |
| |
| sse.start_async(); // Returns immediately |
| |
| // ... do other work ... |
| |
| sse.stop(); // Stop when done |
| ``` |
| |
| ### With Custom Headers (e.g., Authentication) |
| |
| ```cpp |
| httplib::Headers headers = { |
| {"Authorization", "Bearer token123"} |
| }; |
| |
| httplib::sse::SSEClient sse(cli, "/events", headers); |
| sse.start(); |
| ``` |
| |
| ### Error Handling |
| |
| ```cpp |
| sse.on_error([](httplib::Error err) { |
| std::cerr << "Error: " << httplib::to_string(err) << std::endl; |
| }); |
| |
| sse.set_reconnect_interval(1000); |
| sse.set_max_reconnect_attempts(5); |
| |
| sse.start(); |
| ``` |
| |
| ## SSE Protocol |
| |
| The client parses SSE format according to the [W3C specification](https://html.spec.whatwg.org/multipage/server-sent-events.html): |
| |
| ``` |
| event: custom-type |
| id: 123 |
| data: {"message": "hello"} |
| |
| data: simple message |
| |
| : this is a comment (ignored) |
| ``` |