@journyio/ratelimiter
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

journy.io

Rate limiter

npm npm downloads

A sliding rate limiter using Redis. This package depends on moment/luxon and luin/ioredis.

We don't recommend consuming this package in plain JavaScript (to be able to use interfaces).

Inspired by these blogposts:

💾 Installation

You can use your package manager (npm or yarn) to install:

npm install --save @journyio/ratelimiter

or

yarn add @journyio/ratelimiter

🔌 Getting started

import Client from "ioredis";
import { Duration } from "luxon";
import { RateLimiter, RateLimiterRedis, RateLimitedResource } from "@journyio/ratelimiter";
import { ClockSystem } from "@journyio/clock";

class API {
  constructor(private readonly rateLimiter: RateLimiter) {}

  async getUser(id: UserId) {
    const resource = new RateLimitedResource(
      `API-calls-user-${id}`,
      100,
      Duration.fromObject({ minute: 1 })
    );

    const allowed = await this.rateLimiter.consume(resource);

    if (!allowed) {
      throw new Error("Rate limited!");
    }

    /* ... */
  }
}

const redis = new Client(process.env.REDIS_URL)
const rateLimiter = new RateLimiterRedis(redis, new ClockSystem());
const api = new API(rateLimiter);
const user = await api.getUser(/* ... */);
const resource = new RateLimitedResource(
  "API-calls-user-1313",
  100,
  Duration.fromObject({ minute: 1 })
);

const allowed = await this.rateLimiter.consume(resource);
const remainingCalls = await rateLimiter.remaining(resource);
await rateLimiter.reset(resource);

💯 Tests

To run the tests:

npm run test

(assuming redis runs on port 6379)

🔒 Security

If you discover any security related issues, please email security at journy io instead of using the issue tracker.

Dependencies (3)

Dev Dependencies (17)

Package Sidebar

Install

npm i @journyio/ratelimiter

Weekly Downloads

5

Version

2.0.0

License

MIT

Unpacked Size

9.94 kB

Total Files

11

Last publish

Collaborators

  • hansjourny
  • manujourny