Skip to content

Commit de6809f

Browse files
fix: skip retries on 4xx client errors
Client errors (400, 404, 405, etc.) will never succeed on retry. Only retry on transient failures like 5xx server errors and network errors. This avoids tripling wasted API calls on permanent failures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 6ca9221 commit de6809f

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/toggl-api.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ export class TogglAPI {
6767
`Server response: ${text}`
6868
);
6969
}
70-
throw new Error(`Toggl API error (${response.status}): ${text}`);
70+
const err = new Error(`Toggl API error (${response.status}): ${text}`);
71+
// Only retry on server errors (5xx); client errors (4xx) won't succeed on retry
72+
if (response.status >= 400 && response.status < 500) {
73+
throw Object.assign(err, { noRetry: true });
74+
}
75+
throw err;
7176
}
7277

7378
// Handle 204 No Content
@@ -76,9 +81,9 @@ export class TogglAPI {
7681
}
7782

7883
return await response.json() as T;
79-
} catch (error) {
80-
if (i === retries - 1) throw error;
81-
// Exponential backoff
84+
} catch (error: any) {
85+
if (error?.noRetry || i === retries - 1) throw error;
86+
// Exponential backoff for transient/network errors
8287
await new Promise(resolve => setTimeout(resolve, (i + 1) * 1000));
8388
}
8489
}

0 commit comments

Comments
 (0)