glimit

Package Version Hex Docs test

A simple, framework-agnostic rate limiter for Gleam with pluggable storage. ๐Ÿ’ซ

Features

Usage

A very minimalistic example of how to use glimit would be the following snippet:

import glimit

let limiter =
  glimit.new()
  |> glimit.per_second(2)
  |> glimit.identifier(fn(x) { x })
  |> glimit.on_limit_exceeded(fn(_) { "Stop!" })

let func =
  fn(_) { "OK" }
  |> glimit.apply(limiter)

func("๐Ÿš€") // "OK"
func("๐Ÿ’ซ") // "OK"
func("๐Ÿ’ซ") // "OK"
func("๐Ÿ’ซ") // "Stop!"
func("๐Ÿš€") // "OK"
func("๐Ÿš€") // "Stop!"

More practical examples can be found in the examples/ directory, such as Wisp or Mist servers, or a Redis backend.

Pluggable Store Backend

By default, rate limit state is stored in-memory using an OTP actor. For distributed rate limiting across multiple nodes, you can provide a custom Store that persists bucket state in an external service like Redis or Postgres.

All token bucket logic stays in glimit โ€” adapters only implement simple get/set/lock/unlock operations. The glimit/bucket module provides to_pairs/from_pairs helpers for serialization.

See examples/redis/ for a complete Redis adapter using valkyrie.

In-memory Mode

When no store is configured, the rate limiter uses the default in-memory backend. This is simple and fast, but scoped to the BEAM VM cluster it runs in. If your application runs across multiple BEAM VM clusters, rate limits will not be shared between them.

Performance

All rate limiter state is held in a single OTP actor. Each hit is one message to this actor, which performs the token bucket calculation inline.

Documentation

Further documentation can be found at https://hexdocs.pm/glimit/glimit.html.

Contributing

Contributions like PRโ€™s, bug reports or suggestions are more than welcome! โ™ฅ๏ธ

โœจ Search Document