initial rate limit support

This commit is contained in:
2025-01-31 16:14:13 -08:00
parent 68429bc1e4
commit 8324a496b6
6 changed files with 103 additions and 16 deletions

View File

@@ -2,6 +2,7 @@
#include "irc_command.hpp"
#include "ircmsg.hpp"
#include "ratelimit.hpp"
#include "ref.hpp"
#include "snote.hpp"
#include "stream.hpp"
@@ -46,7 +47,12 @@ private:
// AUTHENTICATE support
std::string authenticate_buffer_;
/// write buffers after consulting with rate limit
auto write_buffers() -> void;
/// write a specific number of messages now
auto write_buffers(size_t) -> void;
auto dispatch_line(char *line) -> void;
static constexpr std::chrono::seconds watchdog_duration = std::chrono::seconds{30};
@@ -68,6 +74,7 @@ public:
boost::signals2::signal<void(IrcCommand, const IrcMsg &)> sig_ircmsg;
boost::signals2::signal<void(SnoteMatch &)> sig_snote;
boost::signals2::signal<void(std::string_view)> sig_authenticate;
std::unique_ptr<RateLimit> rate_limit;
Connection(boost::asio::io_context &io);

View File

@@ -0,0 +1,20 @@
#pragma once
#include <chrono>
#include <utility>
struct RateLimit {
virtual ~RateLimit();
auto virtual query(size_t want_to_send) -> std::pair<std::chrono::milliseconds, size_t> = 0;
};
struct Rfc1459RateLimit final : RateLimit
{
using clock = std::chrono::steady_clock;
std::chrono::milliseconds cost_ {2'000};
std::chrono::milliseconds allowance_ {10'000};
clock::time_point horizon_{};
auto query(size_t want_to_send) -> std::pair<std::chrono::milliseconds, size_t> override;
};