kalshi-cpp 0.6.2
C++23 client for Kalshi's Predictions API
Loading...
Searching...
No Matches
rate_limit.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "kalshi/error.hpp"
5
6#include <chrono>
7#include <memory>
8#include <mutex>
9#include <optional>
10#include <string>
11#include <string_view>
12#include <vector>
13
14namespace kalshi {
15
21public:
22 struct Config {
23 double capacity{0.0};
24 double refill_per_second{0.0};
26 std::optional<double> initial_tokens;
27 };
28
30
32 [[nodiscard]] bool try_acquire(double cost = 1.0) noexcept;
33
36 [[nodiscard]] bool acquire_for(double cost, std::chrono::nanoseconds max_wait);
37
40 [[nodiscard]] std::chrono::nanoseconds wait_time(double cost) const noexcept;
41
43 [[nodiscard]] double available() const noexcept;
44 void reset() noexcept;
45 [[nodiscard]] const Config& config() const noexcept { return config_; }
46
47private:
48 using Clock = std::chrono::steady_clock;
49
50 void refill(Clock::time_point now) const noexcept;
51 [[nodiscard]] std::chrono::nanoseconds wait_time_locked(double cost) const noexcept;
52
53 Config config_;
54 mutable std::mutex mutex_;
55 mutable double tokens_{0.0};
56 mutable Clock::time_point last_refill_;
57};
58
63 std::string path;
64 double cost{0.0};
65};
66
70 TokenBucket::Config read{.capacity = 600.0, .refill_per_second = 200.0, .initial_tokens = {}};
71 TokenBucket::Config write{.capacity = 100.0, .refill_per_second = 100.0, .initial_tokens = {}};
73 double default_cost{10.0};
74 std::vector<EndpointCostRule> costs;
78 std::chrono::milliseconds max_wait{std::chrono::seconds{5}};
79};
80
91class RateLimitedTransport final : public HttpTransport {
92public:
93 RateLimitedTransport(std::shared_ptr<const HttpTransport> inner, RateLimitConfig config);
94
95 [[nodiscard]] Result<HttpResponse> request(HttpMethod method, std::string_view path,
96 std::string_view body = {}) const override;
97
99 [[nodiscard]] static bool is_write(HttpMethod method, std::string_view path) noexcept;
100
102 [[nodiscard]] double cost(HttpMethod method, std::string_view path,
103 std::string_view body) const;
104
105private:
106 std::shared_ptr<const HttpTransport> inner_;
107 RateLimitConfig config_;
108 mutable TokenBucket read_;
109 mutable TokenBucket write_;
110};
111
112} // namespace kalshi
Request boundary used by KalshiClient.
Definition http_client.hpp:62
Transport decorator that paces requests to Kalshi's Read and Write budgets so they are not rejected w...
Definition rate_limit.hpp:91
double cost(HttpMethod method, std::string_view path, std::string_view body) const
Token cost this transport charges for a request.
static bool is_write(HttpMethod method, std::string_view path) noexcept
Whether a request draws from the Write budget.
Result< HttpResponse > request(HttpMethod method, std::string_view path, std::string_view body={}) const override
path is relative to the base URL and may carry a query string.
RateLimitedTransport(std::shared_ptr< const HttpTransport > inner, RateLimitConfig config)
Token bucket that refills continuously, the model Kalshi's rate limits use.
Definition rate_limit.hpp:20
void reset() noexcept
const Config & config() const noexcept
Definition rate_limit.hpp:45
bool acquire_for(double cost, std::chrono::nanoseconds max_wait)
Waits up to max_wait for cost tokens.
std::chrono::nanoseconds wait_time(double cost) const noexcept
How long until cost tokens are available: zero if they are available now, nanoseconds::max() if they ...
double available() const noexcept
Tokens available now. Zero while earlier waiters hold reservations.
TokenBucket(Config config)
bool try_acquire(double cost=1.0) noexcept
Takes cost tokens if the bucket holds them.
Definition api.hpp:15
std::expected< T, Error > Result
Result type for SDK operations.
Definition error.hpp:50
HttpMethod
HTTP methods.
Definition http_client.hpp:20
Token cost of requests matching method and path.
Definition rate_limit.hpp:61
double cost
Definition rate_limit.hpp:64
std::string path
Definition rate_limit.hpp:63
HttpMethod method
Definition rate_limit.hpp:62
Defaults match Kalshi's Basic tier.
Definition rate_limit.hpp:69
TokenBucket::Config read
Definition rate_limit.hpp:70
std::vector< EndpointCostRule > costs
Definition rate_limit.hpp:74
double default_cost
Cost of requests without a matching rule. Kalshi's default is 10.
Definition rate_limit.hpp:73
TokenBucket::Config write
Definition rate_limit.hpp:71
std::chrono::milliseconds max_wait
Longest wait for tokens before failing with ErrorCode::RateLimited.
Definition rate_limit.hpp:78
Definition rate_limit.hpp:22
double refill_per_second
Definition rate_limit.hpp:24
std::optional< double > initial_tokens
Starting balance. Defaults to a full bucket.
Definition rate_limit.hpp:26
double capacity
Definition rate_limit.hpp:23