Documentation
Framework
Version
Debouncer API Reference
Throttler API Reference
Rate Limiter API Reference
Queue API Reference
Batcher API Reference

Vanilla Example: LiteRateLimit

ts
/**
 * Note: @tanstack/pacer-lite is a stripped-down alternative designed for library use.
 * It does not include TanStack Store, reactivity features, framework adapters, or devtools support
 * that are available in the core @tanstack/pacer package for app development.
 * The core version also includes more advanced features in some utilities.
 */
import { liteRateLimit } from '@tanstack/pacer-lite/lite-rate-limiter'

function createApp1() {
  const container = document.createElement('div')

  let instantCount = 0
  let limitedCount = 0
  let executionCount = 0
  let rejectionCount = 0
  let windowType: 'fixed' | 'sliding' = 'fixed'

  let rateLimitedSetCount = liteRateLimit(
    (newCount: number) => {
      limitedCount = newCount
      executionCount += 1
      console.log('✅ Rate limited count updated:', newCount)
      updateDisplay()
    },
    {
      limit: 5,
      window: 5000,
      windowType: windowType,
    },
  )

  function increment() {
    instantCount += 1
    const executed = rateLimitedSetCount(instantCount)
    if (!executed) {
      rejectionCount += 1
      console.log('❌ Rejected by rate limiter')
    }
    updateDisplay()
  }

  function reset() {
    instantCount = 0
    limitedCount = 0
    executionCount = 0
    rejectionCount = 0
    updateDisplay()
  }

  function setWindowType(type: 'fixed' | 'sliding') {
    windowType = type
    instantCount = 0
    limitedCount = 0
    executionCount = 0
    rejectionCount = 0
    rateLimitedSetCount = liteRateLimit(
      (newCount: number) => {
        limitedCount = newCount
        executionCount += 1
        console.log('✅ Rate limited count updated:', newCount)
        updateDisplay()
      },
      {
        limit: 5,
        window: 5000,
        windowType: windowType,
      },
    )
    updateDisplay()
  }

  function updateDisplay() {
    container.innerHTML = `
      <div>
        <h1>TanStack Pacer liteRateLimit Example</h1>
        <div>
          <label>
            <input type="radio" name="windowType" value="fixed" ${windowType === 'fixed' ? 'checked' : ''} />
            Fixed Window
          </label>
          <label>
            <input type="radio" name="windowType" value="sliding" ${windowType === 'sliding' ? 'checked' : ''} />
            Sliding Window
          </label>
        </div>
        <table>
          <tbody>
            <tr>
              <td>Execution Count:</td>
              <td>${executionCount}</td>
            </tr>
            <tr>
              <td>Rejection Count:</td>
              <td>${rejectionCount}</td>
            </tr>
            <tr>
              <td colspan="2"><hr /></td>
            </tr>
            <tr>
              <td>Instant Count:</td>
              <td>${instantCount}</td>
            </tr>
            <tr>
              <td>Rate Limited Count:</td>
              <td>${limitedCount}</td>
            </tr>
          </tbody>
        </table>
        <div>
          <button id="increment-btn">Increment</button>
          <button id="reset-btn">Reset</button>
        </div>
      </div>
    `

    container
      .querySelector('#increment-btn')
      ?.addEventListener('click', increment)
    container.querySelector('#reset-btn')?.addEventListener('click', reset)
    container
      .querySelector('input[value="fixed"]')
      ?.addEventListener('change', () => setWindowType('fixed'))
    container
      .querySelector('input[value="sliding"]')
      ?.addEventListener('change', () => setWindowType('sliding'))
  }

  updateDisplay()
  return container
}

const app = document.getElementById('app')!
app.appendChild(createApp1())

console.log(
  'liteRateLimit example ready! Click increment rapidly and watch the console for rate limited executions.',
)
/**
 * Note: @tanstack/pacer-lite is a stripped-down alternative designed for library use.
 * It does not include TanStack Store, reactivity features, framework adapters, or devtools support
 * that are available in the core @tanstack/pacer package for app development.
 * The core version also includes more advanced features in some utilities.
 */
import { liteRateLimit } from '@tanstack/pacer-lite/lite-rate-limiter'

function createApp1() {
  const container = document.createElement('div')

  let instantCount = 0
  let limitedCount = 0
  let executionCount = 0
  let rejectionCount = 0
  let windowType: 'fixed' | 'sliding' = 'fixed'

  let rateLimitedSetCount = liteRateLimit(
    (newCount: number) => {
      limitedCount = newCount
      executionCount += 1
      console.log('✅ Rate limited count updated:', newCount)
      updateDisplay()
    },
    {
      limit: 5,
      window: 5000,
      windowType: windowType,
    },
  )

  function increment() {
    instantCount += 1
    const executed = rateLimitedSetCount(instantCount)
    if (!executed) {
      rejectionCount += 1
      console.log('❌ Rejected by rate limiter')
    }
    updateDisplay()
  }

  function reset() {
    instantCount = 0
    limitedCount = 0
    executionCount = 0
    rejectionCount = 0
    updateDisplay()
  }

  function setWindowType(type: 'fixed' | 'sliding') {
    windowType = type
    instantCount = 0
    limitedCount = 0
    executionCount = 0
    rejectionCount = 0
    rateLimitedSetCount = liteRateLimit(
      (newCount: number) => {
        limitedCount = newCount
        executionCount += 1
        console.log('✅ Rate limited count updated:', newCount)
        updateDisplay()
      },
      {
        limit: 5,
        window: 5000,
        windowType: windowType,
      },
    )
    updateDisplay()
  }

  function updateDisplay() {
    container.innerHTML = `
      <div>
        <h1>TanStack Pacer liteRateLimit Example</h1>
        <div>
          <label>
            <input type="radio" name="windowType" value="fixed" ${windowType === 'fixed' ? 'checked' : ''} />
            Fixed Window
          </label>
          <label>
            <input type="radio" name="windowType" value="sliding" ${windowType === 'sliding' ? 'checked' : ''} />
            Sliding Window
          </label>
        </div>
        <table>
          <tbody>
            <tr>
              <td>Execution Count:</td>
              <td>${executionCount}</td>
            </tr>
            <tr>
              <td>Rejection Count:</td>
              <td>${rejectionCount}</td>
            </tr>
            <tr>
              <td colspan="2"><hr /></td>
            </tr>
            <tr>
              <td>Instant Count:</td>
              <td>${instantCount}</td>
            </tr>
            <tr>
              <td>Rate Limited Count:</td>
              <td>${limitedCount}</td>
            </tr>
          </tbody>
        </table>
        <div>
          <button id="increment-btn">Increment</button>
          <button id="reset-btn">Reset</button>
        </div>
      </div>
    `

    container
      .querySelector('#increment-btn')
      ?.addEventListener('click', increment)
    container.querySelector('#reset-btn')?.addEventListener('click', reset)
    container
      .querySelector('input[value="fixed"]')
      ?.addEventListener('change', () => setWindowType('fixed'))
    container
      .querySelector('input[value="sliding"]')
      ?.addEventListener('change', () => setWindowType('sliding'))
  }

  updateDisplay()
  return container
}

const app = document.getElementById('app')!
app.appendChild(createApp1())

console.log(
  'liteRateLimit example ready! Click increment rapidly and watch the console for rate limited executions.',
)
Subscribe to Bytes

Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.

Bytes

No spam. Unsubscribe at any time.

Subscribe to Bytes

Your weekly dose of JavaScript news. Delivered every Monday to over 100,000 devs, for free.

Bytes

No spam. Unsubscribe at any time.