AshRateLimiter

Copy Markdown

An extension for Ash.Resource which adds the ability to rate limit access to actions.

rate_limit

Configure rate limiting for actions.

Backend

This library uses a pluggable backend for rate limiting. Any module implementing the AshRateLimiter.Backend behaviour can be used. See AshRateLimiter.Backend for more information.

Keys

The backend uses a "key" to identify which bucket to allocate an event against. You can use this to tune the rate limit for specific users or events.

You can provide either a statically configured string key, or a function of arity one or two, which when given a query/changeset and optional context object can generate a key.

The default is AshRateLimiter.key_for_action/2. See it's docs for more information.

Nested DSLs

Examples

rate_limit do
  backend MyApp.RateLimiter
  action :create, limit: 10, per: :timer.minutes(5)
end

Options

NameTypeDefaultDocs
backendmoduleThe rate limiting backend module

rate_limit.action

action action

Configure rate limiting for a single action.

It does this by adding a global change or preparation to the resource with the provided configuration. For more advanced configuration you can add the change/preparation directly to your action using AshRateLimiter.BuiltinChanges.rate_limit/1 or AshRateLimiter.BuiltinPreparations.rate_limit/1.

Arguments

NameTypeDefaultDocs
actionatomThe name of the action to limit

Options

NameTypeDefaultDocs
limitpos_integerThe maximum number of events allowed within the given period
perpos_integerThe time period (in milliseconds) for in which events are counted
keyString.t | (any -> any) | (any, any -> any)&AshRateLimiter.key_for_action/2The key used to identify the event. See above.
descriptionString.tA description of the rate limit
on:before_action | :before_transaction:before_actionThe lifecycle hook to use for rate limiting. :before_action (default) runs inside the transaction; :before_transaction runs outside the transaction, after validations.

Introspection

Target: AshRateLimiter