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

guys-rate-limiter

v1.0.1

Published

A distrebuted Rate Limiter Allowing each user to perform up to 500 requests in a 60 seconds time frame.

Downloads

2

Readme

guy-rate-limiter

A distrebuted Rate Limiter Allowing each user to perform up to 500 requests in a 60 seconds time frame.

Install

$ npm install --save guy-rate-limiter

Configuration

The Default Rate Limiter Redis Configuration uses: host = 127.0.0.1 port = 6379

To Change it set the environment variables:

RATE_LIMIT_REDIS_PORT

RATE_LIMIT_REDIS_HOST

By running:

$ export RATE_LIMIT_REDIS_PORT=[REDIS_PORT]
$ export RATE_LIMIT_REDIS_HOST=[REDIS_HOST]

Or in any other way

you could alse set environment variable:

RATE_LIMIT_REDIS_URL

USAGE EXAMPLE

export RATE_LIMIT_REDIS_PORT=6378 There are two options to use:

  1. use as an express middleware
const express = require('express')
const rateLimiter = require('guy-rate-limiter');
const app = express();
const port = 3000;

app.use((req, res, next) => {
  req.userID = req.query.uid || 'UNKNOWN'; 
  next();
});
const rateLimitMiddleware = rateLimiter.getExpressMiddleware('ip');
app.use(rateLimitMiddleware);
app.get('/', function (req, res) {
  res.send(`Hello ${req.userID}`);
});

 
app.listen(port)
  1. use only the rate limitter
const rateLimiter = require('guy-rate-limiter');

rateLimiter.handleUserRequest(userId,(err,allow) => {
      if(err) {
        //handle error
      }
      else if (!allow){
        //handle block
      }
      else {
        //handle allow
      }
  });

Testing

In order to test run:

$ npm test

Method and Considerations

  • Using sliding window to be accurate on a time frame.

  • Using redis sorted sets for fast deleting

  • Using redis Transactions - All commands reading and updating the user rate run atomically by Redis sending back only the number of connections in the last minute.

  • Any request is counted. Even blocked ones - that way we don't encourage users to send less requests (and not just keep on sending knowing they that if they exceed the rate limit they will still get the maximum they can).

for each user we save all the last minute timestamps and for every request we:

  1. remove the outdated timestamps.
  2. return the number of timestamps in the current minute window.
  3. add the new time stamp