rate-keeper
Version:
A lightweight utility for easily adding rate limiting to functions, ideal for preventing API rate limit violations.
142 lines (100 loc) • 3.71 kB
Markdown
[](https://www.npmjs.com/package/rate-keeper) [](https://www.npmjs.com/package/rate-keeper) [](https://www.npmjs.com/package/rate-keeper)
[](https://bundlephobia.com/package/rate-keeper) [](https://bundlephobia.com/package/rate-keeper)
`rate-keeper` is a lightweight utility for easily adding rate limiting to functions and preventing API rate limit violations.
- Create `actions` with rate limits.
- Manages multiple queues by ID, allowing `sequential and parallel actions`.
- Helps `prevent overloading` of external services by managing API usage.
- Very `easy to integrate` into existing code.
Install the package via npm:
```bash
npm install rate-keeper
```
Existing code.
```javascript
function logMessage(newLog) {
console.log(newLog);
return newLog;
}
```
```javascript
import RateKeeper from "rate-keeper";
const safeLogger = RateKeeper(logMessage, 500); // Minimum of 500ms between calls.
safeLogger("Message 1");
safeLogger("Message 2");
safeLogger("Message 3");
```
```javascript
Message 1
//500ms later...
Message 2
//500ms later...
Message 3
```
```javascript
import RateKeeper from "rate-keeper";
const queueID = 1001;
const logger1 = RateKeeper(logMessage, 500, { id: queueID }); // Shared queue with logger2
const logger2 = RateKeeper(logMessage, 500, { id: queueID }); // Shared queue with logger1
const logger3 = RateKeeper(logMessage, 500); // Independent queue
logger1("Queue Message 1");
logger2("Queue Message 2");
logger3("Independent Message");
```
```javascript
Queue Message 1
Independent Message
// 500ms later...
Queue Message 2
```
You can configure queues with custom settings, such as a maximum queue size and policies for handling overflow. Options include `Reject` (discard new entries when full) or `DropOldest` (remove the oldest entry to make room for new ones).
```javascript
import RateKeeper, { DropPolicy } from "rate-keeper";
const queueID = 2002;
const loggerWithLimit = RateKeeper(logMessage, 500, {
id: queueID,
maxQueueSize: 2,
dropPolicy: DropPolicy.DropOldest, // Removes the oldest task when the queue is full
});
loggerWithLimit("Message 0"); // Processed.
loggerWithLimit("Message 1"); // Added to queue
loggerWithLimit("Message 2"); // Added to queue
loggerWithLimit("Message 3"); // "Message 1" is dropped, "Message 3" added
// Logs will be processed with a 500ms interval
```
```javascript
Message 0
// 500ms later...
Message 2
// 500ms later...
Message 3
```
A function created with `rate-keeper` returns a promise containing the invocation result, making asynchronous handling straightforward.
```javascript
import RateKeeper from "rate-keeper";
const safeLogger = RateKeeper(logMessage, 500); // Minimum of 500ms between calls.
safeLogger("Hello World 1").then((result) => {
//...
});
```
```javascript
import RateKeeper from "rate-keeper";
const safeLogger = RateKeeper(logMessage, 500); // Minimum of 500ms between calls.
safeLogger("Message 1");
const message2 = safeLogger("Message 2");
safeLogger("Message 3");
message2.cancel();
```
```javascript
Message 1
//500ms later...
Message 3
```