{"_id":"@destinationstransfers/ratelimiter","_rev":"2-74fcfc1cf2b1f4a5ea1bdb99be8a03cf","name":"@destinationstransfers/ratelimiter","description":"abstract rate limiter backed by redis","dist-tags":{"latest":"4.0.0"},"versions":{"3.1.0":{"name":"@destinationstransfers/ratelimiter","version":"3.1.0","repository":{"type":"git","url":"git+https://github.com/destinationstransfers/ratelimiter.git"},"bugs":{"url":"https://github.com/destinationstransfers/ratelimiter/issues"},"homepage":"https://github.com/destinationstransfers/ratelimiter#readme","description":"abstract rate limiter backed by redis","keywords":["rate","ratelimit","limiter","limit"],"scripts":{"test":"jest --forceExit"},"engines":{"node":">=8"},"author":{"name":"Tino Vyatkin","email":"tino@vtkn.io"},"files":["index.js","microtime.js"],"main":"index.js","dependencies":{},"devDependencies":{"@destinationstransfers/eslint-config":"^1.5.0","eslint":"^4.12.0","ioredis":"1.15.1","jest":"^21.2.1","redis":"2.6.0-1","remark-cli":"^4.0.0","remark-preset-lint-consistent":"^2.0.1","remark-preset-lint-recommended":"^3.0.1"},"license":"MIT","remarkConfig":{"presets":["lint-recommended","lint-consistent"]},"jest":{"collectCoverage":true,"testEnvironment":"node","verbose":true,"bail":true},"eslintConfig":{"plugins":["node"],"extends":["@destinationstransfers","plugin:node/recommended"],"env":{"node":true},"parserOptions":{"sourceType":"script"}},"gitHead":"2737118e36b201e1eaafe0b5d74f8b18d92c2efb","_id":"@destinationstransfers/ratelimiter@3.1.0","_npmVersion":"5.5.1","_nodeVersion":"9.2.0","_npmUser":{"name":"tinovyatkin","email":"tino@vtkn.io"},"dist":{"integrity":"sha512-HLp/mf8l/iYFSWj5NWTF6KnnSaWJ7ecN+OPnV5j84l23XSgQq7U8tLnzPOM/EDGLk+aOFEWsyWnadbVL6P987Q==","shasum":"6edc473acd39738fc02a3ab044a9b3c6ea65b5d7","tarball":"https://registry.npmjs.org/@destinationstransfers/ratelimiter/-/ratelimiter-3.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHsVaEpZIVrGyCeHws8Day6+NsmF0/QSL+GoCS6BRpFyAiB+tXkknRO0LZdKv12B5PHQAGXEeuNIHqU8jpTjvNwLbg=="}]},"maintainers":[{"name":"tinovyatkin","email":"tino@vtkn.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ratelimiter-3.1.0.tgz_1511729081090_0.7976703757885844"}},"4.0.0":{"name":"@destinationstransfers/ratelimiter","version":"4.0.0","repository":{"type":"git","url":"git+https://github.com/destinationstransfers/ratelimiter.git"},"bugs":{"url":"https://github.com/destinationstransfers/ratelimiter/issues"},"homepage":"https://github.com/destinationstransfers/ratelimiter#readme","description":"abstract rate limiter backed by redis","keywords":["rate","ratelimit","limiter","limit"],"scripts":{"test":"jest --forceExit"},"engines":{"node":">=8"},"author":{"name":"Tino Vyatkin","email":"tino@vtkn.io"},"files":["index.js","microtime.js"],"main":"index.js","dependencies":{},"devDependencies":{"@destinationstransfers/eslint-config":"^1.5.0","eslint":"^4.12.0","ioredis":"1.15.1","jest":"^21.2.1","redis":"2.6.0-1","remark-cli":"^4.0.0","remark-preset-lint-consistent":"^2.0.1","remark-preset-lint-recommended":"^3.0.1"},"license":"MIT","remarkConfig":{"presets":["lint-recommended","lint-consistent"]},"jest":{"collectCoverage":true,"testEnvironment":"node","verbose":true,"bail":true},"eslintConfig":{"plugins":["node"],"extends":["@destinationstransfers","plugin:node/recommended"],"env":{"node":true},"parserOptions":{"sourceType":"script"}},"gitHead":"68fec55f095b17ff1997efb48df9e150f16f98fd","_id":"@destinationstransfers/ratelimiter@4.0.0","_npmVersion":"5.5.1","_nodeVersion":"9.2.0","_npmUser":{"name":"tinovyatkin","email":"tino@vtkn.io"},"dist":{"integrity":"sha512-5PTk93ksH9QG8KOc3ABZ8sby2PesutDliVBw+IHdxR5vQasCOMdVPsg+Z+K9NY5rNohfkM+rLk2rMsUP0e8raA==","shasum":"f4b402aa64d3720adea90d611e896f9e7f4b9e8e","tarball":"https://registry.npmjs.org/@destinationstransfers/ratelimiter/-/ratelimiter-4.0.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIojGpBKNuikxsoHOHiXFbRYf3lVDsBQE5u739if55HAiEAwXdb0O2WSqzSgn/tlHO9tw3KUIu7vyNrTw3aLHvj7FA="}]},"maintainers":[{"name":"tinovyatkin","email":"tino@vtkn.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ratelimiter-4.0.0.tgz_1511747757681_0.19925313699059188"}}},"readme":"# ratelimiter\n\nRate limiter for Node.js backed by Redis.\n\n[![Build Status](https://travis-ci.org/destinationstransfers/ratelimiter.svg)](https://travis-ci.org/destinationstransfers/ratelimiter)\n[![codecov](https://codecov.io/gh/destinationstransfers/ratelimiter/branch/master/graph/badge.svg)](https://codecov.io/gh/destinationstransfers/ratelimiter)\n\n## Release Notes\n\nSee [CHANGELOG](CHANGELOG.md)\n\n## Requirements\n\n* Redis 2.6.12+ and Node >=7.6\n\n## Installation\n\n```\n$ npm install @destinationstransfers/ratelimiter\n```\n\n## Example\n\nExample Koa middleware implementation limiting against a `user._id`:\n\n```js\nconst Limiter = require('@destinationstransfers/ratelimiter')\nconst ms = require('ms');\nconst redis = require('redis');\nconst db = redis.createClient(...);\n\nconst limiter = new Limiter({ db });\n\n\n...\n\napp.use('*', async (ctx, next) => {\n  const limit = await limiter.get(ctx.session.user._id || ctx.ip);\n\n  ctx.set(\"X-RateLimit-Limit\", limit.total);\n  ctx.set(\"X-RateLimit-Remaining\", limit.remaining - 1);\n  ctx.set(\"X-RateLimit-Reset\", limit.reset);\n\n  // all good\n  debug(\"remaining %s/%s %s\", limit.remaining - 1, limit.total, id);\n  if (limit.remaining) return next();\n\n  // not good\n  const delta = (limit.reset * 1000 - Date.now()) | 0;\n  const after = (limit.reset - Date.now() / 1000) | 0;\n  ctx.set(\"Retry-After\", after);\n  ctx.throw(429, \"Rate limit exceeded, retry in \" + ms(delta, { long: true }));\n})\n```\n\n## Result Object\n\n* `total` - `max` value\n* `remaining` - number of calls left in current `duration` without decreasing\n  current `get`\n* `reset` - time in milliseconds until the end of current `duration`\n\n## Options\n\nConstructor parameters:\n\n* `db` - redis connection instance\n* `max` - max requests within `duration` [2500]\n* `duration` - of limit in milliseconds [3600000]\n\n`.get` parameter:\n\n* `id` - the identifier to limit against (typically a user id or IP, or token)\n\n# License\n\nMIT\n","maintainers":[{"name":"tinovyatkin","email":"tino@vtkn.io"}],"time":{"modified":"2022-04-05T04:01:15.680Z","created":"2017-11-26T20:44:41.956Z","3.1.0":"2017-11-26T20:44:41.956Z","4.0.0":"2017-11-27T01:55:58.550Z"},"homepage":"https://github.com/destinationstransfers/ratelimiter#readme","keywords":["rate","ratelimit","limiter","limit"],"repository":{"type":"git","url":"git+https://github.com/destinationstransfers/ratelimiter.git"},"author":{"name":"Tino Vyatkin","email":"tino@vtkn.io"},"bugs":{"url":"https://github.com/destinationstransfers/ratelimiter/issues"},"license":"MIT","readmeFilename":"Readme.md"}