A more comfortable way to consume stream events.
This commit is contained in:
parent
839e29b37b
commit
ec41063488
|
@ -65,9 +65,13 @@ int main(int argc, char *argv[])
|
||||||
// Print new events every 2 seconds, for 10 seconds.
|
// Print new events every 2 seconds, for 10 seconds.
|
||||||
for (auto counter{0}; counter < 5; ++counter)
|
for (auto counter{0}; counter < 5; ++counter)
|
||||||
{
|
{
|
||||||
cout << "----------------------------------------" << endl;
|
|
||||||
sleep_for(2s);
|
sleep_for(2s);
|
||||||
cout << connection.get_new_stream_contents() << endl;
|
for (const auto &event : connection.get_new_events())
|
||||||
|
{
|
||||||
|
// Print typo of event and the beginning of the data.
|
||||||
|
cout << event.type << ": "
|
||||||
|
<< event.data.substr(0, 70) << " …" << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel the stream, …
|
// Cancel the stream, …
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace mastodonpp
|
namespace mastodonpp
|
||||||
{
|
{
|
||||||
|
@ -32,6 +33,7 @@ namespace mastodonpp
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::string_view;
|
using std::string_view;
|
||||||
using std::variant;
|
using std::variant;
|
||||||
|
using std::vector;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief An endpoint. Either API::endpoint_type or `std::string_view`.
|
* @brief An endpoint. Either API::endpoint_type or `std::string_view`.
|
||||||
|
@ -40,6 +42,29 @@ using std::variant;
|
||||||
*/
|
*/
|
||||||
using endpoint_variant = variant<API::endpoint_type,string_view>;
|
using endpoint_variant = variant<API::endpoint_type,string_view>;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief A stream event.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*
|
||||||
|
* @headerfile connection.hpp mastodonpp/connection.hpp
|
||||||
|
*/
|
||||||
|
struct event_type
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
* @brief The type of the event.
|
||||||
|
*
|
||||||
|
* Can be: “update”, “notification”, “delete” or “filters_changed”. For
|
||||||
|
* more information consult [the Mastodon documentation]
|
||||||
|
* (https://docs.joinmastodon.org/methods/timelines/streaming/
|
||||||
|
* #event-types-a-idevent-typesa).
|
||||||
|
*/
|
||||||
|
string type;
|
||||||
|
|
||||||
|
//! The payload.
|
||||||
|
string data;
|
||||||
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Represents a connection to an instance. Used for requests.
|
* @brief Represents a connection to an instance. Used for requests.
|
||||||
*
|
*
|
||||||
|
@ -106,10 +131,19 @@ public:
|
||||||
* that you are calling this function mid-transfer. You have to check the
|
* that you are calling this function mid-transfer. You have to check the
|
||||||
* data integrity yourself.
|
* data integrity yourself.
|
||||||
*
|
*
|
||||||
|
* Using get_new_events() instead is recommended.
|
||||||
|
*
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
*/
|
*/
|
||||||
string get_new_stream_contents();
|
string get_new_stream_contents();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get new stream events.
|
||||||
|
*
|
||||||
|
* @since 0.1.0
|
||||||
|
*/
|
||||||
|
vector<event_type> get_new_events();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Instance &_instance;
|
Instance &_instance;
|
||||||
const string_view _baseuri;
|
const string_view _baseuri;
|
||||||
|
|
|
@ -58,4 +58,33 @@ string Connection::get_new_stream_contents()
|
||||||
return buffer_copy;
|
return buffer_copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<event_type> Connection::get_new_events()
|
||||||
|
{
|
||||||
|
buffer_mutex.lock();
|
||||||
|
auto &buffer{get_buffer()};
|
||||||
|
vector<event_type> events;
|
||||||
|
|
||||||
|
size_t pos{0};
|
||||||
|
while ((pos = buffer.find("event: ")) != string::npos)
|
||||||
|
{
|
||||||
|
const auto endpos{buffer.find("\n\n", pos)};
|
||||||
|
if (endpos == string::npos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
event_type event;
|
||||||
|
pos += 7; // Length of "event: ".
|
||||||
|
event.type = buffer.substr(pos, buffer.find('\n', pos) - pos);
|
||||||
|
pos = buffer.find("data: ") + 6;
|
||||||
|
event.data = buffer.substr(pos, endpos - pos);
|
||||||
|
events.push_back(event);
|
||||||
|
|
||||||
|
buffer.erase(0, endpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer_mutex.unlock();
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace mastodonpp
|
} // namespace mastodonpp
|
||||||
|
|
Loading…
Reference in New Issue
Block a user