Skip to content
forked from ExHammer/hammer

An Elixir rate-limiter with pluggable backends

License

Notifications You must be signed in to change notification settings

ruslandoga/hammer

 
 

Repository files navigation

hammer

Hammer

Build Status Hex.pm Documentation Total Download License

A rate-limiter for Elixir, with pluggable storage backends.

Hammer-Plug

We have a helper-library to make adding rate-limiting to your Phoenix (or other plug-based) application even easier: Hammer.Plug.

Installation

Hammer is available in Hex, the package can be installed by adding :hammer to your list of dependencies in mix.exs:

def deps do
  [
    {:hammer, "~> 6.1"}
  ]
end

Documentation

On HexDocs: https://hexdocs.pm/hammer/frontpage.html

The Tutorial is an especially good place to start.

Usage

Example:

defmodule MyApp.VideoUpload do

  def upload(video_data, user_id) do
    case Hammer.check_rate("upload_video:#{user_id}", 60_000, 5) do
      {:allow, _count} ->
        # upload the video, somehow
      {:deny, _limit} ->
        # deny the request
    end
  end

end

The Hammer module provides the following functions:

  • check_rate(id, scale_ms, limit)
  • check_rate_inc(id, scale_ms, limit, increment)
  • inspect_bucket(id, scale_ms, limit)
  • delete_buckets(id)

Backends are configured via Mix.Config:

config :hammer,
  backend: {Hammer.Backend.ETS, [expiry_ms: 60_000 * 60 * 4,
                                 cleanup_interval_ms: 60_000 * 10]}

See the Tutorial for more.

See the Hammer Testbed app for an example of using Hammer in a Phoenix application.

Available Backends

Getting Help

If you're having trouble, either open an issue on this repo

Acknowledgements

Hammer was inspired by the ExRated library, by grempe.

License

Copyright (c) 2023 June Kelly

This library is MIT licensed. See the LICENSE for details.

About

An Elixir rate-limiter with pluggable backends

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Elixir 100.0%