Socket
Socket
Sign inDemoInstall

rate-limiter-flexible

Package Overview
Dependencies
Maintainers
1
Versions
163
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

rate-limiter-flexible - npm Package Compare versions

Comparing version 0.18.5 to 0.19.0

3

index.js

@@ -5,3 +5,3 @@ const RateLimiterRedis = require('./lib/RateLimiterRedis');

const RateLimiterPostgres = require('./lib/RateLimiterPostgres');
const { RateLimiterClusterMaster, RateLimiterCluster } = require('./lib/RateLimiterCluster');
const { RateLimiterClusterMaster, RateLimiterClusterMasterPM2, RateLimiterCluster } = require('./lib/RateLimiterCluster');
const RateLimiterMemory = require('./lib/RateLimiterMemory');

@@ -16,3 +16,4 @@

RateLimiterClusterMaster,
RateLimiterClusterMasterPM2,
RateLimiterCluster,
};

@@ -74,2 +74,6 @@ export interface RateLimiterRes {

export class RateLimiterClusterMasterPM2 {
constructor(pm2: any);
}
export class RateLimiterRedis extends RateLimiterStoreAbstract {

@@ -76,0 +80,0 @@ }

@@ -46,3 +46,3 @@ /**

keyPrefix: msg.keyPrefix, // which rate limiter exactly
id: msg.id,
promiseId: msg.promiseId,
type,

@@ -58,3 +58,3 @@ data,

// Promise will be removed by timeout if too long
} else if (typeof this._promises[payload.id] !== 'undefined') {
} else if (typeof this._promises[payload.promiseId] !== 'undefined') {
workerWaitInit.call(this, payload);

@@ -65,3 +65,3 @@ }

const workerSendToMaster = function (func, id, key, arg) {
const workerSendToMaster = function (func, promiseId, key, arg) {
const payload = {

@@ -71,3 +71,3 @@ channel,

func,
id,
promiseId,
data: {

@@ -130,4 +130,4 @@ key,

if (this._promises[msg.id]) {
clearTimeout(this._promises[msg.id].timeoutId);
if (this._promises[msg.promiseId]) {
clearTimeout(this._promises[msg.promiseId].timeoutId);
let res;

@@ -147,6 +147,6 @@ if (msg.data === null) {

case 'resolve':
this._promises[msg.id].resolve(res);
this._promises[msg.promiseId].resolve(res);
break;
case 'reject':
this._promises[msg.id].reject(res);
this._promises[msg.promiseId].reject(res);
break;

@@ -157,3 +157,3 @@ default:

delete this._promises[msg.id];
delete this._promises[msg.promiseId];
}

@@ -178,13 +178,13 @@ };

const hrtime = process.hrtime();
let id = hrtime[0].toString() + hrtime[1].toString();
let promiseId = hrtime[0].toString() + hrtime[1].toString();
if (typeof this._promises[id] !== 'undefined') {
id += crypto.randomBytes(12).toString('base64');
if (typeof this._promises[promiseId] !== 'undefined') {
promiseId += crypto.randomBytes(12).toString('base64');
}
this._promises[id] = {
this._promises[promiseId] = {
resolve,
reject,
timeoutId: setTimeout(() => {
delete this._promises[id];
delete this._promises[promiseId];
reject(new Error('RateLimiterCluster timeout: no answer from master in time'));

@@ -194,3 +194,3 @@ }, this.timeoutMs),

return id;
return promiseId;
};

@@ -229,2 +229,53 @@

class RateLimiterClusterMasterPM2 {
constructor(pm2) {
if (masterInstance) {
return masterInstance;
}
this._rateLimiters = {};
pm2.launchBus((err, pm2Bus) => {
pm2Bus.on('process:msg', (packet) => {
const msg = packet.raw;
if (msg && msg.channel === channel && msg.type === 'init') {
// If init request, check or create rate limiter by key prefix and send 'init' back to worker
if (typeof this._rateLimiters[msg.opts.keyPrefix] === 'undefined') {
this._rateLimiters[msg.opts.keyPrefix] = new RateLimiterMemory(msg.opts);
}
pm2.sendDataToProcessId(packet.process.pm_id, {
data : {},
topic: channel,
channel,
type: 'init',
keyPrefix: msg.opts.keyPrefix,
}, (err, res) => {
if (err) {
console.log(err, res);
}
});
} else {
const worker = {
send: (msgData) => {
pm2.sendDataToProcessId(packet.process.pm_id, {
data : {},
topic: channel,
...msgData
}, (err, res) => {
if (err) {
console.log(err, res);
}
});
}
};
masterProcessMsg.call(this, worker, msg);
}
});
});
masterInstance = this;
}
}
class RateLimiterClusterWorker extends RateLimiterAbstract {

@@ -268,5 +319,5 @@ get timeoutMs() {

return new Promise((resolve, reject) => {
const id = savePromise.call(this, resolve, reject);
const promiseId = savePromise.call(this, resolve, reject);
workerSendToMaster.call(this, 'consume', id, key, pointsToConsume);
workerSendToMaster.call(this, 'consume', promiseId, key, pointsToConsume);
});

@@ -277,5 +328,5 @@ }

return new Promise((resolve, reject) => {
const id = savePromise.call(this, resolve, reject);
const promiseId = savePromise.call(this, resolve, reject);
workerSendToMaster.call(this, 'penalty', id, key, points);
workerSendToMaster.call(this, 'penalty', promiseId, key, points);
});

@@ -286,5 +337,5 @@ }

return new Promise((resolve, reject) => {
const id = savePromise.call(this, resolve, reject);
const promiseId = savePromise.call(this, resolve, reject);
workerSendToMaster.call(this, 'reward', id, key, points);
workerSendToMaster.call(this, 'reward', promiseId, key, points);
});

@@ -295,5 +346,5 @@ }

return new Promise((resolve, reject) => {
const id = savePromise.call(this, resolve, reject);
const promiseId = savePromise.call(this, resolve, reject);
workerSendToMaster.call(this, 'block', id, key, secDuration);
workerSendToMaster.call(this, 'block', promiseId, key, secDuration);
});

@@ -304,5 +355,5 @@ }

return new Promise((resolve, reject) => {
const id = savePromise.call(this, resolve, reject);
const promiseId = savePromise.call(this, resolve, reject);
workerSendToMaster.call(this, 'get', id, key);
workerSendToMaster.call(this, 'get', promiseId, key);
});

@@ -314,3 +365,4 @@ }

RateLimiterClusterMaster,
RateLimiterClusterMasterPM2,
RateLimiterCluster: RateLimiterClusterWorker,
};
{
"name": "rate-limiter-flexible",
"version": "0.18.5",
"version": "0.19.0",
"description": "Flexible API rate limiter backed by Redis for distributed node.js applications",

@@ -5,0 +5,0 @@ "main": "index.js",

@@ -97,3 +97,3 @@ [![Build Status](https://travis-ci.org/animir/node-rate-limiter-flexible.png)](https://travis-ci.org/animir/node-rate-limiter-flexible)

* [RateLimiterPostgres](https://github.com/animir/node-rate-limiter-flexible/wiki/PostgreSQL) (support Sequelize and Knex)
* [RateLimiterCluster](https://github.com/animir/node-rate-limiter-flexible/wiki/Cluster)
* [RateLimiterCluster](https://github.com/animir/node-rate-limiter-flexible/wiki/Cluster) (with PM2 support)
* [RateLimiterMemory](https://github.com/animir/node-rate-limiter-flexible/wiki/Memory)

@@ -100,0 +100,0 @@ * [RateLimiterUnion](https://github.com/animir/node-rate-limiter-flexible/wiki/RateLimiterUnion) Combine 2 or more limiters to act as single

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc