Combine retries, circuit breaking, caching, and rate limiting.
import { ApiClient, RateLimiter } from "bytekit"; const rateLimiter = new RateLimiter({ maxRequests: 50, windowMs: 60_000, }); const api = new ApiClient({ baseUrl: "https://api.example.com", retryPolicy: { maxAttempts: 3, initialDelayMs: 200, backoffMultiplier: 2, }, circuitBreaker: { failureThreshold: 5, timeoutMs: 30_000, }, interceptors: { request: async (url, init) => { await rateLimiter.waitForAllowance(url); return [url, init]; }, }, });
import { ApiClient, RequestDeduplicator } from "bytekit"; const deduplicator = new RequestDeduplicator(); const api = new ApiClient({ baseUrl: "https://api.example.com", }); const [usersA, usersB] = await Promise.all([ deduplicator.execute("/users", () => api.get("/users")), deduplicator.execute("/users", () => api.get("/users")), ]);
RequestCache
import { ApiClient, RequestCache } from "bytekit"; const cache = new RequestCache({ ttl: 10 * 60 * 1000, staleWhileRevalidate: 2 * 60 * 1000, }); const api = new ApiClient({ baseUrl: "https://api.example.com", }); async function getStats() { const cached = cache.get("/stats"); if (cached) return cached; const fresh = await api.get("/stats"); cache.set("/stats", fresh); return fresh; }
import { ApiClient, createLogger } from "bytekit"; const logger = createLogger({ namespace: "api" }); const api = new ApiClient({ baseUrl: "https://api.example.com", logger, retryPolicy: { maxAttempts: 3, }, });