{"_id":"@backpack/redis-rate-limiter","_rev":"4-bfc9cf92b7923fba8ebf56d8f1e450cc","name":"@backpack/redis-rate-limiter","description":"Rate-limit any operation, backed by Redis","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.5":{"name":"@backpack/redis-rate-limiter","version":"1.0.5","description":"Rate-limit any operation, backed by Redis","author":{"name":"Forked from Tabcorp Digital Team"},"license":"MIT","main":"lib/index.js","repository":{"type":"git","url":"git+https://github.com/backpack-technologies/redis-rate-limiter.git"},"scripts":{"lint":"require-lint","test":"mocha"},"dependencies":{"moment":"~2.15.0"},"devDependencies":{"async":"~2.1.1","express":"~4.14.0","lodash":"~4.16.0","mocha":"~3.1.1","redis":"~2.6.0-0","require-lint":"^1.1.1","should":"~11.1.1","supertest":"~2.0.0"},"gitHead":"778272942ca17093c62844050dd413093910898d","bugs":{"url":"https://github.com/backpack-technologies/redis-rate-limiter/issues"},"homepage":"https://github.com/backpack-technologies/redis-rate-limiter#readme","_id":"@backpack/redis-rate-limiter@1.0.5","_shasum":"a96d93dc9dbc4030d8ac3b7284df989a5cf1c3e6","_from":".","_npmVersion":"3.10.8","_nodeVersion":"7.0.0","_npmUser":{"name":"backpack","email":"devops@backpackbang.com"},"dist":{"shasum":"a96d93dc9dbc4030d8ac3b7284df989a5cf1c3e6","tarball":"https://registry.npmjs.org/@backpack/redis-rate-limiter/-/redis-rate-limiter-1.0.5.tgz","integrity":"sha512-0OKHxHD9XSbKRsFYZg5FsKuzHXgA/jf9BAJAjw7fsEl0DH0s+qWWROwpoQkFDuVuK7cmszYw+SEJAA94wO9WTA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCR96G1sEvmPBPehVhz2D4SPaByB33MkKxNf+wYbOn02AIhAPn2jejsfA807n/Lh5nyiKtYrc/OMf8xD2qrKzQyBQJc"}]},"maintainers":[{"name":"backpack","email":"devops@backpackbang.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/redis-rate-limiter-1.0.5.tgz_1478160396651_0.6345727129373699"}},"2.0.0":{"name":"@backpack/redis-rate-limiter","version":"2.0.0","description":"Rate-limit any operation, backed by Redis","author":{"name":"Forked from Tabcorp Digital Team"},"license":"MIT","main":"lib/index.js","repository":{"type":"git","url":"git+https://github.com/backpack-technologies/redis-rate-limiter.git"},"scripts":{"lint":"require-lint","test":"mocha"},"dependencies":{"moment":"~2.15.0"},"devDependencies":{"async":"~2.1.1","express":"~4.14.0","lodash":"~4.16.0","mocha":"~3.1.1","redis":"~2.6.0-0","require-lint":"^1.1.1","should":"~11.1.1","supertest":"~2.0.0"},"gitHead":"08e01fa97a736cc467e5ffb47fbbc93d1e5c8324","bugs":{"url":"https://github.com/backpack-technologies/redis-rate-limiter/issues"},"homepage":"https://github.com/backpack-technologies/redis-rate-limiter#readme","_id":"@backpack/redis-rate-limiter@2.0.0","_shasum":"258e17bf392add41d4dbcbc4ed633ae44cc7a9b9","_from":".","_npmVersion":"3.10.8","_nodeVersion":"7.0.0","_npmUser":{"name":"backpack","email":"devops@backpackbang.com"},"dist":{"shasum":"258e17bf392add41d4dbcbc4ed633ae44cc7a9b9","tarball":"https://registry.npmjs.org/@backpack/redis-rate-limiter/-/redis-rate-limiter-2.0.0.tgz","integrity":"sha512-XNZzybLjgE4nZbW5wKIwEa0jcMsIBXS9h7vZto9p0+eKob4OycPZw1qGY0+T3SRwst3P2Sf+nO8NuaYc1WtKgw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBSgGhVrm3z0vk68/l7IvBBE59g0QW1YtB7kb4SUfDG1AiAskgEOsfOmzhqRmjz2aguFvI1APE55W8OCqKjSnZlOew=="}]},"maintainers":[{"name":"backpack","email":"devops@backpackbang.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/redis-rate-limiter-2.0.0.tgz_1478167689970_0.05401674355380237"}}},"readme":"# redis-rate-limiter\n\n[![NPM](http://img.shields.io/npm/v/redis-rate-limiter.svg?style=flat)](https://npmjs.org/package/redis-rate-limiter)\n[![License](http://img.shields.io/npm/l/redis-rate-limiter.svg?style=flat)](https://github.com/TabDigital/redis-rate-limiter)\n\n[![Build Status](http://img.shields.io/travis/TabDigital/redis-rate-limiter.svg?style=flat)](http://travis-ci.org/TabDigital/redis-rate-limiter)\n[![Dependencies](http://img.shields.io/david/TabDigital/redis-rate-limiter.svg?style=flat)](https://david-dm.org/TabDigital/redis-rate-limiter)\n[![Dev dependencies](http://img.shields.io/david/dev/TabDigital/redis-rate-limiter.svg?style=flat)](https://david-dm.org/TabDigital/redis-rate-limiter)\n[![Known Vulnerabilities](https://snyk.io/package/npm/redis-rate-limiter/badge.svg)](https://snyk.io/package/npm/redis-rate-limiter)\n\nRate-limit any operation, backed by Redis.\n\n- Inspired by [ratelimiter](https://www.npmjs.org/package/ratelimiter)\n- But uses a fixed-window algorithm\n- Great performance (>10000 checks/sec on local redis)\n- No race conditions\n\nVery easy to plug into `Express` or `Restify` to rate limit your `Node.js` API.\n\n## Usage\n\nStep 1: create a Redis connection\n\n```js\nvar redis = require('redis');\nvar client = redis.createClient(6379, 'localhost', {enable_offline_queue: false});\n```\n\nStep 2: create your rate limiter\n\n```js\nvar rateLimiter = require('redis-rate-limiter');\nvar limit = rateLimiter.create({\n  redis: client,\n  key: function(x) { return x.id },\n  rate: '100/minute'\n});\n```\n\nAnd go\n\n```js\nlimit(request, function(err, rate) {\n  if (err) {\n    console.warn('Rate limiting not available');\n  } else {\n    console.log('Rate window: '  + rate.window);  // 60\n    console.log('Rate limit: '   + rate.limit);   // 100\n    console.log('Rate current: ' + rate.current); // 74\n    if (rate.over) {\n      console.error('Over the limit!');\n    }\n  }\n});\n```\n\n## Options\n\n### `redis`\n\nA pre-created Redis client.\nMake sure offline queueing is disabled.\n\n```js\nvar client = redis.createClient(6379, 'localhost', {\n  enable_offline_queue: false\n});\n```\n\n### `key`\n\nThe key is how requests are grouped for rate-limiting.\nTypically, this would be a user ID, a type of operation.\n\nYou can also specify any custom function:\n\n```js\n// rate-limit each user separately\nkey: function(x) { return x.user.id; }\n\n// rate limit per user and operation type\nkey: function(x) { return x.user.id + ':' + x.operation; }\n\n// rate limit everyone in the same bucket\nkey: function(x) { return 'single-bucket'; }\n```\n\nYou can also use the built-in `ip` shorthand, which gets the remote address from an HTTP request.\n\n```js\nkey: 'ip'\n```\n\n### `window`\n\nThis is the duration over which rate-limiting is applied, in seconds.\n\n```js\n// rate limit per minute\nwindow: 60\n\n// rate limit per hour\nwindow: 3600\n```\n\nNote that this is **not a rolling window**.\nIf you specify `10 requests / minute`, a user would be able\nto execute 10 requests at `00:59` and another 10 at `01:01`.\nThen they won't be able to make another request until `02:00`.\n\n\n### `limit`\n\nThis is the total number of requests a unique `key` can make during the `window`.\n\n```js\nlimit: 100\n```\n\n### `rate`\n\nRate is a shorthand notation to combine `limit` and `window`.\n\n```js\nrate: '10/second'\nrate: '100/minute'\nrate: '1000/hour'\n```\n\nOr the even shorter\n\n```js\nrate: '10/s'\nrate: '100/m'\nrate: '100/h'\n```\n\n*Note:* the rate is parsed ahead of time, so this notation doesn't affect performance.\n\n## HTTP middleware\n\nThis package  contains a pre-built middleware,\nwhich takes the same options\n\n\n```js\nvar rateLimiter = require('redis-rate-limiter');\n\nvar middleware = rateLimiter.middleware({\n  redis: client,\n  key: 'ip',\n  rate: '100/minute'\n});\n\nserver.use(middleware);\n```\n\nIt rejects any rate-limited requests with a status code of `HTTP 429`,\nand an empty body.\n\n*Note:* if you want to rate limit several routes individually, don't forget to use the route name as part of the `key`, for example using Restify:\n\n```js\nfunction ipAndRoute(req) {\n  return req.connection.remoteAddress + ':' + req.route.name;\n}\n\nserver.get(\n  {name: 'routeA', path: '/a'},\n  rateLimiter.middleware({redis: client, key: ipAndRoute, rate: '10/minute'}),\n  controllerA\n);\n\nserver.get(\n  {name: 'routeB', path: '/b'},\n  rateLimiter.middleware({redis: client, key: ipAndRoute, rate: '20/minute'}),\n  controllerB\n);\n```\n","maintainers":[{"name":"backpack","email":"devops@backpackbang.com"}],"time":{"modified":"2022-06-12T15:01:49.388Z","created":"2016-11-03T08:06:36.889Z","1.0.5":"2016-11-03T08:06:36.889Z","2.0.0":"2016-11-03T10:08:11.663Z"},"homepage":"https://github.com/backpack-technologies/redis-rate-limiter#readme","repository":{"type":"git","url":"git+https://github.com/backpack-technologies/redis-rate-limiter.git"},"author":{"name":"Forked from Tabcorp Digital Team"},"bugs":{"url":"https://github.com/backpack-technologies/redis-rate-limiter/issues"},"license":"MIT","readmeFilename":"README.md"}