Control de flujo (transformer-throttler)

Este plugin pone en cola la instancia de solicitudes de API salientes a través de Bottleneckopen in new window para evitar que su bot alcance los límites de velocidadopen in new window como se describe en esta sección avanzada de la documentación.

Existen límites no documentados en la API

Telegram implementa límites de velocidad no especificados y no documentados para algunas llamadas de la API. Estos límites no documentados no son tenidos en cuenta por el estrangulador. Considera usar el plugin auto-retry junto con este plugin, si estás experimentando errores de floodwait para ciertas llamadas a la API, como api.sendContact.

Uso

Aquí hay un ejemplo de cómo usar este plugin con las opciones por defecto. Ten en cuenta que las opciones por defecto están alineadas con los límites de velocidad reales aplicados por Telegram, por lo que deberían estar bien.

import { Bot } from "grammy";
import { apiThrottler } from "@grammyjs/transformer-throttler";

const botToken = process.env.BOT_TOKEN;
if (!botToken) {
  throw Error("Se requiere BOT_TOKEN");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("I am throttled"));
bot.start();
const { Bot } = require("grammy");
const { apiThrottler } = require("@grammyjs/transformer-throttler");

const botToken = process.env.BOT_TOKEN;
if (!botToken) {
  throw Error("Se requiere BOT_TOKEN");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("I am throttled"));
bot.start();
import { Bot } from "https://deno.land/x/grammy@v1.13.1/mod.ts";
import { apiThrottler } from "https://deno.land/x/grammy_transformer_throttler@v1.2.1/mod.ts";

const botToken = Deno.env.get("BOT_TOKEN");
if (!botToken) {
  throw Error("Se requiere BOT_TOKEN");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("I am throttled"));
bot.start();

Configuración

El throttler acepta un único argumento opcional de la siguiente forma:

type ThrottlerOptions = {
  global?: Bottleneck.ConstructorOptions; // para limitar todas las llamadas a la API
  group?: Bottleneck.ConstructorOptions; // para limitar los mensajes de grupo salientes
  out?: Bottleneck.ConstructorOptions; // para limitar los mensajes privados salientes
};

La lista completa de propiedades de los objetos disponibles para Bottleneck.ConstructorOptions se puede encontrar en Bottleneckopen in new window.

Si no se pasa ningún argumento, el estrangulador creado utilizará los ajustes de configuración por defecto que deberían ser apropiados para la mayoría de los casos de uso. La configuración por defecto es la siguiente:

// Acelerador global saliente
const globalConfig = {
  reservoir: 30, // número de nuevos trabajos que el throttler aceptará al inicio
  reservoirRefreshAmount: 30, // número de trabajos que el throttler aceptará después de la actualización
  reservoirRefreshInterval: 1000, // intervalo en milisegundos en el que se refrescará el reservorio
};

// Acelerador de grupo saliente
const groupConfig = {
  maxConcurrent: 1, // sólo 1 trabajo a la vez
  minTime: 1000, // esperar esta cantidad de milisegundos para estar listo, después de un trabajo
  reservoir: 20, // número de nuevos trabajos que el throttler aceptará al inicio
  reservoirRefreshAmount: 20, // número de trabajos que el throttler aceptará después de la actualización
  reservoirRefreshInterval: 60000, // intervalo en milisegundos en el que se refrescará el reservorio
};

// Acelerador privado de salida
const outConfig = {
  maxConcurrent: 1, // sólo 1 trabajo a la vez
  minTime: 1000, // esperar esta cantidad de milisegundos para estar listo, después de un trabajo
};

Resumen del plugin