Adonis Throttle
A rate limiter for Adonis 4.1
Installation
For AdonisJS below version 4.1, you need install 2.0.x
To get the latest version of Adonis Throttle, simply run:
adonis install adonis-throttle
Once Adonis Throttle is installed, you need to register the service provider. Open up bootstrap/app.js and add the following to the providers key.
// start/app.jsconst providers = ... 'adonis-throttle/providers/ThrottleProvider'
You can register the Throttle facade in the aliases key of your bootstrap/app.js file if you like.
// start/app.jsconst aliases = ... Throttle: 'Adonis/Addons/Throttle'
Enable the throttle middleware inside start/kernel.js
file.
// start/kernel.js const namedMiddleware = ... throttle: 'Adonis/Middleware/Throttle'
Usage
Middleware
Use the throttle middleware to limit request for a given route.
// Default Throttle 60 request per minuteRoute
The following example throttle request be limiting the number of login attempts for 10 requests every 120 seconds.
Route
Throttle 10 request per minute
Route
If the subject exceeds the maximum number of requests, it will return Too Many Attempts. with status code of 429. By default we are extending the decay of the throttle by 5 seconds, for each request the subject after he exceeds the maximum number of requests.
Advanced usage
You can also use Throttle from inside your controllers or anywere else.
const Throttle = { const currentUser = requestauth // Limit for a specific user Throttle if !Throttle return response response }
Extending cache driver
You can write your own cache driver by extending Adonis/Addons/Throttle/Cache
abstract base class.
For the purpose of this example, assume the contents of the file below are
located at: ./lib/drivers/memcached
.
'use strict' const Cache = /** * Get stored data by key. * @param * * @return */ { // implement get } /** * Generate cache. * @param * @param * @param * * @return */ { // implement put } /** * Increment stored value by one. * @param * * @return */ { // implement increment return this } /** * Increment expiration of stored data by number of seconds. * @param * @param * * @return */ { // implement incrementExpiration return this } /** * Get number of seconds left until cache data is cleared. * @param * * @return */ { // implement secondsToExpiration }
Then in start/hooks.js
, register your driver:
'use strict' const ioc = const hooks = const Memcached = hooksafter