Back to Documentation

API Rate Limiter

Advanced rate limiting with multiple strategies

Installation

npm install @jutech-devs/api-rate-limiter

Quick Start

import { useRateLimiter } from '@jutech-devs/api-rate-limiter';

function APIComponent() {
  const { makeRequest, state, canMakeRequest } = useRateLimiter({
    maxRequests: 10,
    windowMs: 60000, // 1 minute
    strategy: 'sliding-window'
  });

  const fetchData = async () => {
    try {
      const result = await makeRequest(() => 
        fetch('/api/data').then(res => res.json())
      );
      console.log('Data:', result);
    } catch (error) {
      console.error('Rate limited:', error.message);
    }
  };

  return (
    <div>
      <p>Remaining requests: {state.remaining}</p>
      <button onClick={fetchData} disabled={!canMakeRequest()}>
        Fetch Data
      </button>
    </div>
  );
}

Rate Limiting Strategies

Sliding Window

Most accurate but uses more memory. Maintains a rolling window of requests.

strategy: 'sliding-window'

Fixed Window

Memory efficient but can allow bursts. Resets counter at fixed intervals.

strategy: 'fixed-window'

Token Bucket

Allows burst requests up to bucket capacity. Smooth rate limiting.

strategy: 'token-bucket'

Advanced Usage

Automatic Retry

import { useRateLimitedAPI } from '@jutech-devs/api-rate-limiter';

function APIComponent() {
  const { makeAPIRequest, state } = useRateLimitedAPI({
    maxRequests: 10,
    windowMs: 60000
  });

  const fetchWithRetry = async () => {
    try {
      const result = await makeAPIRequest(
        () => fetch('/api/data').then(res => res.json()),
        {
          maxRetries: 3,
          retryDelay: 1000,
          exponentialBackoff: true
        }
      );
      console.log('Success:', result);
    } catch (error) {
      console.error('Failed after retries:', error);
    }
  };

  return (
    <div>
      <button onClick={fetchWithRetry}>Fetch with Auto-Retry</button>
      <p>Status: {state.isLimited ? 'Rate Limited' : 'Available'}</p>
    </div>
  );
}

Batch Processing

import { useBatchRateLimiter } from '@jutech-devs/api-rate-limiter';

function BatchProcessor() {
  const { addToQueue, state, queueLength } = useBatchRateLimiter({
    maxRequests: 5,
    windowMs: 10000
  });

  const processBatch = async () => {
    const requests = [
      () => fetch('/api/item/1').then(res => res.json()),
      () => fetch('/api/item/2').then(res => res.json()),
      () => fetch('/api/item/3').then(res => res.json()),
    ];

    const results = await Promise.all(
      requests.map(req => addToQueue(req))
    );
    
    console.log('Batch results:', results);
  };

  return (
    <div>
      <button onClick={processBatch}>Process Batch</button>
      <p>Queue length: {queueLength}</p>
      <p>Remaining: {state.remaining}</p>
    </div>
  );
}

Multiple API Rate Limiters

import { useMultiRateLimiter } from '@jutech-devs/api-rate-limiter';

function MultiAPIComponent() {
  const { makeRequest, getAllStates } = useMultiRateLimiter({
    github: { maxRequests: 60, windowMs: 3600000 },
    twitter: { maxRequests: 300, windowMs: 900000 },
    internal: { maxRequests: 1000, windowMs: 60000 }
  });

  const fetchGitHubData = () => 
    makeRequest('github', () => 
      fetch('/api/github/user').then(res => res.json())
    );

  const states = getAllStates();

  return (
    <div>
      <button onClick={fetchGitHubData}>
        GitHub API (Remaining: {states.github?.remaining})
      </button>
    </div>
  );
}

Configuration Options

OptionTypeDefaultDescription
maxRequestsnumberrequiredMaximum requests per window
windowMsnumberrequiredTime window in milliseconds
strategystring'sliding-window'Rate limiting strategy
retryAfternumberundefinedDefault retry delay

Available Hooks

useRateLimiter

Basic rate limiting hook with full control

useRateLimitedAPI

API requests with automatic retry logic

useBatchRateLimiter

Queue and process requests in batches

useMultiRateLimiter

Manage multiple rate limiters for different APIs

Use Cases

API Integration - Respect third-party limits
User Actions - Prevent spam clicking
Background Jobs - Throttle processes
Resource Protection - Protect your APIs

Pricing

Free & Open Source

  • • All rate limiting strategies
  • • React hooks included
  • • TypeScript support
  • • MIT License
  • • Community support