Nonlinear Performance Magnification

    simple-limiter

    2.0.0 • Public • Published

    simple-limiter

    Build Status

    Code Coverage Report
    Documentation

    simple synchronous library to limit rate by any key using the token-bucket algorithm

    made to work with super-router

    Usage

    This is made to work with Super Router, but can work with any middleware. Simple Limiter doesn't handle request headers or response for you, but it does return values to make setting the headers and body easy:

    const SuperRouter = require('super-router');
    const RateLimiter = require('simple-limiter').RateLimiter;
     
    module.exports = function() {
      const limiter = New RateLimiter({
        limit             : 20,
        incrementInterval : 5000,
        increment         : 1,
      });
     
      app.use({
        path    : '/thispath',
        handler : (opts) => {
          const request = opts.request;
          const response = opts.response;
          const key = `${request.yourKey}`;
          const tokensRemaining = limiter.getTokensRemaining(key);
     
          response.setHeader('X-Rate-Limit-Limit', `${limiter.config.limit}`);
          response.setHeader('X-Rate-Limit-Remaining', `${tokensRemaining}`);
     
          limiter.decrementTokens(key, 5);
        },
      });
    };

    If you change the default increment and decrement amounts to suit your project, which is recommended, you will run into situations where the user will have tokens remaining, but not enough to cover the cost of a request.

    In this case, Simple Limiter throws a default error, which can be caught in middleware and served to the user as-is, or can be transformed to suit your project's standards:

    try {
      limiter.decrementTokens(ip);
    }
    catch (error) {
      response.setBody({
        id      : 'RateLimitError',
        code    : 429,
        message : 'Too Many Requests',
      });
    }

    Install

    npm i simple-limiter

    DownloadsWeekly Downloads

    1

    Version

    2.0.0

    License

    none

    Last publish

    Collaborators

    • endlist