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 🙏

© 2024 – Pkg Stats / Ryan Hefner

rate-limiter-multimodal

v1.0.1

Published

Rate limiter middleware for Express.js that allows very tight limits while providing a seamless experience to the users.

Downloads

10

Readme

Multimodal rate-limiter middleware for Express.js

This simple middleware is designed to limit the rate of requests to an Express.js server. It allows developers to limit the rate of requests on multiple time scales, allowing for much tighter limits on large time scales, and looser limits on smaller time scales. This makes the experience much smoother for zealous users, without straining the server. Currently, the middleware always throttles the requests, but it could be easily modified to return a 429 status code instead.

How to use

The rate limits at different time scales are defined by geometric progression: The number of requests allowed in the first time scale is defined by the initialCount parameter, as well as the initialWindow parameter, which defines the time window in seconds. At initialisation, the middleware will use countFactor and windowFactor to calculate the number of requests allowed in the next time scale, and so on, until the number of requests allowed in the last time scale is defined by the terms parameter.

As an example, if we set

  • initialCount = 5
  • initialWindow = 1
  • countFactor = 2
  • windowFactor = 3
  • terms = 10

We will have the following rate limits:

  • max. 5 requests per second
  • but also max. 10 requests per 3 seconds
  • 20 requests per 9 seconds
  • 40 requests per 27 seconds
  • 80 requests per 81 seconds (1 minute)
  • 160 requests per 243 seconds (4 minutes)
  • 320 requests per 729 seconds (12 minutes)
  • 640 requests per 2187 seconds (36 minutes)
  • 1280 requests per 6561 seconds (1 hour)
  • 2560 requests per 19683 seconds (5 hours)

Installation

npm install express-multimodal-rate-limiter

Usage

const express = require('express');
const rateLimiter = require('express-multimodal-rate-limiter');

// Define dummy app
const app = express();
app.use(rateLimiter({
  initialCount: 5,
  initialWindow: 1,
  countFactor: 2,
  windowFactor: 3,
  terms: 10
}));

// Define dummy route
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// Now the server will only allow 5 requests per second, but also 10 requests per 3 seconds, 20 requests per 9 seconds, etc.