Skip to main content

cratefield_runtime_cloudflare/ports/
rate_limit.rs

1//! `RateLimiter` over the Workers Rate Limiting binding. The binding does
2//! not expose a retry-after, so `Decision::retry_after` is `None`.
3
4use async_trait::async_trait;
5use cratefield_core::{Decision, RateLimitError, RateLimiter};
6use worker::RateLimiter as WorkerRateLimiter;
7
8pub struct RateLimitPort(pub WorkerRateLimiter);
9
10#[async_trait]
11impl RateLimiter for RateLimitPort {
12    async fn limit(&self, key: &str) -> Result<Decision, RateLimitError> {
13        let outcome = self
14            .0
15            .limit(key.to_owned())
16            .await
17            .map_err(|err| RateLimitError::Transport(err.to_string()))?;
18        Ok(Decision {
19            ok: outcome.success,
20            retry_after: None,
21            // The binding answers a boolean per namespace: it has no
22            // window to report, so no quota and no `RateLimit-*` headers.
23            quota: None,
24        })
25    }
26}