pub struct RequestPacer { /* private fields */ }Expand description
Paces programmatic HTTP/CDP requests with human-realistic inter-request delays.
Prevents tight-loop request patterns that are trivially detectable by server-side
rate analysers (Cloudflare, Akamai, DataDome, AWS WAF). Delays follow a truncated
Gaussian distribution centred on mean_ms with std_ms variance, giving natural
bursty-but-not-mechanical timing.
The first call to throttle always returns immediately
(no prior request to pace against).
§Example
use stygian_browser::behavior::RequestPacer;
let mut pacer = RequestPacer::new();
for url in &["https://a.example.com", "https://b.example.com"] {
pacer.throttle().await;
// … make request to url …
}Implementations§
Source§impl RequestPacer
impl RequestPacer
Sourcepub fn new() -> Self
pub fn new() -> Self
Default pacer: mean 1 200 ms, σ = 400 ms, clamped 400–4 000 ms.
§Example
use stygian_browser::behavior::RequestPacer;
let _pacer = RequestPacer::new();Sourcepub fn with_timing(mean_ms: u64, std_ms: u64, min_ms: u64, max_ms: u64) -> Self
pub fn with_timing(mean_ms: u64, std_ms: u64, min_ms: u64, max_ms: u64) -> Self
Create with explicit timing parameters (all values in milliseconds).
If min_ms > max_ms, bounds are normalized by swapping them.
§Example
use stygian_browser::behavior::RequestPacer;
// Aggressive: ~500 ms mean, σ = 150 ms, clamped 200–1 500 ms.
let _pacer = RequestPacer::with_timing(500, 150, 200, 1_500);Sourcepub fn with_rate(requests_per_second: f64) -> Self
pub fn with_rate(requests_per_second: f64) -> Self
Construct from a target requests-per-second rate.
Mean = 1000 / rps ms, σ = 25 % of mean, clamped to ±50 % of mean.
rps is clamped to a minimum of 0.01 to avoid division by zero and
extreme near-zero denominators.
§Example
use stygian_browser::behavior::RequestPacer;
let _pacer = RequestPacer::with_rate(0.5); // ~1 request every 2 sSourcepub async fn throttle(&mut self)
pub async fn throttle(&mut self)
Wait until the appropriate inter-request delay has elapsed, then return.
The first call returns immediately. Subsequent calls sleep remaining time to match the sampled target delay.
§Example
use stygian_browser::behavior::RequestPacer;
let mut pacer = RequestPacer::new();
pacer.throttle().await; // first call: immediate
pacer.throttle().await; // waits ~1.2 s