NAME
PAGI::Middleware::WebSocket::RateLimit - Rate limiting for WebSocket connections
SYNOPSIS
use PAGI::Middleware::Builder;
my $app = builder {
enable 'WebSocket::RateLimit',
messages_per_second => 10,
bytes_per_second => 65536,
burst_multiplier => 2;
$my_app;
};
DESCRIPTION
PAGI::Middleware::WebSocket::RateLimit enforces rate limits on incoming WebSocket messages. Connections exceeding limits can be throttled or closed.
CONFIGURATION
messages_per_second (default: 100)
Maximum incoming messages per second.
bytes_per_second (default: 1048576)
Maximum incoming bytes per second (1MB default).
burst_multiplier (default: 2)
Allow bursts up to N times the limit before enforcing.
on_limit_exceeded (optional)
Callback when limit exceeded. Receives ($scope, $type, $current, $limit). Return true to close connection, false to just drop the message.
close_code (default: 1008)
WebSocket close code when closing due to rate limit (Policy Violation).
close_reason (default: 'Rate limit exceeded')
Close reason message.
ALGORITHM
This middleware uses a token bucket algorithm:
Each connection has message and byte token buckets
Tokens refill at the configured rate
Burst capacity allows temporary spikes
When tokens depleted, messages are dropped or connection closed
SCOPE EXTENSIONS
pagi.websocket.rate_limit
Hashref containing rate limit configuration.
CALLBACK EXAMPLE
enable 'WebSocket::RateLimit',
messages_per_second => 10,
on_limit_exceeded => sub {
my ($scope, $type, $current, $limit) = @_;
warn "Rate limit exceeded for $scope->{client}[0]: $type\n";
return 1; # Close connection
};
SEE ALSO
PAGI::Middleware - Base class for middleware
PAGI::Middleware::RateLimit - HTTP rate limiting
PAGI::Middleware::WebSocket::Heartbeat - WebSocket keepalive