Saltar al contenido principal

Límites de tarifas

Chastify limita la velocidad del tráfico de la API de extensión para proteger las sesiones de bloqueo, el almacenamiento, los dispositivos y los sistemas de notificación.

Se aplican límites de velocidad tanto al tráfico del puente iframe enrutado a través de Chastify como a las llamadas al backend realizadas con claves de API para desarrolladores.

Cubos de extensión actuales

CuboLímitePuntos finales típicos
Lectura300/minsession.get, state.get, metadata.get, lecturas de archivos, estado de acción regular
Escritura120/minEscrituras de estado del backend, actualizaciones de metadatos, configuración de acciones regulares, creación de ejecución verificada por el servidor
Cargar10/minCarga de archivos de ejecución y configuración
Acción30/minBloquear acciones, comandos de dispositivo, registros personalizados, notificaciones personalizadas, liquidación de resultados verificados por el servidor
Token30/minGeneración de token de autenticación/lanzamiento de sesión Iframe

Los límites se evalúan en un intervalo de un minuto.

nota

Estos son los valores predeterminados de la plataforma. Los administradores/propietarios del sitio Chastify pueden configurar anulaciones por extensión para extensiones oficiales o con un volumen de solicitudes excepcionalmente alto. Las anulaciones se almacenan en la configuración de la aplicación de la extensión y se guardan brevemente en caché en Redis para una búsqueda rápida de la ruta de la solicitud.

info

Los límites de carga y acción son intencionadamente más estrictos que los de lectura/estado. Las cargas consumen almacenamiento y ancho de banda. Las acciones pueden afectar al estado de bloqueo, los dispositivos, las notificaciones y el historial visible para el usuario.

Cómo se cuentan las llaves

Las claves de limitación de velocidad incluyen:

  • ID de usuario autenticado Chastify cuando la interfaz de usuario de primera parte llama a un punto final
  • ID de clave API de desarrollador cuando su backend llama a los puntos finales de sesión de extensión
  • Dirección IP para rutas anónimas o no autenticadas
  • el objetivo sessionId o lockId cuando esté disponible

Esto significa que una sesión de extensión ruidosa no debería consumir todo el presupuesto global de la API de extensiones.

Tu iframe o backend debe tratar 429 Too Many Requests como una condición normal que permite reintentos.

Utilice un retroceso exponencial para fallos repetidos:

async function callWithBackoff<T>(fn: () => Promise<T>, attempts = 4): Promise<T> {
let delayMs = 500;

for (let attempt = 1; attempt <= attempts; attempt += 1) {
try {
return await fn();
} catch (error: any) {
const status = error?.status ?? error?.response?.status;
if (status !== 429 || attempt === attempts) throw error;

await new Promise((resolve) => setTimeout(resolve, delayMs));
delayMs *= 2;
}
}

throw new Error("request_failed");
}

Guía de puente Iframe

Para clientes de puente iframe:

  • Almacene en caché los resultados de session.get durante la vida útil de la página, a menos que necesite datos de bloqueo actualizados.
  • Almacena localmente los cambios transitorios de la interfaz de usuario y envía los cambios de confianza a tu servidor backend.
  • Evite realizar sondeos rápidos. Prefiera lecturas iniciadas por el usuario o intervalos de actualización lentos.

Ejemplo de guardado en el backend con retardo:

let saveTimer: number | undefined;

function scheduleStateSave(data: Record<string, unknown>) {
window.clearTimeout(saveTimer);
saveTimer = window.setTimeout(() => {
fetch("/your-extension-backend/state", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}).catch(console.error);
}, 500);
}

Guía de extensión de backend

Para llamadas al backend con una clave API de desarrollador:

  • Mantenga las acciones privilegiadas verificadas por el servidor y activadas por el usuario.
  • Utilice PUT/PATCH /api/extensions/sessions/:sessionId/state únicamente desde su backend con credenciales de API de desarrollador.
  • No vuelva a intentar las acciones de bloqueo a ciegas si el primer intento pudo haber tenido éxito.
  • Hacer que el asentamiento del juego/desafío sea idempotente con un ID de ejecución.
  • Solo se permitirá la carga de archivos cuando el usuario envíe un archivo explícitamente.
  • Almacene sus propios registros externos si necesita telemetría de alta frecuencia.
aviso

Nunca aumente los límites de acciones para compensar las llamadas al navegador no verificadas. El código iframe del navegador no es confiable. Las mutaciones sensibles deben ser validadas por su backend antes de llamar a Chastify.

¿Qué categoría debo esperar?

Ejemplos comunes:

  • GET /api/extensions/sessions/:sessionId utiliza el depósito de lectura.
  • GET /api/extensions/sessions/:sessionId/state utiliza el depósito de lectura.
  • PUT/PATCH /api/extensions/sessions/:sessionId/state utiliza el depósito de escritura.
  • POST /api/extensions/sessions/:sessionId/files utiliza el bucket de carga.
  • POST /api/extensions/sessions/:sessionId/action utiliza el cubo de acciones.
  • POST /api/extensions/sessions/:sessionId/device-command utiliza el cubo de acciones.
  • POST /api/extensions/sessions/:sessionId/logs/custom utiliza el cubo de acciones.
  • POST /api/extensions/sessions/:sessionId/notifications/custom utiliza el cubo de acciones.
  • GET /api/extensions/sessions/:sessionId/auth utiliza el depósito de tokens.

Cubos granulares del futuro

Las categorías actuales son amplias. Chastify podría subdividirlas aún más a medida que crezca la API para desarrolladores, por ejemplo:

  • state.write
  • metadata.write
  • lock.action
  • notifications.custom
  • device.command
  • files.upload

Los administradores/propietarios del sitio Chastify pueden aumentar los límites por extensión cuando una extensión oficial o aprobada de alto volumen tenga una necesidad legítima. Diseñe los clientes de manera que el manejo de 429 sea genérico y no dependa de nombres de bucket exactos ni de valores predeterminados fijos de la plataforma.