fix: handle 429 rate-limit within timeout window

- Cap per-retry wait at 15s (Spotify's Retry-After can be very long)
- Increase global resolve timeout from 25s to 120s so retries can complete
- Log rate-limit waits for visibility

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-05-10 18:15:24 +02:00
1 parent bb52717c95
commit 3633b4c5fa
1 file changed
+4 -2
+4 -2
View File
@@ -153,7 +153,9 @@ async function _spApi(path, token) {
for (let attempt = 0; attempt < 4; attempt++) {
const r = await _fetchTimeout(url, { headers: { Authorization: `Bearer ${token}` } });
if (r.status === 429) {
const wait = (parseInt(r.headers.get('Retry-After') || '5', 10) + 1) * 1000;
const retryAfter = parseInt(r.headers.get('Retry-After') || '5', 10);
const wait = Math.min(retryAfter + 1, 15) * 1000; // cap at 15s per retry
console.log(`[spotify] 429 rate-limited, waiting ${wait / 1000}s (Retry-After: ${retryAfter}s)`);
await new Promise(res => setTimeout(res, wait));
continue;
}
@@ -305,7 +307,7 @@ app.post('/api/spotify/resolve', async (req, res) => {
console.log(`[spotify/resolve] ${type} ${id}`);
const timeout = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Zeitüberschreitung — Spotify API antwortet nicht (>25s)')), 25000)
setTimeout(() => reject(new Error('Zeitüberschreitung — Spotify API antwortet nicht (>120s)')), 120000)
);
const data = await Promise.race([_resolveSpotify(type, id), timeout]);
res.json(data);