async function makeApiRequest(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
// Check rate limit headers
const remaining = parseInt(response.headers.get('X-RateLimit-Remaining'));
const resetTime = parseInt(response.headers.get('X-RateLimit-Reset'));
if (remaining < 10) {
console.warn(`Rate limit warning: ${remaining} requests remaining`);
}
// Handle rate limit exceeded
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After') || '60');
console.log(`Rate limited. Retrying after ${retryAfter} seconds...`);
if (attempt < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
}
return response;
}
throw new Error('Max retries exceeded');
}
// Usage
const response = await makeApiRequest(
'https://api.firma.dev/functions/v1/signing-request-api/templates',
{
headers: {
'Authorization': process.env.FIRMA_API_KEY,
'Content-Type': 'application/json'
}
}
);