Максимальное количество ожидающих запросов в очереди для одного ключа (по умолчанию 100). При превышении очередь перестаёт принимать новые запросы и выбрасывается исключение.
Время в миллисекундах, после которого запись (очередь + счётчик) удаляется, если не было активности. По умолчанию 60000 (1 минута).
OptionalgetKey: (ctx: BotController) => stringКлюч счётчика для запроса. По умолчанию {platform}:{userId}. На платформах
без подписи вебхука (Алиса, Маруся, SmartApp) и без заданного секрета userId
задаёт отправитель: меняя его, атакующий обходит лимит на пользователя. Ключ
ctx => ctx.appType ?? '' ограничивает суммарную нагрузку на платформу.
Middleware-функцию для использования в bot.use().
import { rateLimiter } from 'umbot/middleware';
// Подключаем middleware с параметрами по умолчанию
bot.use(rateLimiter());
// Или с кастомными настройками
bot.use(rateLimiter(200, 120000));
// Общий лимит на платформу, а не на пользователя
bot.use(rateLimiter(100, 60000, (ctx) => ctx.appType ?? ''));
Создаёт middleware для ограничения частоты входящих запросов (rate limiting) на уровне платформы.
Для чего используется: Некоторые платформы (например, Max, Telegram, VK, Viber — их адаптеры задают
limit = 30) имеют ограничение на количество отправляемых запросов в секунду. Данный middleware защищает от превышения этого лимита, автоматически задерживая запросы, если они поступают слишком часто.Как это работает:
limitадаптера платформы (platformAdapter.limit). Если свойство не задано или равно 0, ограничение не применяется.{platform}:{userId}ведётся отдельная очередь и счётчик запросов.maxQueueSize); при переполнении выбрасывается исключение RateLimitQueueOverflowError, а вctx.platformOptions.rateLimitOverflowвыставляется флаг: исключение перехватывается ядром как «обработка прервана» (платформа получит 200), поэтому флаг — способ понять, что запрос отклонён из-за перегрузки.inactivityTimeout) автоматически удаляются из памяти.Важные особенности:
{platform}:{userId}, то есть ограничивается частота запросов одного пользователя, а не суммарная нагрузка на бота.bot.use(rateLimiter()).unref(), поэтому не блокируют завершение процесса.