defmodule PlugLimit.FixedWindow do @moduledoc """ Fixed window rate limiter Plug. `PlugLimit.FixedWindow` is a convenience wrapper build on top of a `PlugLimit` plug. Module provides syntactic sugar for fixed window algorithm specific options. ## Usage Example usage: ```elixir #lib/my_app_web/controllers/page_controller.ex plug PlugLimit.FixedWindow, [ limit: 10, ttl: 60, key: {MyApp.RateLimiter, :my_key, "page_controller:fixed_window"} ] when action in [:create] ``` Action `:create` in `PageController` will be protected by fixed window rate-limiter. Users will be able to issue up to 10 requests in 60 seconds time window. Example code above corresponds to the following direct `PlugLimit` usage: ```elixir #lib/my_app_web/controllers/page_controller.ex plug PlugLimit, [ limiter: :fixed_window, opts: [10, 60], key: {MyApp.RateLimiter, :my_key, "page_controller:fixed_window"} ] when action in [:create] ``` ## Configuration Configuration options: * `:limit` - requests limit. Required. * `:ttl` - rate-limiter time to live (time-window length) defined as number of seconds. Required. * `:key` - same as `PlugLimit` `:key` configuration option. Required. """ @behaviour Plug @impl true @doc false def init(opts) do limit = Keyword.fetch!(opts, :limit) ttl = Keyword.fetch!(opts, :ttl) key = Keyword.fetch!(opts, :key) PlugLimit.init( limiter: :fixed_window, opts: [limit, ttl], key: key ) end @impl true @doc false def call(conn, conf), do: PlugLimit.call(conn, conf) end