Revert "fix: pause Tiny calls globally after rate blocks"

This reverts commit c315265d16.
This commit is contained in:
Cauê Faleiros
2026-06-22 16:31:36 -03:00
parent c315265d16
commit ae41ae4a55

View File

@@ -9,11 +9,6 @@ const LOCK_STALE_MS = 30000;
const DEFAULT_BLOCK_RETRY_DELAY_MS = 120000; const DEFAULT_BLOCK_RETRY_DELAY_MS = 120000;
const DEFAULT_BLOCK_MAX_RETRIES = 30; const DEFAULT_BLOCK_MAX_RETRIES = 30;
type TinyRateLimitState = {
lastRequestAt?: number;
blockedUntil?: number;
};
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
const getPositiveNumberEnv = (name: string, fallback: number) => { const getPositiveNumberEnv = (name: string, fallback: number) => {
@@ -27,20 +22,17 @@ const getBlockMaxRetries = () => getPositiveNumberEnv('TINY_BLOCK_MAX_RETRIES',
const getLockDir = () => process.env.TINY_RATE_LIMIT_LOCK_DIR || DEFAULT_LOCK_DIR; const getLockDir = () => process.env.TINY_RATE_LIMIT_LOCK_DIR || DEFAULT_LOCK_DIR;
const getStateFile = () => process.env.TINY_RATE_LIMIT_STATE_FILE || DEFAULT_STATE_FILE; const getStateFile = () => process.env.TINY_RATE_LIMIT_STATE_FILE || DEFAULT_STATE_FILE;
const readState = (): TinyRateLimitState => { const readLastRequestAt = () => {
try { try {
const parsed = JSON.parse(fs.readFileSync(getStateFile(), 'utf-8')); const parsed = JSON.parse(fs.readFileSync(getStateFile(), 'utf-8'));
return { return Number(parsed.lastRequestAt || 0);
lastRequestAt: Number(parsed.lastRequestAt || 0),
blockedUntil: Number(parsed.blockedUntil || 0)
};
} catch { } catch {
return {}; return 0;
} }
}; };
const writeState = (state: TinyRateLimitState) => { const writeLastRequestAt = (timestamp: number) => {
fs.writeFileSync(getStateFile(), JSON.stringify(state, null, 2)); fs.writeFileSync(getStateFile(), JSON.stringify({ lastRequestAt: timestamp }, null, 2));
}; };
const removeStaleLock = (lockDir: string) => { const removeStaleLock = (lockDir: string) => {
@@ -75,53 +67,21 @@ const releaseLock = (lockDir: string) => {
const waitForTinySlot = async () => { const waitForTinySlot = async () => {
const minIntervalMs = getMinIntervalMs(); const minIntervalMs = getMinIntervalMs();
if (!minIntervalMs) return;
while (true) {
const lockDir = await acquireLock(); const lockDir = await acquireLock();
let waitMs = 0;
let reason = 'next Tiny API request';
try { try {
const state = readState(); const lastRequestAt = readLastRequestAt();
const now = Date.now(); const elapsed = Date.now() - lastRequestAt;
const lastRequestAt = Number(state.lastRequestAt || 0); const waitMs = Math.max(0, minIntervalMs - elapsed);
const blockedUntil = Number(state.blockedUntil || 0);
const intervalWaitMs = minIntervalMs ? Math.max(0, minIntervalMs - (now - lastRequestAt)) : 0;
const blockWaitMs = Math.max(0, blockedUntil - now);
if (blockWaitMs > intervalWaitMs) { if (waitMs > 0) {
waitMs = blockWaitMs; console.log(`[Tiny Rate Limit] Waiting ${waitMs}ms before next Tiny API request.`);
reason = 'Tiny API block cooldown';
} else {
waitMs = intervalWaitMs;
}
if (!waitMs) {
writeState({
...state,
lastRequestAt: now,
blockedUntil: blockWaitMs ? blockedUntil : 0
});
return;
}
} finally {
releaseLock(lockDir);
}
console.log(`[Tiny Rate Limit] Waiting ${waitMs}ms before ${reason}.`);
await sleep(waitMs); await sleep(waitMs);
} }
};
const pauseAllTinyRequests = async (delayMs: number) => { writeLastRequestAt(Date.now());
const lockDir = await acquireLock();
try {
const state = readState();
writeState({
...state,
blockedUntil: Math.max(Number(state.blockedUntil || 0), Date.now() + delayMs)
});
} finally { } finally {
releaseLock(lockDir); releaseLock(lockDir);
} }
@@ -161,8 +121,7 @@ export const tinyPost = async (servicePhp: string, params: URLSearchParams) => {
} }
const delayMs = getBlockRetryDelayMs(); const delayMs = getBlockRetryDelayMs();
await pauseAllTinyRequests(delayMs); console.warn(`[Tiny Rate Limit] Tiny blocked ${servicePhp}. Waiting ${delayMs}ms before retry ${attempt}/${maxRetries}.`);
console.warn(`[Tiny Rate Limit] Tiny blocked ${servicePhp}. Pausing all Tiny API requests for ${delayMs}ms before retry ${attempt}/${maxRetries}.`);
await sleep(delayMs); await sleep(delayMs);
} }
}; };