umbot
    Preparing search index...
    • Создаёт middleware для ограничения частоты входящих запросов (rate limiting) на уровне платформы.

      🎯 Для чего используется: Некоторые платформы (например, Max, Telegram, VK, Viber) имеют ограничение на количество отправляемых ботом запросов в секунду (обычно 30). Данный middleware защищает от превышения этого лимита, автоматически задерживая запросы, если они поступают слишком часто.

      ⚙️ Как это работает:

      • Лимит берётся из свойства limit адаптера платформы (platformAdapter.limit). Если свойство не задано или равно 0, ограничение не применяется.
      • Для каждой комбинации {platform}:{userId} ведётся отдельная очередь и счётчик запросов.
      • Счётчик сбрасывается каждую секунду, что позволяет точно соблюдать лимит в скользящем окне.
      • Если лимит исчерпан, запрос помещается в очередь и будет выполнен, когда появится свободное «окно».
      • Очередь имеет максимальный размер (maxQueueSize); при переполнении выбрасывается ошибка.
      • Запросы в очереди выполняются с равномерной задержкой (⌈1000/limit⌉ мс), чтобы не превышать лимит.
      • Неактивные записи (без запросов дольше inactivityTimeout) автоматически удаляются из памяти.

      🧠 Важные особенности:

      • Middleware применяется только к входящим запросам (webhook). Для исходящих уведомлений ограничение нужно реализовывать непосредственно в адаптерах платформ.
      • Функцию необходимо вызвать при подключении: bot.use(rateLimiter()).
      • Все внутренние таймеры используют unref(), поэтому не блокируют завершение процесса.

      Parameters

      • maxQueueSize: number = 100

        Максимальное количество ожидающих запросов в очереди для одного ключа (по умолчанию 100). При превышении очередь перестаёт принимать новые запросы и выбрасывается исключение.

      • inactivityTimeout: number = 60000

        Время в миллисекундах, после которого запись (очередь + счётчик) удаляется, если не было активности. По умолчанию 60000 (1 минута).

      Returns (ctx: BotController, next: MiddlewareNext) => Promise<void>

      Middleware-функция для использования в bot.use().

      import { rateLimiter } from 'umbot/middleware';

      // Подключаем middleware с параметрами по умолчанию
      bot.use(rateLimiter());

      // Или с кастомными настройками
      bot.use(rateLimiter(200, 120000));

      Чтобы лимит заработал для вашей платформы, добавьте в соответствующий адаптер публичное поле limit:

      export class TelegramAdapter extends BasePlatform {
      public limit = 30;
      // ...
      }