Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/microlinkhq/async-ratelimiter
Rate limit made simple, easy, async.
https://github.com/microlinkhq/async-ratelimiter
nodejs rate-limiting
Last synced: 3 months ago
JSON representation
Rate limit made simple, easy, async.
- Host: GitHub
- URL: https://github.com/microlinkhq/async-ratelimiter
- Owner: microlinkhq
- License: mit
- Created: 2018-06-17T22:21:29.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-05-07T18:55:56.000Z (6 months ago)
- Last Synced: 2024-07-18T17:45:49.604Z (4 months ago)
- Topics: nodejs, rate-limiting
- Language: JavaScript
- Homepage:
- Size: 140 KB
- Stars: 317
- Watchers: 3
- Forks: 23
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
![Last version](https://img.shields.io/github/tag/microlinkhq/async-ratelimiter.svg?style=flat-square)
[![Coverage Status](https://img.shields.io/coveralls/microlinkhq/async-ratelimiter.svg?style=flat-square)](https://coveralls.io/github/microlinkhq/async-ratelimiter)
[![NPM Status](https://img.shields.io/npm/dm/async-ratelimiter.svg?style=flat-square)](https://www.npmjs.org/package/async-ratelimiter)> Rate limit made simple, easy, async. Based on [ratelimiter](https://github.com/tj/node-ratelimiter).
## Install
```bash
$ npm install async-ratelimiter --save
```## Usage
A simple middleware implementation for whatever HTTP server:
```js
'use strict'const RateLimiter = require('async-ratelimiter')
const { getClientIp } = require('request-ip')
const Redis = require('ioredis')const rateLimiter = new RateLimiter({
db: new Redis()
})const apiQuota = async (req, res, next) => {
const clientIp = getClientIp(req)
const limit = await rateLimiter.get({ id: clientIp })if (!res.writableEnded) {
res.setHeader('X-Rate-Limit-Limit', limit.total)
res.setHeader('X-Rate-Limit-Remaining', Math.max(0, limit.remaining - 1))
res.setHeader('X-Rate-Limit-Reset', limit.reset)
}return !limit.remaining
? sendFail({
req,
res,
code: HTTPStatus.TOO_MANY_REQUESTS,
message: MESSAGES.RATE_LIMIT_EXCEDEED()
})
: next(req, res)
}
```## API
### constructor(options)
It creates an rate limiter instance.
#### options
##### db
_Required_
Type: `object`The redis connection instance.
##### max
Type: `number`
Default: `2500`The maximum number of requests within `duration`.
##### duration
Type: `number`
Default: `3600000`How long keep records of requests in milliseconds.
##### namespace
Type: `string`
Default: `'limit'`The prefix used for compound the key.
##### id
Type: `string`
The identifier to limit against (typically a user id).
You can pass this value using when you use `.get` method as well.
### .get(options)
Given an `id`, returns a Promise with the status of the limit with the following structure:
- `total`: `max` value.
- `remaining`: number of calls left in current `duration` without decreasing current `get`.
- `reset`: time since epoch in seconds that the rate limiting period will end (or already ended).#### options
##### id
Type: `string`
Default: `this.id`The identifier to limit against (typically a user id).
##### max
Type: `number`
Default: `this.max`The maximum number of requests within `duration`. If provided, it overrides the default `max` value. This is useful for custom limits that differ between IDs.
##### duration
Type: `number`
Default: `this.max`How long keep records of requests in milliseconds. If provided, it overrides the default `duration` value.
## Related
- [express-slow-down](https://github.com/nfriedly/express-slow-down) – Slow down repeated requests; use as an alternative (or addition) to express-rate-limit.
## License
**async-ratelimiter** © [microlink.io](https://microlink.io), released under the [MIT](https://github.com/microlinkhq/async-ratelimiter/blob/master/LICENSE.md) License.
Authored and maintained by [Kiko Beats](https://kikobeats.com) with help from [contributors](https://github.com/microlinkhq/async-ratelimiter/contributors).> [microlink.io](https://microlink.io) · GitHub [microlink.io](https://github.com/microlinkhq) · Twitter [@microlinkhq](https://twitter.com/microlinkhq)