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

superlimiter

v1.0.1

Published

frequency limiter for node.js

Downloads

6

Readme

superlimiter

Build Status Coverage Status npm Github Releases

Installation

$ npm i superlimiter -S

Example

Use for koa frequency limit

const Koa = require('koa');
const Limiter = require('superlimiter');

const limiter = new Limiter(redis, {
  ttl: 60,
  max: 10,
  hash: (ctx) => {
    if (!ctx.session || !ctx.session.user) {
      return '';
    }
    return ctx.session.user.account;
  },
});

const app = new Koa();

// user session
app.use(session());

app.use(limiter.middleware());

// other middlewares
...

app.listen(8080);

API

constructor

  • client The redis client

  • options The options for limiter

  • options.ttl The ttl for frequency limit, default is 60

  • options.max The max count for frequency limit, default is 10

  • options.expired The expired for frequency limit, it should be HH:mm. If it's set, the ttl will be ignored

  • options.hash The function to get the hash key, default is _.identity, if return '', the limit will be ignore

  • options.prefix The prefix for the cache key

  • options.err The error will be throw when count max than options.max, default is new Error('Exceeded the limit frequency')

const Redis = require('ioredis');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});

seter

ttl expired prefix can be reset

const Redis = require('ioredis');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});
limiter.ttl = 60;
limiter.expired = '23:30';
limiter.prefix = 'my-test-';

getter

client options ttl expired prefix

const Redis = require('ioredis');
const assert = require('assert');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});
assert.equal(limiter.client, redis);
// {ttl : 10, .. ..}
console.info(limiter.options);
assert.equal(limiter.ttl, 10);
assert.equal(limiter.expired, '');
assert.equal(limiter.prefix, 'super-limiter-');

exec

Inc the count of the key, if the count bigger than max, it will be throw an error, otherwise it will be resolve. If the hash function return '', it will be resolve without any change of count.

  • ...args The arguments for the hash function
const Redis = require('ioredis');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});
limiter.exec('mykey').then(() => {
  console.info('pass');
}).catch(console.error);

getCount

  • ...args The arguments for the hash function
const Redis = require('ioredis');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});
limiter.getCount('mykey').then((count) => {
  console.info(count);
}).catch(console.error);

middleware

  • type The middleware's type, it can be koa or express, default is koa.

The middleware for koa and express. For koa, it will use ctx for the hash argument. For express, it will use req, res for the hash argument.

const Koa = require('koa');
const Limiter = require('superlimiter');

const limiter = new Limiter(redis, {
  ttl: 60,
  max: 10,
  hash: (ctx) => {
    if (!ctx.session || !ctx.session.user) {
      return '';
    }
    return ctx.session.user.account;
  },
});

const app = new Koa();

// user session
app.use(session());

app.use(limiter.middleware());

// other middlewares
...

app.listen(8080);

keys

Get the keys of this limiter

  • withTTL Get the ttl of key if set true, default is false
const Redis = require('ioredis');
const Limiter = require('superlimiter');

const redis = new Redis('redis://127.0.0.1:6379');
const limiter = new Limiter(redis, {
  ttl: 10,
});

// ["...", "..."]
limiter.keys().then(console.info).catch(console.error);

// [{"key": "...", "ttl": ..}, ...]
limiter.keys(true).then(console.info).catch(console.error);