{"id":15679390,"url":"https://github.com/4xposed/minirate","last_synced_at":"2025-05-07T10:11:00.839Z","repository":{"id":57526886,"uuid":"237673152","full_name":"4xposed/minirate","owner":"4xposed","description":"A dead simple distributed rate limiting library in Elixir using Mnesia.","archived":false,"fork":false,"pushed_at":"2024-08-27T19:21:50.000Z","size":34,"stargazers_count":12,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-19T20:54:15.101Z","etag":null,"topics":["distributed","elixir","mnesia","plug","rate-limiter","rate-limiting"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/4xposed.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-02-01T20:24:52.000Z","updated_at":"2024-08-27T17:59:59.000Z","dependencies_parsed_at":"2024-08-27T19:30:33.845Z","dependency_job_id":"1037eab5-d9ca-4709-9d06-ac8f81ab331b","html_url":"https://github.com/4xposed/minirate","commit_stats":{"total_commits":17,"total_committers":1,"mean_commits":17.0,"dds":0.0,"last_synced_commit":"b0636893e44335826b0b0a47a941cad499893291"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4xposed%2Fminirate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4xposed%2Fminirate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4xposed%2Fminirate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4xposed%2Fminirate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/4xposed","download_url":"https://codeload.github.com/4xposed/minirate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252856555,"owners_count":21814858,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distributed","elixir","mnesia","plug","rate-limiter","rate-limiting"],"created_at":"2024-10-03T16:30:10.006Z","updated_at":"2025-05-07T10:11:00.786Z","avatar_url":"https://github.com/4xposed.png","language":"Elixir","readme":"![Elixir CI](https://github.com/4xposed/minirate/workflows/Elixir%20CI/badge.svg?event=push)\n\n# Minirate\n\nA dead simple distributed rate limiting library in Elixir using Mnesia.\n\n# What is it?\n\nA distributed rate limiter with a focus on readable and well tested code.\n\nThe counter is syncronized over all connected nodes\n\n```elixir\niex(test2@127.0.0.1)19\u003e Minirate.check_limit(\"download\", \"user_1\", 100)\n{:allow, 1}\n```\n```elixir\niex(test1@127.0.0.1)14\u003e Minirate.check_limit(\"download\", \"user_1\", 100)\n{:allow, 2}\n```\n\n## Installation\n\nMinirate is availabe as a package in Hex, just add it to your `mix.exs` file:\n\n```elixir\ndef deps\n  [{:minirate, \"~\u003e 0.1\"}]\nend\n```\n\nand add it to your extra applications:\n```elixir\ndef applications do\n[\n  extra_applications: [:minirate]\n]\n```\n\n## Configuration\n\nMinirate needs to be configured using Mix.Config.\n\nFor example, in `config/config.exs`:\n\n```\nconfig :minirate,\n  mnesia_table: :rate_limiter,\n  expiry_ms: 60_000\n  cleanup_period_ms: 10_000\n```\n\n`mnesia_table` specifies which table will Mnesia use to write the counters.\n`expiry_ms` specifies the counter life in millisecconds (for example to have rates like x request every 10 seconds, you would set `expiry_ms` to 10_000)\n`cleanup_period_ms` specifies how often minirate will clean expired counters from the mnesia database\n\n\n## Usage\n\nWith Minirate you can rate limit any action on your application.\n\nThe module `Minirate` the function `check_limit(action_name, identifier, limit)`\n\nAn Example:\n\n```elixir\n@download_limit 1_000\n\ndef download_file(file, user_id) do\n  case Minirate.check_limit(\"download_file\", user_id, @download_limit) do\n    {:allow, _count} -\u003e\n      # Logic to download the file\n\n    {:block, _reason} -\u003e\n      # Logic when the limit has been reached\n\n    {:skip, _reason} -\u003e\n     # Skip will only happen if there's a problem with your nodes or mnesia setup and a count cannot be determined.\n  end\n```\n\n## Using Minirate.Plug\n\n`Minirate.Plug` can rate-limit actions in your web application using the ip address of the requester.\n\nYou can just put in the pipeline of your web application something like this:\n\n```elixir\nplug Minirate.Plug, [action: action, limit: 10_000]\n```\n\nor for more flexibilty:\n```elixir\nplug Minirate.Plug, [action: \"custom_action\", limit: 10_000] when action == :update or action == :create\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4xposed%2Fminirate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F4xposed%2Fminirate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4xposed%2Fminirate/lists"}