npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dofek/provider-http

v0.1.5

Published

Rate-limit-aware Fetch utilities and typed provider HTTP errors

Readme

@dofek/provider-http

Fetch-compatible HTTP helpers for provider integrations that need typed rate-limit, service-unavailable, and request-timeout errors; Retry-After parsing; and optional adaptive request admission.

Install

npm install @dofek/provider-http

Requires Node.js 22.14 or newer and its built-in fetch implementation.

Usage

import {
  createRateLimitAwareFetch,
  ProviderRateLimitError,
  ProviderRequestTimeoutError,
} from "@dofek/provider-http";

const providerFetch = createRateLimitAwareFetch(fetch, {
  providerId: "example",
});

try {
  const response = await providerFetch("https://api.example.com/data");
  if (!response.ok) {
    throw new Error(`Provider returned HTTP ${response.status}`);
  }
  console.log(await response.json());
} catch (error) {
  if (error instanceof ProviderRateLimitError) {
    console.log(`Retry after ${error.retryAfterSeconds ?? "an unknown number of"} seconds`);
  } else if (error instanceof ProviderRequestTimeoutError) {
    console.log(`Request exceeded ${error.timeoutMs}ms`);
  } else {
    throw error;
  }
}

Public API

| Import | Main exports | | --- | --- | | @dofek/provider-http | createRateLimitAwareFetch, fetchWithRateLimitHandling, parseRetryAfterHeader, isServiceUnavailableStatus, PROVIDER_HTTP_REQUEST_TIMEOUT_MS, ProviderRateLimitError, ProviderRequestTimeoutError, ProviderServiceUnavailableError, and their option/store types | | @dofek/provider-http/rate-limit | Alias of the root rate-limit API | | @dofek/provider-http/adaptive-rate-limit | Adaptive budget state, serialization, admission-delay calculations, Strava quota parsing, defaults, constants, and AdaptiveRateLimitStore |

AdaptiveRateLimitStore is an interface: applications provide persistence and coordination appropriate to their runtime.

Error and request behavior

  • HTTP 429 throws ProviderRateLimitError.
  • HTTP 502, 503, and 504 throw ProviderServiceUnavailableError.
  • Every request made through createRateLimitAwareFetch has a shared two-minute deadline. The wrapper composes its timeout signal with a caller-provided signal and throws ProviderRequestTimeoutError with code ETIMEDOUT only when that deadline wins; caller cancellation remains the caller's error.
  • HTTP errors expose the provider, status, response body, scope, optional user, and parsed retryAfterSeconds. Timeout errors expose the provider, scope, optional user, timeoutMs, and original cause.
  • Other HTTP error responses are returned unchanged, so callers must check response.ok.
  • These helpers do not retry automatically. The caller decides whether and when to retry; an adaptive store can delay admission before a request.

The deadline uses Node's AbortSignal.timeout() and AbortSignal.any() APIs.

No authentication or environment variables are required by this package.

License and contributing

MIT. Source is in the Dofek repository. Please open an issue for bugs or API proposals, or submit a pull request.