API-agnostic client runtime for MoonBit SDKs: error taxonomy, Retry-After and backoff, tri-state JSON fields, open enums. Built on gaato/http; no async runtime dependency.
Dependencies
pub(open) trait RateLimiter {
async fn acquire(Self, String, global_exempt~ : Bool) -> Unit
async fn release(Self, String, status~ : Int, headers~ : Headers) -> Unit
}pub(all) enum Auth {
NoAuth
Bearer(String)
Header(String, String)
}test {
let request = @runtime.Bearer("secret").apply(@http.Request::get("/"))
assert_eq(request.headers.get("authorization"), Some("Bearer secret"))
}test {
assert_eq(@runtime.Backoff::default().delay_ms(2, 0.5), 2000)
}pub struct Client {
// private fields
}fn Client::new(transport : &Transport, clock : &Clock, base_url~ : String, default_headers? : Headers, auth? : Auth, retry? : &RetryDecider, limiter? : &RateLimiter, middleware? : Array[async (Request, async (Request) -> Response raise HttpError) -> Response raise HttpError], observer? : (Attempt) -> Unit, random? : () -> Double) -> Clientasync fn Client::send_stream(self : Client, request : Request, bucket? : String, global_exempt? : Bool) -> (ResponseHead, &BodyStream) raise SdkErrorpub struct NoLimiter {
}impl RateLimiter for NoLimiterpub struct Paginator[T, E] {
// private fields
}impl RetryDecider for RetryPolicyfn next_delay_ms(self : RetryPolicy, error : SdkError, request : Request, attempt : Int, random : Double) -> Int?fn RetryPolicy::next_delay_ms(self : RetryPolicy, error : SdkError, request : Request, attempt : Int, random : Double) -> Int?pub struct WindowLimiter {
// private fields
}impl RateLimiter for WindowLimiterasync fn WindowLimiter::acquire(self : WindowLimiter, bucket : String, global_exempt~ : Bool) -> Unitasync fn WindowLimiter::release(self : WindowLimiter, bucket : String, status~ : Int, headers~ : Headers) -> Unittest {
let response : @http.Response = {
status: 204,
headers: @http.Headers::new(),
body: b"",
}
assert_eq(@runtime.classify(response), response)
let error = @runtime.Transport(@http.Timeout(500))
assert_eq(error.status(), None)
assert_true(error.is_retryable())
}fn parse_retry_after(value : String, now_unix_ms? : Int64) -> Int?test {
assert_eq(@runtime.parse_retry_after("1.2349"), Some(1234))
}fn rate_limit_headers(remaining~ : String, reset_after_seconds? : String, reset_unix_seconds? : String) -> ((Headers, Int64) -> RateLimitState?)Install
Download zipAPI-agnostic client runtime for MoonBit SDKs: error taxonomy, Retry-After and backoff, tri-state JSON fields, open enums. Built on gaato/http; no async runtime dependency.
Dependencies